From e3f5b4cf1a06d0c07476071972f733abd3ad09a5 Mon Sep 17 00:00:00 2001 From: Diego Pasqualin <dpasqualin@c3sl.ufpr.br> Date: Thu, 15 Aug 2013 10:52:42 -0300 Subject: [PATCH] le-pregao-712010: Using dkms to compile wireless module Signed-off-by: Diego Pasqualin <dpasqualin@c3sl.ufpr.br> --- .gitignore | 1 + le-pregao-712010/VERSAO | 2 +- le-pregao-712010/pacote/DEBIAN/control | 6 +- le-pregao-712010/pacote/DEBIAN/postinst | 32 +- le-pregao-712010/pacote/DEBIAN/postrm | 4 + le-pregao-712010/pacote/DEBIAN/prerm | 10 + le-pregao-712010/pacote/etc/init.d/pregao71 | 30 + le-pregao-712010/pacote/etc/rc1.d/S99pregao71 | 1 + le-pregao-712010/pacote/etc/rc2.d/S99pregao71 | 1 + le-pregao-712010/pacote/etc/rc3.d/S99pregao71 | 1 + le-pregao-712010/pacote/etc/rc4.d/S99pregao71 | 1 + le-pregao-712010/pacote/etc/rc5.d/S99pregao71 | 1 + .../LICENSE ralink-firmware.txt | 39 + .../lepregao712010-2.3.0.0-Alpha-v2/Makefile | 227 + .../README_STA | 456 ++ .../RT3060STA.dat | 58 + .../RT3060STACard.dat | 19 + .../chips/.rt30xx.o.cmd | 813 ++ .../chips/.rt35xx.o.cmd | 813 ++ .../chips/rt30xx.c | 547 ++ .../chips/rt35xx.c | 249 + .../common/.action.o.cmd | 814 ++ .../common/.ba_action.o.cmd | 813 ++ .../common/.cmm_aes.o.cmd | 813 ++ .../common/.cmm_asic.o.cmd | 813 ++ .../common/.cmm_cfg.o.cmd | 813 ++ .../common/.cmm_cmd.o.cmd | 813 ++ .../common/.cmm_data.o.cmd | 813 ++ .../common/.cmm_data_pci.o.cmd | 813 ++ .../common/.cmm_info.o.cmd | 813 ++ .../common/.cmm_mac_pci.o.cmd | 813 ++ .../common/.cmm_profile.o.cmd | 813 ++ .../common/.cmm_sanity.o.cmd | 813 ++ .../common/.cmm_sync.o.cmd | 813 ++ .../common/.cmm_tkip.o.cmd | 813 ++ .../common/.cmm_wep.o.cmd | 813 ++ .../common/.cmm_wpa.o.cmd | 813 ++ .../common/.crypt_aes.o.cmd | 813 ++ .../common/.crypt_arc4.o.cmd | 813 ++ .../common/.crypt_hmac.o.cmd | 813 ++ .../common/.crypt_md5.o.cmd | 813 ++ .../common/.crypt_sha2.o.cmd | 813 ++ .../common/.dfs.o.cmd | 813 ++ .../common/.ee_efuse.o.cmd | 813 ++ .../common/.ee_prom.o.cmd | 813 ++ .../common/.eeprom.o.cmd | 813 ++ .../common/.mlme.o.cmd | 813 ++ .../common/.rt_channel.o.cmd | 813 ++ .../common/.rt_rf.o.cmd | 813 ++ .../common/.rtmp_init.o.cmd | 813 ++ .../common/.rtmp_init_inf.o.cmd | 813 ++ .../common/.rtmp_mcu.o.cmd | 814 ++ .../common/.rtmp_timer.o.cmd | 813 ++ .../common/.spectrum.o.cmd | 814 ++ .../common/action.c | 1134 +++ .../common/ba_action.c | 1798 ++++ .../common/br_ftph.c | 212 + .../common/client_wds.c | 204 + .../common/cmm_aes.c | 1145 +++ .../common/cmm_asic.c | 3346 ++++++++ .../common/cmm_cfg.c | 434 + .../common/cmm_cmd.c | 178 + .../common/cmm_data.c | 2950 +++++++ .../common/cmm_data_pci.c | 1616 ++++ .../common/cmm_info.c | 3995 +++++++++ .../common/cmm_mac_pci.c | 1680 ++++ .../common/cmm_profile.c | 2309 ++++++ .../common/cmm_sanity.c | 1660 ++++ .../common/cmm_sync.c | 841 ++ .../common/cmm_tkip.c | 1015 +++ .../common/cmm_wep.c | 342 + .../common/cmm_wpa.c | 4081 +++++++++ .../common/crypt_aes.c | 3504 ++++++++ .../common/crypt_arc4.c | 152 + .../common/crypt_hmac.c | 142 + .../common/crypt_md5.c | 756 ++ .../common/crypt_sha2.c | 715 ++ .../common/dfs.c | 483 ++ .../common/ee_efuse.c | 1590 ++++ .../common/ee_prom.c | 272 + .../common/eeprom.c | 104 + .../common/mlme.c | 6766 +++++++++++++++ .../common/netif_block.c | 146 + .../common/rt2860.bin | Bin 0 -> 8192 bytes .../common/rt_channel.c | 1353 +++ .../common/rt_rf.c | 216 + .../common/rtmp_init.c | 4225 ++++++++++ .../common/rtmp_init_inf.c | 374 + .../common/rtmp_mcu.c | 570 ++ .../common/rtmp_timer.c | 334 + .../common/spectrum.c | 2298 ++++++ .../common/vr_ikans.c | 335 + .../lepregao712010-2.3.0.0-Alpha-v2/dkms.conf | 11 + .../include/action.h | 68 + .../include/ap.h | 533 ++ .../include/cfg80211.h | 265 + .../include/cfg80211extr.h | 156 + .../include/chip/mac_pci.h | 465 ++ .../include/chip/rt2860.h | 67 + .../include/chip/rt30xx.h | 49 + .../include/chip/rt35xx.h | 65 + .../include/chip/rtmp_mac.h | 2304 ++++++ .../include/chip/rtmp_phy.h | 636 ++ .../include/chlist.h | 118 + .../include/client_wds.h | 68 + .../include/client_wds_cmm.h | 55 + .../include/crypt_aes.h | 235 + .../include/crypt_arc4.h | 71 + .../include/crypt_hmac.h | 90 + .../include/crypt_md5.h | 90 + .../include/crypt_sha2.h | 158 + .../include/dfs.h | 138 + .../include/dot11i_wpa.h | 298 + .../include/eeprom.h | 82 + .../include/firmware.h | 558 ++ .../include/iface/rtmp_pci.h | 99 + .../include/link_list.h | 134 + .../include/mlme.h | 1360 +++ .../include/netif_block.h | 57 + .../include/oid.h | 1294 +++ .../include/os/rt_linux.h | 1113 +++ .../include/rt_ate.h | 348 + .../include/rt_config.h | 156 + .../include/rtmp.h | 7270 +++++++++++++++++ .../include/rtmp_chip.h | 356 + .../include/rtmp_cmd.h | 98 + .../include/rtmp_def.h | 1743 ++++ .../include/rtmp_dot11.h | 146 + .../include/rtmp_iface.h | 85 + .../include/rtmp_mcu.h | 55 + .../include/rtmp_os.h | 104 + .../include/rtmp_timer.h | 165 + .../include/rtmp_type.h | 167 + .../include/spectrum.h | 239 + .../include/spectrum_def.h | 260 + .../include/vr_ikans.h | 72 + .../include/wpa.h | 497 ++ .../include/wpa_cmm.h | 244 + .../iwpriv_usage.txt | 303 + .../os/linux/.pci_main_dev.o.cmd | 813 ++ .../os/linux/.rt3562sta.ko.cmd | 1 + .../os/linux/.rt3562sta.mod.o.cmd | 442 + .../os/linux/.rt3562sta.o.cmd | 1 + .../os/linux/.rt_linux.o.cmd | 813 ++ .../os/linux/.rt_main_dev.o.cmd | 813 ++ .../os/linux/.rt_pci_rbus.o.cmd | 813 ++ .../os/linux/.rt_profile.o.cmd | 813 ++ .../os/linux/.rt_rbus_pci_util.o.cmd | 813 ++ .../os/linux/.sta_ioctl.o.cmd | 813 ++ .../os/linux/Makefile.4 | 171 + .../os/linux/Makefile.6 | 206 + .../os/linux/cfg80211.c | 2814 +++++++ .../os/linux/config.mk | 386 + .../os/linux/pci_main_dev.c | 1212 +++ .../os/linux/pci_main_dev.o | Bin 0 -> 8392 bytes .../os/linux/rt3562sta.ko | Bin 0 -> 1008207 bytes .../os/linux/rt3562sta.mod.c | 149 + .../os/linux/rt3562sta.mod.o | Bin 0 -> 9660 bytes .../os/linux/rt3562sta.o | Bin 0 -> 999220 bytes .../os/linux/rt_ate.c | 6992 ++++++++++++++++ .../os/linux/rt_linux.c | 1941 +++++ .../os/linux/rt_linux.o | Bin 0 -> 21561 bytes .../os/linux/rt_main_dev.c | 1004 +++ .../os/linux/rt_main_dev.o | Bin 0 -> 8520 bytes .../os/linux/rt_pci_rbus.c | 928 +++ .../os/linux/rt_pci_rbus.o | Bin 0 -> 7739 bytes .../os/linux/rt_profile.c | 102 + .../os/linux/rt_profile.o | Bin 0 -> 2109 bytes .../os/linux/rt_rbus_pci_util.c | 248 + .../os/linux/rt_rbus_pci_util.o | Bin 0 -> 3896 bytes .../os/linux/sta_ioctl.c | 6143 ++++++++++++++ .../os/linux/sta_ioctl.o | Bin 0 -> 79930 bytes .../os/linux/vr_ikans.c | 352 + .../readme.txt | 23 + .../sta/.assoc.o.cmd | 813 ++ .../sta/.auth.o.cmd | 813 ++ .../sta/.auth_rsp.o.cmd | 813 ++ .../sta/.connect.o.cmd | 813 ++ .../sta/.rtmp_data.o.cmd | 813 ++ .../sta/.sanity.o.cmd | 813 ++ .../sta/.sta_cfg.o.cmd | 813 ++ .../sta/.sync.o.cmd | 813 ++ .../sta/.wpa.o.cmd | 813 ++ .../sta/assoc.c | 1784 ++++ .../sta/auth.c | 515 ++ .../sta/auth_rsp.c | 160 + .../sta/connect.c | 2909 +++++++ .../lepregao712010-2.3.0.0-Alpha-v2/sta/dls.c | 2235 +++++ .../sta/rtmp_ckipmic.c | 578 ++ .../sta/rtmp_data.c | 3062 +++++++ .../sta/sanity.c | 335 + .../sta/sta_cfg.c | 1679 ++++ .../sta/sync.c | 2286 ++++++ .../lepregao712010-2.3.0.0-Alpha-v2/sta/wpa.c | 447 + .../sta_ate_iwpriv_usage.txt | 445 + .../tools/Makefile | 6 + .../tools/bin2h | Bin 0 -> 14741 bytes .../tools/bin2h.c | 151 + 198 files changed, 159072 insertions(+), 6 deletions(-) create mode 100644 .gitignore mode change 100644 => 100755 le-pregao-712010/pacote/DEBIAN/control create mode 100755 le-pregao-712010/pacote/etc/init.d/pregao71 create mode 120000 le-pregao-712010/pacote/etc/rc1.d/S99pregao71 create mode 120000 le-pregao-712010/pacote/etc/rc2.d/S99pregao71 create mode 120000 le-pregao-712010/pacote/etc/rc3.d/S99pregao71 create mode 120000 le-pregao-712010/pacote/etc/rc4.d/S99pregao71 create mode 120000 le-pregao-712010/pacote/etc/rc5.d/S99pregao71 create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/LICENSE ralink-firmware.txt create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/Makefile create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/README_STA create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/RT3060STA.dat create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/RT3060STACard.dat create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/.rt30xx.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/.rt35xx.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/rt30xx.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/rt35xx.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.action.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ba_action.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_aes.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_asic.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_cfg.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_cmd.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_data.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_data_pci.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_info.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_mac_pci.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_profile.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_sanity.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_sync.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_tkip.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_wep.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_wpa.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_aes.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_arc4.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_hmac.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_md5.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_sha2.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.dfs.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ee_efuse.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ee_prom.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.eeprom.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.mlme.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rt_channel.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rt_rf.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_init.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_init_inf.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_mcu.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_timer.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.spectrum.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/action.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ba_action.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/br_ftph.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/client_wds.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_aes.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_asic.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_cfg.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_cmd.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_data.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_data_pci.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_info.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_mac_pci.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_profile.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_sanity.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_sync.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_tkip.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_wep.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_wpa.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_aes.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_arc4.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_hmac.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_md5.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_sha2.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/dfs.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ee_efuse.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ee_prom.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/eeprom.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/mlme.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/netif_block.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt2860.bin create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt_channel.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt_rf.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_init.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_init_inf.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_mcu.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_timer.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/spectrum.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/vr_ikans.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/dkms.conf create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/action.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/ap.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/cfg80211.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/cfg80211extr.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/mac_pci.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt2860.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt30xx.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt35xx.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rtmp_mac.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rtmp_phy.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chlist.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/client_wds.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/client_wds_cmm.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_aes.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_arc4.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_hmac.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_md5.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_sha2.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/dfs.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/dot11i_wpa.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/eeprom.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/firmware.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/iface/rtmp_pci.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/link_list.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/mlme.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/netif_block.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/oid.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/os/rt_linux.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rt_ate.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rt_config.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_chip.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_cmd.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_def.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_dot11.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_iface.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_mcu.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_os.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_timer.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_type.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/spectrum.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/spectrum_def.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/vr_ikans.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/wpa.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/wpa_cmm.h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/iwpriv_usage.txt create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.pci_main_dev.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.ko.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.mod.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_linux.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_main_dev.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_pci_rbus.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_profile.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_rbus_pci_util.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.sta_ioctl.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/Makefile.4 create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/Makefile.6 create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/cfg80211.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/config.mk create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/pci_main_dev.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/pci_main_dev.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.ko create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.mod.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.mod.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_ate.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_linux.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_linux.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_main_dev.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_main_dev.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_pci_rbus.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_pci_rbus.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_profile.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_profile.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_rbus_pci_util.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_rbus_pci_util.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/sta_ioctl.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/sta_ioctl.o create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/vr_ikans.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/readme.txt create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.assoc.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.auth.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.auth_rsp.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.connect.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.rtmp_data.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sanity.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sta_cfg.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sync.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.wpa.o.cmd create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/assoc.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/auth.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/auth_rsp.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/connect.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/dls.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/rtmp_ckipmic.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/rtmp_data.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sanity.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sta_cfg.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sync.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/wpa.c create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta_ate_iwpriv_usage.txt create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/Makefile create mode 100755 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/bin2h create mode 100644 le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/bin2h.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..f0c5bdabe --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*deb diff --git a/le-pregao-712010/VERSAO b/le-pregao-712010/VERSAO index 3eefcb9dd..af0b7ddbf 100644 --- a/le-pregao-712010/VERSAO +++ b/le-pregao-712010/VERSAO @@ -1 +1 @@ -1.0.0 +1.0.6 diff --git a/le-pregao-712010/pacote/DEBIAN/control b/le-pregao-712010/pacote/DEBIAN/control old mode 100644 new mode 100755 index 0a10dec69..c8d794e54 --- a/le-pregao-712010/pacote/DEBIAN/control +++ b/le-pregao-712010/pacote/DEBIAN/control @@ -1,8 +1,8 @@ Package: le-pregao-712010 -Version: 0.0.12 +Priority: important +Version: Maintainer: LE Maintainer <le-maintainer@c3sl.ufpr.br> Architecture: i386 Section: main -Priority: important -Depends: linux-image-2.6.32-29-generic-pae +Pre-Depends: dkms Description: Especific changes to make LE4.0 work on "Pregao 71/2010" diff --git a/le-pregao-712010/pacote/DEBIAN/postinst b/le-pregao-712010/pacote/DEBIAN/postinst index 4db0fa2dc..0aab522e7 100755 --- a/le-pregao-712010/pacote/DEBIAN/postinst +++ b/le-pregao-712010/pacote/DEBIAN/postinst @@ -20,8 +20,35 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. -echo "Running depmod..." -/sbin/depmod -a 2.6.32-29-generic-pae +PACKAGE_NAME="lepregao712010" +PACKAGE_VERSION="2.3.0.0-Alpha-v2" +KERNEL_VERSION="$(uname -r)" + +# Put conflicting modules at /etc/modprobe.d/blacklist.conf +echo "# replaced by rt3562sta" >> /etc/modprobe.d/blacklist.conf +echo "blacklist rt2800pci" >> /etc/modprobe.d/blacklist.conf + +# Function to set selections +setselections() { + selfile=$1 + # Wait until it works + while ! dpkg --set-selections < ${selfile} &>/dev/null ; do + sleep 1 + done + rm -f ${selfile} +} + +# Hold Kernel +sels=$(mktemp) +auxfile=$(mktemp) +dpkg --get-selections \* > ${sels} +awk '{if (($1 ~ /^linux-image-generic-pae/) || ($1 ~ /^linux-headers-generic-pae/)) {print $1"\thold"} else { print $0} }' ${sels} >\ + ${auxfile} +rm -f ${sels} +setselections ${auxfile} & disown + +echo "Building module for all installed kernels using dkms..." +/usr/lib/dkms/common.postinst $PACKAGE_NAME $PACKAGE_VERSION echo "Loading module rt3562sta" modprobe rt3562sta || true @@ -33,4 +60,5 @@ echo "Restarting network interfaces" aa-complain cupsd /etc/init.d/cups start +echo $KERNEL_VERSION > /var/log/le-oldkernelversion exit 0 diff --git a/le-pregao-712010/pacote/DEBIAN/postrm b/le-pregao-712010/pacote/DEBIAN/postrm index c5da2e30d..4c96da1b0 100755 --- a/le-pregao-712010/pacote/DEBIAN/postrm +++ b/le-pregao-712010/pacote/DEBIAN/postrm @@ -20,6 +20,10 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. +# removing conflicting modules from blacklist +sed -i s/'# replaced by rt3562sta'/''/ /etc/modprobe.d/blacklist.conf +sed -i s/'blacklist rt2800pci'/''/ /etc/modprobe.d/blacklist.conf + echo "Running depmod..." /sbin/depmod -a 2.6.32-29-generic-pae diff --git a/le-pregao-712010/pacote/DEBIAN/prerm b/le-pregao-712010/pacote/DEBIAN/prerm index 9b8ae296c..3646e39ff 100755 --- a/le-pregao-712010/pacote/DEBIAN/prerm +++ b/le-pregao-712010/pacote/DEBIAN/prerm @@ -20,7 +20,17 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, # USA. +PACKAGE_NAME="lepregao712010" +PACKAGE_VERSION="2.3.0.0-Alpha-v2" + echo "Unloading module rt3562sta" rmmod rt3562sta || true +if test "$1" != "upgrade"; then + dkms uninstall -m $PACKAGE_NAME -v $PACKAGE_VERSION +fi + +echo "Restarting network interfaces" +/etc/init.d/networking restart || true + exit 0 diff --git a/le-pregao-712010/pacote/etc/init.d/pregao71 b/le-pregao-712010/pacote/etc/init.d/pregao71 new file mode 100755 index 000000000..4917acdda --- /dev/null +++ b/le-pregao-712010/pacote/etc/init.d/pregao71 @@ -0,0 +1,30 @@ +#! /bin/sh + + +if dpkg -l le-pregao-712010 | grep -q ^ii; then + if test -f "/var/log/le-oldkernelversion"; then + # if we know old kernel version + old_version=$(cat "/var/log/le-oldkernelversion") + actual_version=$(uname -r) + if test ${old_version} != ${actual_version}; then + # if kernel was upgraded + /usr/lib/dkms/common.postinst lepregao712010 2.3.0.0-Alpha-v2 + fi + else + # if we don't know old kernel version + /usr/lib/dkms/common.postinst lepregao712010 2.3.0.0-Alpha-v2 + fi + # set kernel version for next upgrade + uname -r > "/var/log/le-oldkernelversion" + + # if modprobe fail, will not have problem, this mean that + # the driver is already on kernel (I hope) + #test -n "`cat /proc/modules | grep rt3562sta`" && rmmod rt3562sta + modprobe rt3562sta +fi + +# Verify if the kernel is in hold state +if test $(dpkg --get-selections | grep linux-image-generic-pae | tr -s [:blank:] | cut -f2) != "hold"; then + echo "linux-image-generic-pae hold" | dpkg --set-selections + echo "linux-headers-generic-pae hold" | dpkg --set-selections +fi diff --git a/le-pregao-712010/pacote/etc/rc1.d/S99pregao71 b/le-pregao-712010/pacote/etc/rc1.d/S99pregao71 new file mode 120000 index 000000000..28afa8977 --- /dev/null +++ b/le-pregao-712010/pacote/etc/rc1.d/S99pregao71 @@ -0,0 +1 @@ +../init.d/pregao71 \ No newline at end of file diff --git a/le-pregao-712010/pacote/etc/rc2.d/S99pregao71 b/le-pregao-712010/pacote/etc/rc2.d/S99pregao71 new file mode 120000 index 000000000..28afa8977 --- /dev/null +++ b/le-pregao-712010/pacote/etc/rc2.d/S99pregao71 @@ -0,0 +1 @@ +../init.d/pregao71 \ No newline at end of file diff --git a/le-pregao-712010/pacote/etc/rc3.d/S99pregao71 b/le-pregao-712010/pacote/etc/rc3.d/S99pregao71 new file mode 120000 index 000000000..28afa8977 --- /dev/null +++ b/le-pregao-712010/pacote/etc/rc3.d/S99pregao71 @@ -0,0 +1 @@ +../init.d/pregao71 \ No newline at end of file diff --git a/le-pregao-712010/pacote/etc/rc4.d/S99pregao71 b/le-pregao-712010/pacote/etc/rc4.d/S99pregao71 new file mode 120000 index 000000000..28afa8977 --- /dev/null +++ b/le-pregao-712010/pacote/etc/rc4.d/S99pregao71 @@ -0,0 +1 @@ +../init.d/pregao71 \ No newline at end of file diff --git a/le-pregao-712010/pacote/etc/rc5.d/S99pregao71 b/le-pregao-712010/pacote/etc/rc5.d/S99pregao71 new file mode 120000 index 000000000..28afa8977 --- /dev/null +++ b/le-pregao-712010/pacote/etc/rc5.d/S99pregao71 @@ -0,0 +1 @@ +../init.d/pregao71 \ No newline at end of file diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/LICENSE ralink-firmware.txt b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/LICENSE ralink-firmware.txt new file mode 100644 index 000000000..679560278 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/LICENSE ralink-firmware.txt @@ -0,0 +1,39 @@ +Copyright (c) 2009, Ralink Technology Corporation +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of Ralink Technology Corporation nor the names of its + suppliers may be used to endorse or promote products derived from this + software without specific prior written permission. +* No reverse engineering, decompilation, or disassembly of this software + is permitted. + +Limited patent license. Ralink Technology Corporation grants a world-wide, +royalty-free, non-exclusive license under patents it now or hereafter +owns or controls to make, have made, use, import, offer to sell and +sell ("Utilize") this software, but solely to the extent that any +such patent is necessary to Utilize the software alone, or in +combination with an operating system licensed under an approved Open +Source license as listed by the Open Source Initiative at +http://opensource.org/licenses. The patent license shall not apply to +any other combinations which include this software. No hardware per +se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/Makefile b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/Makefile new file mode 100644 index 000000000..7b459f245 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/Makefile @@ -0,0 +1,227 @@ +RT28xx_MODE = STA +TARGET = LINUX +CHIPSET = 3562 +OSABL = NO + +#RT28xx_DIR = home directory of RT28xx source code +RT28xx_DIR = $(shell pwd) +RTMP_SRC_DIR = $(RT28xx_DIR)/RT$(CHIPSET) + +#PLATFORM: Target platform +PLATFORM = PC +#PLATFORM = 5VT +#PLATFORM = IKANOS_V160 +#PLATFORM = IKANOS_V180 +#PLATFORM = SIGMA +#PLATFORM = SIGMA_8622 +#PLATFORM = INIC +#PLATFORM = STAR +#PLATFORM = IXP +#PLATFORM = INF_TWINPASS +#PLATFORM = INF_DANUBE +#PLATFORM = INF_AR9 +#PLATFORM = BRCM_6358 +#PLATFORM = INF_AMAZON_SE +#PLATFORM = CAVM_OCTEON +#PLATFORM = CMPC +#PLATFORM = RALINK_2880 +#PLATFORM = RALINK_3052 +#PLATFORM = SMDK +#PLATFORM = KODAK_DC +#PLATFORM = DM6446 +#PLATFORM = FREESCALE8377 + + +ifeq ($(TARGET),LINUX) +MAKE = make +endif + +ifeq ($(PLATFORM),5VT) +LINUX_SRC = /project/stable/5vt/ralink-2860-sdk/linux-2.6.17 +CROSS_COMPILE = /opt/crosstool/uClibc_v5te_le_gcc_4_1_1/bin/arm-linux- +endif + +ifeq ($(PLATFORM),IKANOS_V160) +LINUX_SRC = /home/sample/projects/LX_2618_RG_5_3_00r4_SRC/linux-2.6.18 +CROSS_COMPILE = mips-linux- +endif + +ifeq ($(PLATFORM),IKANOS_V180) +LINUX_SRC = /home/sample/projects/LX_BSP_VX180_5_4_0r1_ALPHA_26DEC07/linux-2.6.18 +CROSS_COMPILE = mips-linux- +endif + +ifeq ($(PLATFORM),SIGMA) +LINUX_SRC = /root/sigma/smp86xx_kernel_source_2.7.172.0/linux-2.6.15 +CROSS_COMPILE = /root/sigma/smp86xx_toolchain_2.7.172.0/build_mipsel_nofpu/staging_dir/bin/mipsel-linux- +endif + +ifeq ($(PLATFORM),SIGMA_8622) +LINUX_SRC = /home/snowpin/armutils_2.5.120.1/build_arm/linux-2.4.22-em86xx +CROSS_COMPILE = /home/snowpin/armutils_2.5.120.1/toolchain/bin/arm-elf- +CROSS_COMPILE_INCLUDE = /home/snowpin/armutils_2.5.120.1/toolchain/lib/gcc-lib/arm-elf/2.95.3 +endif + +ifeq ($(PLATFORM),STAR) +LINUX_SRC = /opt/star/kernel/linux-2.4.27-star +CROSS_COMPILE = /opt/star/tools/arm-linux/bin/arm-linux- +endif + +ifeq ($(PLATFORM), RALINK_2880) +LINUX_SRC = /project/stable/RT288x/RT288x_SDK/source/linux-2.4.x +CROSS_COMPILE = /opt/buildroot-gdb/bin/mipsel-linux- +endif + +ifeq ($(PLATFORM),RALINK_3052) +LINUX_SRC = /home/peter/ap_soc/SDK_3_3_0_0/RT288x_SDK/source/linux-2.6.21.x +CROSS_COMPILE = /opt/buildroot-gcc342/bin/mipsel-linux-uclibc- +endif + +ifeq ($(PLATFORM),FREESCALE8377) +LINUX_SRC = /opt/ltib-mpc8377_rds-20090309/rpm/BUILD/linux-2.6.25 +CROSS_COMPILE = /opt/freescale/usr/local/gcc-4.2.187-eglibc-2.5.187/powerpc-linux-gnu/bin/powerpc-linux-gnu- +endif + +ifeq ($(PLATFORM),PC) +# Linux 2.6 +LINUX_SRC = /lib/modules/$(shell uname -r)/build +# Linux 2.4 Change to your local setting +#LINUX_SRC = /usr/src/linux-2.4 +LINUX_SRC_MODULE = /lib/modules/$(shell uname -r)/kernel/drivers/net/wireless/ +CROSS_COMPILE = +endif + +ifeq ($(PLATFORM),IXP) +LINUX_SRC = /project/stable/Gmtek/snapgear-uclibc/linux-2.6.x +CROSS_COMPILE = arm-linux- +endif + +ifeq ($(PLATFORM),INF_TWINPASS) +# Linux 2.6 +#LINUX_SRC = /lib/modules/$(shell uname -r)/build +# Linux 2.4 Change to your local setting +LINUX_SRC = /project/stable/twinpass/release/2.0.1/source/kernel/opensource/linux-2.4.31/ +CROSS_COMPILE = mips-linux- +endif + +ifeq ($(PLATFORM),INF_DANUBE) +LINUX_SRC = /opt/danube/sdk/linux-2.6.16.x +CROSS_COMPILE = mips-linux- +ROOTDIR = /opt/danube/sdk +export ROOTDIR +endif + +ifeq ($(PLATFORM),INF_AR9) +LINUX_SRC = /root/ar9/xR9_BSP1.2.2.0/source/kernel/opensource/linux-2.6.20/ +CROSS_COMPILE = /root/ar9/ifx-lxdb26-1.0.2/gcc-3.4.4/toolchain-mips/bin/ +endif + +ifeq ($(PLATFORM),BRCM_6358) +LINUX_SRC = +CROSS_COMPILE = +endif + +ifeq ($(PLATFORM),INF_AMAZON_SE) +# Linux 2.6 +#LINUX_SRC = /lib/modules/$(shell uname -r)/build +# Linux 2.4 Change to your local setting +LINUX_SRC = /backup/ifx/3.6.2.2/source/kernel/opensource/linux-2.4.31 +#CROSS_COMPILE = mips-linux- +#LINUX_SRC = /project/Infineon/3.6.2.2/source/kernel/opensource/linux-2.4.31 +CROSS_COMPILE = /opt/uclibc-toolchain/ifx-lxdb-1-2-3-external/gcc-3.3.6/toolchain-mips/R0208V35/mips-linux-uclibc/bin/ +endif + +ifeq ($(PLATFORM),ST) +LINUX_SRC = /opt/STM/STLinux-2.2/devkit/sources/kernel/linux0039 +CROSS_COMPILE = /opt/STM/STLinux-2.2/devkit/sh4/bin/sh4-linux- +ARCH := sh +export ARCH +endif + +ifeq ($(PLATFORM),CAVM_OCTEON) +OCTEON_ROOT = /usr/local/Cavium_Networks/OCTEON-SDK +LINUX_SRC = $(OCTEON_ROOT)/linux/kernel_2.6/linux +CROSS_COMPILE = mips64-octeon-linux-gnu- +endif + +ifeq ($(PLATFORM),CMPC) +LINUX_SRC = /opt/fvt_11N_SDK_0807/fvt131x_SDK_11n/linux-2.6.17 +CROSS_COMPILE = +endif + +ifeq ($(PLATFORM),SMDK) +LINUX_SRC = /home/bhushan/itcenter/may28/linux-2.6-samsung +CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- +endif + +ifeq ($(PLATFORM),KODAK_DC) +SKD_SRC = C:/SigmaTel/DC1250_SDK_v1-9/sdk +CROSS_COMPILE = $(cc) +endif + +ifeq ($(PLATFORM),DM6446) +LINUX_SRC = /home/fonchi/work/soc/ti-davinci +endif + +export OSABL RT28xx_DIR RT28xx_MODE LINUX_SRC CROSS_COMPILE CROSS_COMPILE_INCLUDE PLATFORM RELEASE CHIPSET RTMP_SRC_DIR LINUX_SRC_MODULE TARGET + +all: build_tools $(TARGET) + + +build_tools: + $(MAKE) -C tools + $(RT28xx_DIR)/tools/bin2h + +test: + $(MAKE) -C tools test + +LINUX: +ifneq (,$(findstring 2.4,$(LINUX_SRC))) + + cp -f os/linux/Makefile.4 $(RT28xx_DIR)/os/linux/Makefile + $(MAKE) -C $(RT28xx_DIR)/os/linux/ + +# cp -f $(RT28xx_DIR)/os/linux/rt$(CHIPSET)sta.o /tftpboot +else + cp -f os/linux/Makefile.6 $(RT28xx_DIR)/os/linux/Makefile +ifeq ($(PLATFORM),DM6446) + $(MAKE) ARCH=arm CROSS_COMPILE=arm_v5t_le- -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules +else +ifeq ($(PLATFORM),FREESCALE8377) + $(MAKE) ARCH=powerpc CROSS_COMPILE=$(CROSS_COMPILE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules +else + $(MAKE) -C $(LINUX_SRC) SUBDIRS=$(RT28xx_DIR)/os/linux modules +endif +endif + +endif + +clean: +ifeq ($(TARGET), LINUX) +ifneq (,$(findstring 2.4,$(LINUX_SRC))) + cp -f os/linux/Makefile.4 os/linux/Makefile +else + cp -f os/linux/Makefile.6 os/linux/Makefile +endif + $(MAKE) -C os/linux clean + rm -rf os/linux/Makefile +endif + +uninstall: +ifeq ($(TARGET), LINUX) +ifneq (,$(findstring 2.4,$(LINUX_SRC))) + $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 uninstall +else + $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 uninstall +endif +endif + +install: +ifeq ($(TARGET), LINUX) +ifneq (,$(findstring 2.4,$(LINUX_SRC))) + $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.4 install +else + $(MAKE) -C $(RT28xx_DIR)/os/linux -f Makefile.6 install +endif +endif + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/README_STA b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/README_STA new file mode 100644 index 000000000..8897402f5 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/README_STA @@ -0,0 +1,456 @@ +* README +* +* Ralink Tech Inc. +* +* http://www.ralinktech.com +* + +======================================================================= +ModelName: +=========== +RT2860 Wireless Lan Linux Driver + + +======================================================================= +Driver lName: +============= +rt3562sta.o/rt3562sta.ko + + +======================================================================= +Supporting Kernel: +=================== +linux kernel 2.4 and 2.6 series. +Tested in Redhat 7.3 or later. + + +======================================================================= +Ralink Hardware: +=================== +Ralink 802.11n Wireless LAN Card. + + +======================================================================= +Description: +============= +This is a linux device driver for Ralink RT3562/RT3062/RT2860 PCI ABGN WLAN Card. + + +======================================================================= +Contents: +============= +Makefile : Makefile +*.c : c files +*.h : header files + + +======================================================================= +Features: +========== + This driver implements basic IEEE802.11. Infrastructure and adhoc mode with + open or shared or WPA-PSK or WPA2-PSK authentication method. + NONE, WEP, TKIP and AES encryption. + + +======================================================================= +Build Instructions: +==================== + +1> $tar -xvzf RT3562_Linux_STA_x.x.x.x.tgz + go to "./RT3562_Linux_STA_x.x.x.x" directory. + +2> In Makefile + set the "MODE = STA" in Makefile and chose the TARGET to Linux by set "TARGET = LINUX" + define the linux kernel source include file path LINUX_SRC + modify to meet your need. + +3> In os/linux/config.mk + define the GCC and LD of the target machine + define the compiler flags CFLAGS + modify to meet your need. + ** Build for being controlled by NetworkManager or wpa_supplicant wext functions + Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y'. + => #>cd wpa_supplicant-x.x + => #>./wpa_supplicant -Dwext -ira0 -c wpa_supplicant.conf -d + ** Build for being controlled by WpaSupplicant with Ralink Driver + Please set 'HAS_WPA_SUPPLICANT=y' and 'HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n'. + => #>cd wpa_supplicant-0.5.7 + => #>./wpa_supplicant -Dralink -ira0 -c wpa_supplicant.conf -d + +4> $make + # compile driver source code + # To fix "error: too few arguments to function ��iwe_stream_add_event" + => $patch -i os/linux/sta_ioctl.c.patch os/linux/sta_ioctl.c + +5> $cp RT2860STA.dat /etc/Wireless/RT2860STA/RT2860STA.dat + +6> load driver, go to "os/linux/" directory. + #[kernel 2.4] + # $/sbin/insmod rt3562sta.o + # $/sbin/ifconfig ra0 inet YOUR_IP up + + #[kernel 2.6] + # $/sbin/insmod rt3562sta.ko + # $/sbin/ifconfig ra0 inet YOUR_IP up + +7> unload driver + $/sbin/ifconfig ra0 down + $/sbin/rmmod rt3562sta + +======================================================================= +CONFIGURATION: +==================== +RT2860 driver can be configured via following interfaces, +i.e. (i)"iwconfig" command, (ii)"iwpriv" command, (iii) configuration file + +i) iwconfig comes with kernel. +ii) iwpriv usage, please refer to file "iwpriv_usage.txt" for details. +iii)modify configuration file "RT2860STA.dat" in /etc/Wireless/RT2860STA/RT2860STA.dat. + +Configuration File : RT2860STA.dat +--------------------------------------- +# Copy this file to /etc/Wireless/RT2860STA/RT2860STA.dat +# This file is a binary file and will be read on loading rt.o module. +# +# Use "vi RT2860STA.dat" to modify settings according to your need. +# +# 1.) set NetworkType to "Adhoc" for using Adhoc-mode, otherwise using Infrastructure +# 2.) set Channel to "0" for auto-select on Infrastructure mode +# 3.) set SSID for connecting to your Accss-point. +# 4.) AuthMode can be "WEPAUTO", "OPEN", "SHARED", "WPAPSK", "WPA2PSK", "WPANONE" +# 5.) EncrypType can be "NONE", "WEP", "TKIP", "AES" +# for more information refer to the Readme file. +# +#The word of "Default" must not be removed +Default +CountryRegion=5 +CountryRegionABand=7 +CountryCode= +SSID=Dennis2860AP +NetworkType=Infra +WirelessMode=9 +Channel=0 +BeaconPeriod=100 +TxPower=100 +BGProtection=0 +TxPreamble=0 +RTSThreshold=2347 +FragThreshold=2346 +TxBurst=1 +WmmCapable=0 +AckPolicy=0;0;0;0 +AuthMode=OPEN +EncrypType=NONE +WPAPSK= +DefaultKeyID=1 +Key1Type=0 +Key1Str= +Key2Type=0 +Key2Str= +Key3Type=0 +Key3Str= +Key4Type=0 +Key4Str= +PSMode=CAM +FastRoaming=0 +RoamThreshold=70 +HT_RDG=1 +HT_EXTCHA=0 +HT_OpMode=1 +HT_MpduDensity=4 +HT_BW=1 +HT_AutoBA=1 +HT_BADecline=0 +HT_AMSDU=0 +HT_BAWinSize=64 +HT_GI=1 +HT_MCS=33 +HT_MIMOPSMode=3 +IEEE80211H=0 +TGnWifiTest=0 +WirelessEvent=0 +CarrierDetect=0 + +----------------------------------------------- +*NOTE: + WMM parameters + WmmCapable Set it as 1 to turn on WMM Qos support + AckPolicy1~4 Ack policy which support normal Ack or no Ack + (AC_BK, AC_BE, AC_VI, AC_VO) + + All WMM parameters do not support iwpriv command but ��WmmCapable����, + please store all parameter to RT2860STA.dat, and restart driver. + +----------------------------------------------- +syntax is 'Param'='Value' and describes below. + +@> CountryRegion=value + value + 0: use 1 ~ 11 Channel + 1: use 1 ~ 13 Channel + 2: use 10 ~ 11 Channel + 3: use 10 ~ 13 Channel + 4: use 14 Channel + 5: use 1 ~ 14 Channel + 6: use 3 ~ 9 Channel + 7: use 5 ~ 13 Channel + 31: use 1 ~ 14 Channel (ch1-11:active scan, ch12-14 passive scan) + +@> CountryRegionABand=value + value + 0: use 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 Channel + 1: use 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 Channel + 2: use 36, 40, 44, 48, 52, 56, 60, 64 Channel + 3: use 52, 56, 60, 64, 149, 153, 157, 161 Channel + 4: use 149, 153, 157, 161, 165 Channel + 5: use 149, 153, 157, 161 Channel + 6: use 36, 40, 44, 48 Channel + 7: use 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 Channel + 8: use 52, 56, 60, 64 Channel + 9: use 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 Channel + 10: use 36, 40, 44, 48, 149, 153, 157, 161, 165 Channel + 11: use 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 Channel + +@> CountryCode=value + value + AG, AR, AW, AU, AT, BS, BB, BM, BR, BE, BG, CA, KY, CL, CN, CO, CR, CY, CZ, DK, DO, EC, SV, FI, FR, DE, + GR, GU, GT, HT, HN, HK, HU, IS, IN, ID, IE, IL, IT, JP, JO, LV, LI, LT, LU, MY, MT, MA, MX, NL, NZ, NO, + PE, PT, PL, RO, RU, SA, CS, SG, SK, SI, ZA, KR, ES, SE, CH, TW, TR, GB, UA, AE, US, VE + "" => using default setting: 2.4 G - ch 1~11; 5G - ch 52~64, 100~140, 149~165 + +@> SSID=value + value + 0~z, 1~32 ascii characters. + +@> WirelessMode=value + value + 0: legacy 11b/g mixed + 1: legacy 11B only + 2: legacy 11A only //Not support in RfIcType=1(id=RFIC_5225) and RfIcType=2(id=RFIC_5325) + 3: legacy 11a/b/g mixed //Not support in RfIcType=1(id=RFIC_5225) and RfIcType=2(id=RFIC_5325) + 4: legacy 11G only + 5: 11ABGN mixed + 6: 11N only + 7: 11GN mixed + 8: 11AN mixed + 9: 11BGN mixed + 10: 11AGN mixed + +@> Channel=value + value + depends on CountryRegion or CountryRegionABand + +@> BGProtection=value + value + 0: Auto + 1: Always on + 2: Always off + +@> TxPreamble=value + value + 0:Preamble Long + 1:Preamble Short + 2:Auto + +@> RTSThreshold=value + value + 1~2347 + +@> FragThreshold=value + value + 256~2346 + +@> TxBurst=value + value + 0: Disable + 1: Enable + +@> NetworkType=value + value + Infra: infrastructure mode + Adhoc: adhoc mode + +@> AuthMode=value + value + OPEN For open system + SHARED For shared key system + WEPAUTO Auto switch between OPEN and SHARED + WPAPSK For WPA pre-shared key (Infra) + WPA2PSK For WPA2 pre-shared key (Infra) + WPANONE For WPA pre-shared key (Adhoc) + WPA Use WPA-Supplicant + WPA2 Use WPA-Supplicant + +@> EncrypType=value + value + NONE For AuthMode=OPEN + WEP For AuthMode=OPEN or AuthMode=SHARED + TKIP For AuthMode=WPAPSK or WPA2PSK + AES For AuthMode=WPAPSK or WPA2PSK + +@> DefaultKeyID=value + value + 1~4 + +@> Key1=value + Key2=value + Key3=value + Key4=value + value + 10 or 26 hexadecimal characters eg: 012345678 + 5 or 13 ascii characters eg: passd + (usage : "iwpriv" only) + +@> Key1Type=vaule + Key2Type=value + Key3Type=vaule + Key4Type=vaule + value + 0 hexadecimal type + 1 assic type + (usage : reading profile only) + +@> Key1Str=value + Key2Str=value + Key3Str=vaule + Key4Str=vaule + value + 10 or 26 characters (key type=0) + 5 or 13 characters (key type=1) + (usage : reading profile only) + +@> WPAPSK=value + value + 8~63 ASCII or + 64 HEX characters + +@> WmmCapable=value + value + 0: Disable WMM + 1: Enable WMM + +@> PSMode=value + value + CAM Constantly Awake Mode + Max_PSP Max Power Savings + Fast_PSP Power Save Mode + +@> FastRoaming=value + value + 0 Disabled + 1 Enabled + +@> RoamThreshold=value + value + Positive Interger(dBm) + +@> HT_RDG=value + value + 0 Disabled + 1 Enabled + +@> HT_EXTCHA=value (Extended Channel Switch Announcement) + value + 0 Below + 1 Above + +@> HT_OpMode=value + value + 0 HT mixed format + 1 HT greenfield format + +@> HT_MpduDensity=value + value (based on 802.11n D2.0) + 0: no restriction + 1: 1/4 �gs + 2: 1/2 �gs + 3: 1 �gs + 4: 2 �gs + 5: 4 �gs + 6: 8 �gs + 7: 16 �gs + +@> HT_BW=value + value + 0 20MHz + 1 40MHz + +@> HT_AutoBA=value + value + 0 Disabled + 1 Enabled + +@> HT_BADecline + value + 0 Disabled + 1 Enabled <Reject BA request from AP> + +@> HT_AMSDU=value + value + 0 Disabled + 1 Enabled + +@> HT_BAWinSize=value + value + 1 ~ 64 + +@> HT_GI=value + value + 0 long GI + 1 short GI + +@> HT_MCS=value + value + 0 ~ 15 + 33: auto + +@> HT_MIMOPSMode=value + value (based on 802.11n D2.0) + 0 Static SM Power Save Mode + 1 Dynamic SM Power Save Mode + 2 Reserved + 3 SM enabled + (not fully support yet) + +@> IEEE80211H=value + value + 0 Disabled + 1 Enabled + +@> TGnWifiTest=value + value + 0 Disabled + 1 Enabled + +@> WirelessEvent=value + value + 0 Disabled + 1 Enabled <send custom wireless event> + +@> CarrierDetect=value + value + 0 Disabled + 1 Enabled + +MORE INFORMATION +================================================================================= +If you want for rt2860 driver to auto-load at boot time: +A) choose ra0 for first RT2860 WLAN card, ra1 for second RT2860 WLAN card, etc. + +B) create(edit) 'ifcfg-ra0' file in /etc/sysconfig/network-scripts/, + edit( or add the line) in /etc/modules.conf: + alias ra0 rt2860sta + +C) edit(create) the file /etc/sysconfig/network-scripts/ifcfg-ra0 + DEVICE='ra0' + ONBOOT='yes' + + +NOTE: + if you use dhcp, add this line too . + BOOTPROTO='dhcp' + +*D) To ease the Default Gateway setting, + add the line + GATEWAY=x.x.x.x + in /etc/sysconfig/network diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/RT3060STA.dat b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/RT3060STA.dat new file mode 100644 index 000000000..9489c2969 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/RT3060STA.dat @@ -0,0 +1,58 @@ +#The word of "Default" must not be removed +Default +CountryRegion=5 +CountryRegionABand=7 +CountryCode= +ChannelGeography=1 +SSID=Dennis2860AP +NetworkType=Infra +WirelessMode=5 +Channel=0 +BeaconPeriod=100 +TxPower=100 +BGProtection=0 +TxPreamble=0 +RTSThreshold=2347 +FragThreshold=2346 +TxBurst=1 +PktAggregate=0 +WmmCapable=1 +AckPolicy=0;0;0;0 +AuthMode=OPEN +EncrypType=NONE +WPAPSK= +DefaultKeyID=1 +Key1Type=0 +Key1Str= +Key2Type=0 +Key2Str= +Key3Type=0 +Key3Str= +Key4Type=0 +Key4Str= +PSMode=CAM +AutoRoaming=0 +RoamThreshold=70 +APSDCapable=0 +APSDAC=0;0;0;0 +HT_RDG=1 +HT_EXTCHA=0 +HT_OpMode=0 +HT_MpduDensity=4 +HT_BW=1 +HT_AutoBA=1 +HT_BADecline=0 +HT_AMSDU=0 +HT_BAWinSize=64 +HT_GI=1 +HT_MCS=33 +HT_MIMOPSMode=3 +HT_DisallowTKIP=1 +HT_STBC=0 +IEEE80211H=0 +TGnWifiTest=0 +WirelessEvent=0 +CarrierDetect=0 +AntDiversity=0 +BeaconLostTime=4 +PSP_XLINK_MODE=0 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/RT3060STACard.dat b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/RT3060STACard.dat new file mode 100644 index 000000000..c3f9d7499 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/RT3060STACard.dat @@ -0,0 +1,19 @@ +#The word of "Default" must not be removed, maximum 32 cards, 00 ~ 31 +Default + +#CARDID, MAC, CARDTYPE +SELECT=CARDTYPE + +00CARDID=/etc/Wireless/RT2860STA/RT2860STA1.dat +01CARDID=/etc/Wireless/RT2860STA/RT2860STA2.dat +02CARDID=/etc/Wireless/RT2860STA/RT2860STA3.dat + +00MAC00:0E:2E:C3:D0:48=/etc/Wireless/RT2860STA/RT2860STA1.dat +01MAC00:40:F4:FF:AA:40=/etc/Wireless/RT2860STA/RT2860STA2.dat +02MAC00:0C:43:10:11:5C=/etc/Wireless/RT2860STA/RT2860STA3.dat + +00CARDTYPEbgn=/etc/Wireless/RT2860STA/RT2860STA1.dat +01CARDTYPEbgn=/etc/Wireless/RT2860STA/RT2860STA2.dat +02CARDTYPEabgn=/etc/Wireless/RT2860STA/RT2860STA3.dat + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/.rt30xx.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/.rt30xx.o.cmd new file mode 100644 index 000000000..764434eab --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/.rt30xx.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt30xx.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/.rt30xx.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt30xx)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/.tmp_rt30xx.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt30xx.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt30xx.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt30xx.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt30xx.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt30xx.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt30xx.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/.rt35xx.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/.rt35xx.o.cmd new file mode 100644 index 000000000..71910316e --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/.rt35xx.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt35xx.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/.rt35xx.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt35xx)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/.tmp_rt35xx.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt35xx.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt35xx.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt35xx.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt35xx.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt35xx.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt35xx.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/rt30xx.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/rt30xx.c new file mode 100644 index 000000000..3ffe626fa --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/rt30xx.c @@ -0,0 +1,547 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt2880.c + + Abstract: + Specific funcitons and variables for RT30xx. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + + +#ifdef RT30xx + + +#ifndef RTMP_RF_RW_SUPPORT +#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip" +#endif // RTMP_RF_RW_SUPPORT // + +#include "rt_config.h" + + +// +// RF register initialization set +// +REG_PAIR RT30xx_RFRegTable[] = { + {RF_R04, 0x40}, + {RF_R05, 0x03}, + {RF_R06, 0x02}, + {RF_R07, 0x70}, + {RF_R09, 0x0F}, + {RF_R10, 0x41}, + {RF_R11, 0x21}, + {RF_R12, 0x7B}, + {RF_R14, 0x90}, + {RF_R15, 0x58}, + {RF_R16, 0xB3}, + {RF_R17, 0x92}, + {RF_R18, 0x2C}, + {RF_R19, 0x02}, + {RF_R20, 0xBA}, + {RF_R21, 0xDB}, + {RF_R24, 0x16}, + {RF_R25, 0x01}, + {RF_R29, 0x1F}, +}; + +UCHAR NUM_RF_REG_PARMS = (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR)); + + +// Antenna divesity use GPIO3 and EESK pin for control +// Antenna and EEPROM access are both using EESK pin, +// Therefor we should avoid accessing EESK at the same time +// Then restore antenna after EEPROM access +// The original name of this function is AsicSetRxAnt(), now change to +//VOID AsicSetRxAnt( +VOID RT30xxSetRxAnt( + IN PRTMP_ADAPTER pAd, + IN UCHAR Ant) +{ + UINT32 Value; +#ifdef RTMP_MAC_PCI + UINT32 x; +#endif // RTMP_MAC_PCI // + + if ((pAd->EepromAccess) || + (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) || + (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) || + (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) || + (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) + { + return; + } + + // the antenna selection is through firmware and MAC register(GPIO3) + if (Ant == 0) + { + // Main antenna +#ifdef RTMP_MAC_PCI + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + x |= (EESK); + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); +#else + AsicSendCommandToMcu(pAd, 0x73, 0xFF, 0x1, 0x0); +#endif // RTMP_MAC_PCI // + + RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value); + Value &= ~(0x0808); + RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value); + DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to main antenna\n")); + } + else + { + // Aux antenna +#ifdef RTMP_MAC_PCI + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + x &= ~(EESK); + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); +#else + AsicSendCommandToMcu(pAd, 0x73, 0xFF, 0x0, 0x0); +#endif // RTMP_MAC_PCI // + RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value); + Value &= ~(0x0808); + Value |= 0x08; + RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value); + DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to aux antenna\n")); + } +} + + +/* + ======================================================================== + + Routine Description: + For RF filter calibration purpose + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + ======================================================================== +*/ +VOID RTMPFilterCalibration( + IN PRTMP_ADAPTER pAd) +{ + UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue=0; + UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0; + UCHAR RF_R24_Value = 0; + + // Give bbp filter initial value + pAd->Mlme.CaliBW20RfR24 = 0x1F; + pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40 + + do + { + if (loop == 1) //BandWidth = 40 MHz + { + // Write 0x27 to RF_R24 to program filter + RT30xxReadRFRegister(pAd, RF_R24, (PUCHAR)(&RF_R24_Value)); + RF_R24_Value = (RF_R24_Value & 0xC0) | 0x27; // <bit 5>:tx_h20M<bit 5> and <bit 4:0>:tx_agc_fc<bit 4:0> + RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); + if (IS_RT3071(pAd) || IS_RT3572(pAd)|| IS_RT3390(pAd)) + FilterTarget = 0x15; + else + FilterTarget = 0x19; + + // when calibrate BW40, BBP mask must set to BW40. + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue&= (~0x18); + BBPValue|= (0x10); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + + // set to BW40 + RT30xxReadRFRegister(pAd, RF_R31, &value); + value |= 0x20; + RT30xxWriteRFRegister(pAd, RF_R31, value); + } + else //BandWidth = 20 MHz + { + // Write 0x07 to RF_R24 to program filter + RT30xxReadRFRegister(pAd, RF_R24, (PUCHAR)(&RF_R24_Value)); + RF_R24_Value = (RF_R24_Value & 0xC0) | 0x07; // <bit 5>:tx_h20M<bit 5> and <bit 4:0>:tx_agc_fc<bit 4:0> + RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); + if (IS_RT3071(pAd) || IS_RT3572(pAd)|| IS_RT3390(pAd)) + FilterTarget = 0x13; + else + FilterTarget = 0x16; + + // set to BW20 + RT30xxReadRFRegister(pAd, RF_R31, &value); + value &= (~0x20); + RT30xxWriteRFRegister(pAd, RF_R31, value); + } + + // Write 0x01 to RF_R22 to enable baseband loopback mode + RT30xxReadRFRegister(pAd, RF_R22, &value); + value |= 0x01; + RT30xxWriteRFRegister(pAd, RF_R22, value); + + // Write 0x00 to BBP_R24 to set power & frequency of passband test tone + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0); + + do + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + // Write 0x90 to BBP_R25 to transmit test tone + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90); + + RTMPusecDelay(1000); + // Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0] + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value); + R55x = value & 0xFF; + + } while ((ReTry++ < 100) && (R55x == 0)); + + // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06); + + while(TRUE) + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + // Write 0x90 to BBP_R25 to transmit test tone + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90); + + //We need to wait for calibration + RTMPusecDelay(1000); + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value); + value &= 0xFF; + if ((R55x - value) < FilterTarget) + { + RF_R24_Value ++; + } + else if ((R55x - value) == FilterTarget) + { + RF_R24_Value ++; + count ++; + } + else + { + break; + } + + // prevent infinite loop cause driver hang. + if (loopcnt++ > 100) + { + DBGPRINT(RT_DEBUG_ERROR, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt)); + break; + } + + // Write RF_R24 to program filter + RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); + } + + if (count > 0) + { + RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0)); + } + + // Store for future usage + if (loopcnt < 100) + { + if (loop++ == 0) + { + //BandWidth = 20 MHz + pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value; + } + else + { + //BandWidth = 40 MHz + pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value; + break; + } + } + else + break; + + RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value); + + // reset count + count = 0; + } while(TRUE); + + // + // Set back to initial state + // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0); + + RT30xxReadRFRegister(pAd, RF_R22, &value); + value &= ~(0x01); + RT30xxWriteRFRegister(pAd, RF_R22, value); + + // set BBP back to BW20 + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue&= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24)); +} + + +// add by johnli, RF power sequence setup +/* + ========================================================================== + Description: + + Load RF normal operation-mode setup + + ========================================================================== + */ +VOID RT30xxLoadRFNormalModeSetup( + IN PRTMP_ADAPTER pAd) +{ + UCHAR RFValue; + + // RX0_PD & TX0_PD, RF R1 register Bit 2 & Bit 3 to 0 and RF_BLOCK_en,RX1_PD & TX1_PD, Bit0, Bit 4 & Bit5 to 1 + RT30xxReadRFRegister(pAd, RF_R01, &RFValue); + RFValue = (RFValue & (~0x0C)) | 0x31; + RT30xxWriteRFRegister(pAd, RF_R01, RFValue); + + // TX_LO2_en, RF R15 register Bit 3 to 0 + RT30xxReadRFRegister(pAd, RF_R15, &RFValue); + RFValue &= (~0x08); + RT30xxWriteRFRegister(pAd, RF_R15, RFValue); + + /* move to NICInitRT30xxRFRegisters + // TX_LO1_en, RF R17 register Bit 3 to 0 + RT30xxReadRFRegister(pAd, RF_R17, &RFValue); + RFValue &= (~0x08); + // to fix rx long range issue + if (((pAd->MACVersion & 0xffff) >= 0x0211) && (pAd->NicConfig2.field.ExternalLNAForG == 0)) + { + RFValue |= 0x20; + } + // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h + if (pAd->TxMixerGain24G >= 2) + { + RFValue &= (~0x7); // clean bit [2:0] + RFValue |= pAd->TxMixerGain24G; + } + RT30xxWriteRFRegister(pAd, RF_R17, RFValue); + */ + + // RX_LO1_en, RF R20 register Bit 3 to 0 + RT30xxReadRFRegister(pAd, RF_R20, &RFValue); + RFValue &= (~0x08); + RT30xxWriteRFRegister(pAd, RF_R20, RFValue); + + // RX_LO2_en, RF R21 register Bit 3 to 0 + RT30xxReadRFRegister(pAd, RF_R21, &RFValue); + RFValue &= (~0x08); + RT30xxWriteRFRegister(pAd, RF_R21, RFValue); + + /* add by johnli, reset RF_R27 when interface down & up to fix throughput problem*/ + // LDORF_VC, RF R27 register Bit 2 to 0 + RT30xxReadRFRegister(pAd, RF_R27, &RFValue); + // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F). + // Raising RF voltage is no longer needed for RT3070(F) + if (IS_RT3090(pAd)) // RT309x and RT3071/72 + { + if ((pAd->MACVersion & 0xffff) < 0x0211) + RFValue = (RFValue & (~0x77)) | 0x3; + else + RFValue = (RFValue & (~0x77)); + RT30xxWriteRFRegister(pAd, RF_R27, RFValue); + } + /* end johnli */ +} + +/* + ========================================================================== + Description: + + Load RF sleep-mode setup + + ========================================================================== + */ +VOID RT30xxLoadRFSleepModeSetup( + IN PRTMP_ADAPTER pAd) +{ + UCHAR RFValue; + UINT32 MACValue; + +#ifdef RT35xx + if(IS_RT3572(pAd)) + RT30xxWriteRFRegister(pAd, RF_R08, 0x00); +#endif // RT35xx // + + if(!IS_RT3572(pAd)) + { + // RF_BLOCK_en. RF R1 register Bit 0 to 0 + RT30xxReadRFRegister(pAd, RF_R01, &RFValue); + RFValue &= (~0x01); + RT30xxWriteRFRegister(pAd, RF_R01, RFValue); + + // VCO_IC, RF R7 register Bit 4 & Bit 5 to 0 + RT30xxReadRFRegister(pAd, RF_R07, &RFValue); + RFValue &= (~0x30); + RT30xxWriteRFRegister(pAd, RF_R07, RFValue); + + // Idoh, RF R9 register Bit 1, Bit 2 & Bit 3 to 0 + RT30xxReadRFRegister(pAd, RF_R09, &RFValue); + RFValue &= (~0x0E); + RT30xxWriteRFRegister(pAd, RF_R09, RFValue); + + // RX_CTB_en, RF R21 register Bit 7 to 0 + RT30xxReadRFRegister(pAd, RF_R21, &RFValue); + RFValue &= (~0x80); + RT30xxWriteRFRegister(pAd, RF_R21, RFValue); + } + + if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72 + IS_RT3572(pAd) || + (IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) + { + if (!IS_RT3572(pAd)) + { + RT30xxReadRFRegister(pAd, RF_R27, &RFValue); + RFValue |= 0x77; + RT30xxWriteRFRegister(pAd, RF_R27, RFValue); + } + + RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue); + MACValue |= 0x1D000000; + RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue); + } +} + +/* + ========================================================================== + Description: + + Reverse RF sleep-mode setup + + ========================================================================== + */ +VOID RT30xxReverseRFSleepModeSetup( + IN PRTMP_ADAPTER pAd) +{ + UCHAR RFValue; + UINT32 MACValue; + + if(!IS_RT3572(pAd)) + { + // RF_BLOCK_en, RF R1 register Bit 0 to 1 + RT30xxReadRFRegister(pAd, RF_R01, &RFValue); + RFValue |= 0x01; + RT30xxWriteRFRegister(pAd, RF_R01, RFValue); + + // VCO_IC, RF R7 register Bit 4 & Bit 5 to 1 + RT30xxReadRFRegister(pAd, RF_R07, &RFValue); + RFValue |= 0x30; + RT30xxWriteRFRegister(pAd, RF_R07, RFValue); + + // Idoh, RF R9 register Bit 1, Bit 2 & Bit 3 to 1 + RT30xxReadRFRegister(pAd, RF_R09, &RFValue); + RFValue |= 0x0E; + RT30xxWriteRFRegister(pAd, RF_R09, RFValue); + + // RX_CTB_en, RF R21 register Bit 7 to 1 + RT30xxReadRFRegister(pAd, RF_R21, &RFValue); + RFValue |= 0x80; + RT30xxWriteRFRegister(pAd, RF_R21, RFValue); + } + + if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72 + IS_RT3572(pAd) || + IS_RT3390(pAd) || + (IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201))) + { + if (!IS_RT3572(pAd)) + { + RT30xxReadRFRegister(pAd, RF_R27, &RFValue); + if ((pAd->MACVersion & 0xffff) < 0x0211) + RFValue = (RFValue & (~0x77)) | 0x3; + else + RFValue = (RFValue & (~0x77)); + RT30xxWriteRFRegister(pAd, RF_R27, RFValue); + } + + // RT3071 version E has fixed this issue + if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211)) + { + // patch tx EVM issue temporarily + RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue); + MACValue = ((MACValue & 0xE0FFFFFF) | 0x0D000000); + RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue); + } + else + { + RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue); + MACValue = ((MACValue & 0xE0FFFFFF) | 0x01000000); + RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue); + } + } + + if(IS_RT3572(pAd)) + RT30xxWriteRFRegister(pAd, RF_R08, 0x80); +} +// end johnli + +VOID RT30xxHaltAction( + IN PRTMP_ADAPTER pAd) +{ + UINT32 TxPinCfg = 0x00050F0F; + + // + // Turn off LNA_PE or TRSW_POL + // + if (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd)) + { + if ((IS_RT3071(pAd) || IS_RT3572(pAd)) +#ifdef RTMP_EFUSE_SUPPORT + && (pAd->bUseEfuse) +#endif // RTMP_EFUSE_SUPPORT // + ) + { + TxPinCfg &= 0xFFFBF0F0; // bit18 off + } + else + { + TxPinCfg &= 0xFFFFF0F0; + } +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT30xxWriteRFRegister(pAd, RF_R08, (UCHAR)0x00); +#endif // RT35xx // + + RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg); + } +} + +#endif // RT30xx // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/rt35xx.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/rt35xx.c new file mode 100644 index 000000000..f40a9e854 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/chips/rt35xx.c @@ -0,0 +1,249 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt35xx.c + + Abstract: + Specific funcitons and variables for + RT3062 + RT3562 + RT3572 + RT3592 + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#ifdef RT35xx + +#include "rt_config.h" + + +#ifndef RTMP_RF_RW_SUPPORT +#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip" +#endif // RTMP_RF_RW_SUPPORT // + +REG_PAIR RF3572_RFRegTable[] = { + {RF_R00, 0x70}, + {RF_R01, 0x81}, + {RF_R02, 0xF1}, + {RF_R03, 0x02}, + {RF_R04, 0x4C}, + {RF_R05, 0x05}, + {RF_R06, 0x4A}, + {RF_R07, 0xD8}, +// {RF_R08, 0x80}, + {RF_R09, 0xC3}, + + {RF_R10, 0xF1}, + {RF_R11, 0xB9}, + {RF_R12, 0x70}, + {RF_R13, 0x65}, + {RF_R14, 0xA0}, + {RF_R15, 0x53}, + {RF_R16, 0x4C}, + {RF_R17, 0x23}, + {RF_R18, 0xAC}, + {RF_R19, 0x93}, + + {RF_R20, 0xB3}, + {RF_R21, 0xD0}, + {RF_R22, 0x00}, + {RF_R23, 0x3C}, + {RF_R24, 0x16}, + {RF_R25, 0x15}, + {RF_R26, 0x85}, + {RF_R27, 0x00}, + {RF_R28, 0x00}, + {RF_R29, 0x9B}, + {RF_R30, 0x09}, + {RF_R31, 0x10}, +}; + +#define NUM_RF_3572REG_PARMS (sizeof(RF3572_RFRegTable) / sizeof(REG_PAIR)) + +VOID NICInitRT3572RFRegisters(IN PRTMP_ADAPTER pAd) +{ + INT i; + UINT32 RfReg = 0; + UINT32 data; + + /* + Driver must read EEPROM to get RfIcType before initial RF registers + Initialize RF register to default value + Init RF calibration + Driver should toggle RF R30 bit7 before init RF registers + */ + RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg); + RfReg |= 0x80; + RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); + RTMPusecDelay(1000); + RfReg &= 0x7F; + RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg); + + /* Initialize RF register to default value */ + for (i = 0; i < NUM_RF_3572REG_PARMS; i++) + { + RT30xxWriteRFRegister(pAd, RF3572_RFRegTable[i].Register, RF3572_RFRegTable[i].Value); + } + + /* Driver should set RF R6 bit6 on before init RF registers */ + RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg); + RfReg |= 0x40; + RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg); + + /* init R31 */ + //RT30xxWriteRFRegister(pAd, RF_R31, 0x14); + + if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211)) + { + /* patch tx EVM issue temporarily */ + RTMP_IO_READ32(pAd, LDO_CFG0, &data); + data = ((data & 0xF0FFFFFF) | 0x0D000000); + RTMP_IO_WRITE32(pAd, LDO_CFG0, data); + } + else + { + // Patch for SRAM, increase voltage to 1.35V on core voltage and down to 1.2V after 1 msec + RTMP_IO_READ32(pAd, LDO_CFG0, &data); + data = ((data & 0xE0FFFFFF) | 0x0D000000); + RTMP_IO_WRITE32(pAd, LDO_CFG0, data); + + RTMPusecDelay(1000); + + data = ((data & 0xE0FFFFFF) | 0x01000000); + RTMP_IO_WRITE32(pAd, LDO_CFG0, data); + } + + /* patch LNA_PE_G1 (toggle GPIO_SWITCH) is not necessary for 3572 */ + /* + RTMP_IO_READ32(pAd, GPIO_SWITCH, &data); + data &= ~(0x20); + RTMP_IO_WRITE32(pAd, GPIO_SWITCH, data); + */ + + /* For RF filter Calibration */ + RTMPFilterCalibration(pAd); + + /* save R25, R26 for 2.4GHz */ + BBP_IO_READ8_BY_REG_ID(pAd, BBP_R25, &pAd->Bbp25); + BBP_IO_READ8_BY_REG_ID(pAd, BBP_R26, &pAd->Bbp26); + + /* set led open drain enable */ + RTMP_IO_READ32(pAd, OPT_14, &data); + data |= 0x01; + RTMP_IO_WRITE32(pAd, OPT_14, data); +} + + +/* + ========================================================================== + Description: + + Reverse RF sleep-mode setup + + ========================================================================== + */ +VOID RT3572ReverseRFSleepModeSetup( + IN PRTMP_ADAPTER pAd) +{ + UCHAR RFValue; + + // RF_BLOCK_en, RF R1 register Bit 0 to 1 + RT30xxReadRFRegister(pAd, RF_R01, &RFValue); + RFValue |= 0x01; + RT30xxWriteRFRegister(pAd, RF_R01, RFValue); + + // VCO_IC, RF R7 register Bit 4 & Bit 5 to 1 + RT30xxReadRFRegister(pAd, RF_R07, &RFValue); + RFValue |= 0x30; + RT30xxWriteRFRegister(pAd, RF_R07, RFValue); + + // Idoh, RF R9 register Bit 1, Bit 2 & Bit 3 to 1 + RT30xxReadRFRegister(pAd, RF_R09, &RFValue); + RFValue |= 0x0E; + RT30xxWriteRFRegister(pAd, RF_R09, RFValue); + + // RX_CTB_en, RF R21 register Bit 7 to 1 + RT30xxReadRFRegister(pAd, RF_R21, &RFValue); + RFValue |= 0x80; + RT30xxWriteRFRegister(pAd, RF_R21, RFValue); + RT30xxWriteRFRegister(pAd,RF_R08,(UCHAR)0x80); +} + +/* + ======================================================================== + + Routine Description: 3572/3592 R66 writing must select BBP_R27 + + Arguments: + + Return Value: + + IRQL = + + Note: + + ======================================================================== +*/ +NTSTATUS RT3572WriteBBPR66( + IN PRTMP_ADAPTER pAd, + IN UCHAR Value) +{ + NTSTATUS NStatus = STATUS_UNSUCCESSFUL; + UCHAR bbpData = 0; + + if (!IS_RT3572(pAd)) + return NStatus; + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R27, &bbpData); + + // R66 controls the gain of Rx0 + bbpData &= ~(0x60); //clear bit 5,6 + { +#ifdef RTMP_MAC_PCI + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R27, bbpData); +#endif // RTMP_MAC_PCI // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, Value); + } + + // R66 controls the gain of Rx1 + bbpData |= 0x20; // set bit 5 + { +#ifdef RTMP_MAC_PCI + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R27, bbpData); +#endif // RTMP_MAC_PCI // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, Value); + NStatus = STATUS_SUCCESS; + } + + return NStatus; +} + +#endif // RT35xx // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.action.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.action.o.cmd new file mode 100644 index 000000000..59eb9a434 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.action.o.cmd @@ -0,0 +1,814 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/action.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.action.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(action)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_action.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/action.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/action.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/action.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/action.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/action.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/action.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/action.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ba_action.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ba_action.o.cmd new file mode 100644 index 000000000..4c65724e9 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ba_action.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ba_action.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.ba_action.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ba_action)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_ba_action.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ba_action.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ba_action.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ba_action.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ba_action.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ba_action.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ba_action.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_aes.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_aes.o.cmd new file mode 100644 index 000000000..c57405db1 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_aes.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_aes.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_aes.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_aes)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_aes.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_aes.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_aes.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_aes.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_aes.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_aes.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_aes.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_asic.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_asic.o.cmd new file mode 100644 index 000000000..f755b3a9a --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_asic.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_asic.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_asic.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_asic)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_asic.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_asic.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_asic.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_asic.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_asic.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_asic.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_asic.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_cfg.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_cfg.o.cmd new file mode 100644 index 000000000..3041ec24b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_cfg.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cfg.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_cfg.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_cfg)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_cfg.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cfg.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cfg.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cfg.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cfg.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cfg.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cfg.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_cmd.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_cmd.o.cmd new file mode 100644 index 000000000..fc9c1d059 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_cmd.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cmd.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_cmd.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_cmd)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_cmd.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cmd.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cmd.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cmd.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cmd.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cmd.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cmd.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_data.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_data.o.cmd new file mode 100644 index 000000000..c729be2af --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_data.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_data.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_data)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_data.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_data_pci.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_data_pci.o.cmd new file mode 100644 index 000000000..2dabe0739 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_data_pci.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data_pci.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_data_pci.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_data_pci)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_data_pci.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data_pci.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data_pci.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data_pci.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data_pci.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data_pci.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data_pci.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_info.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_info.o.cmd new file mode 100644 index 000000000..029c251d0 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_info.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_info.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_info.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_info)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_info.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_info.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_info.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_info.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + $(wildcard include/config/apsta/mixed/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_info.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_info.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_info.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_mac_pci.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_mac_pci.o.cmd new file mode 100644 index 000000000..9335f7832 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_mac_pci.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_mac_pci.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_mac_pci.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_mac_pci)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_mac_pci.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_mac_pci.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_mac_pci.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_mac_pci.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_mac_pci.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_mac_pci.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_mac_pci.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_profile.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_profile.o.cmd new file mode 100644 index 000000000..a0ed19572 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_profile.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_profile.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_profile.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_profile)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_profile.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_profile.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_profile.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_profile.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_profile.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_profile.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_profile.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_sanity.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_sanity.o.cmd new file mode 100644 index 000000000..ded35629b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_sanity.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sanity.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_sanity.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_sanity)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_sanity.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sanity.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sanity.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sanity.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sanity.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sanity.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sanity.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_sync.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_sync.o.cmd new file mode 100644 index 000000000..a8104dc1c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_sync.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sync.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_sync.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_sync)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_sync.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sync.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sync.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sync.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sync.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sync.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sync.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_tkip.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_tkip.o.cmd new file mode 100644 index 000000000..e4955e127 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_tkip.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_tkip.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_tkip.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_tkip)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_tkip.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_tkip.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_tkip.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_tkip.c \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_tkip.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_tkip.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_tkip.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_wep.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_wep.o.cmd new file mode 100644 index 000000000..a3b89356d --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_wep.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wep.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_wep.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_wep)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_wep.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wep.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wep.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wep.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wep.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wep.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wep.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_wpa.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_wpa.o.cmd new file mode 100644 index 000000000..c8a27f975 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.cmm_wpa.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wpa.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.cmm_wpa.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(cmm_wpa)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_cmm_wpa.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wpa.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wpa.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wpa.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wpa.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wpa.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wpa.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_aes.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_aes.o.cmd new file mode 100644 index 000000000..37b6dd03a --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_aes.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_aes.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.crypt_aes.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(crypt_aes)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_crypt_aes.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_aes.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_aes.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_aes.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_aes.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_aes.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_aes.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_arc4.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_arc4.o.cmd new file mode 100644 index 000000000..0f19f6f51 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_arc4.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_arc4.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.crypt_arc4.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(crypt_arc4)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_crypt_arc4.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_arc4.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_arc4.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_arc4.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_arc4.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_arc4.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_arc4.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_hmac.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_hmac.o.cmd new file mode 100644 index 000000000..01d51befa --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_hmac.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_hmac.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.crypt_hmac.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(crypt_hmac)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_crypt_hmac.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_hmac.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_hmac.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_hmac.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_hmac.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_hmac.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_hmac.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_md5.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_md5.o.cmd new file mode 100644 index 000000000..55144963c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_md5.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_md5.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.crypt_md5.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(crypt_md5)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_crypt_md5.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_md5.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_md5.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_md5.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_md5.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_md5.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_md5.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_sha2.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_sha2.o.cmd new file mode 100644 index 000000000..5a78ad88e --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.crypt_sha2.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_sha2.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.crypt_sha2.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(crypt_sha2)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_crypt_sha2.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_sha2.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_sha2.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_sha2.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_sha2.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_sha2.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_sha2.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.dfs.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.dfs.o.cmd new file mode 100644 index 000000000..86e6db728 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.dfs.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/dfs.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.dfs.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(dfs)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_dfs.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/dfs.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/dfs.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/dfs.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/dfs.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/dfs.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/dfs.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ee_efuse.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ee_efuse.o.cmd new file mode 100644 index 000000000..008d43cf5 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ee_efuse.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_efuse.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.ee_efuse.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ee_efuse)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_ee_efuse.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_efuse.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_efuse.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_efuse.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_efuse.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_efuse.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_efuse.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ee_prom.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ee_prom.o.cmd new file mode 100644 index 000000000..67ce5d089 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.ee_prom.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_prom.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.ee_prom.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(ee_prom)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_ee_prom.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_prom.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_prom.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_prom.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_prom.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_prom.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_prom.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.eeprom.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.eeprom.o.cmd new file mode 100644 index 000000000..c183de901 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.eeprom.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/eeprom.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.eeprom.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(eeprom)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_eeprom.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/eeprom.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/eeprom.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/eeprom.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/eeprom.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/eeprom.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/eeprom.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.mlme.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.mlme.o.cmd new file mode 100644 index 000000000..9905e8d5c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.mlme.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/mlme.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.mlme.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(mlme)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_mlme.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/mlme.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/mlme.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/mlme.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/mlme.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/mlme.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/mlme.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rt_channel.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rt_channel.o.cmd new file mode 100644 index 000000000..da8c81137 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rt_channel.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_channel.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.rt_channel.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt_channel)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_rt_channel.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_channel.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_channel.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_channel.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_channel.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_channel.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_channel.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rt_rf.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rt_rf.o.cmd new file mode 100644 index 000000000..b464627ef --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rt_rf.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_rf.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.rt_rf.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt_rf)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_rt_rf.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_rf.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_rf.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_rf.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_rf.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_rf.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_rf.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_init.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_init.o.cmd new file mode 100644 index 000000000..a33597039 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_init.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.rtmp_init.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rtmp_init)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_rtmp_init.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init.c \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_init_inf.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_init_inf.o.cmd new file mode 100644 index 000000000..055fa2aaa --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_init_inf.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init_inf.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.rtmp_init_inf.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rtmp_init_inf)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_rtmp_init_inf.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init_inf.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init_inf.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init_inf.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init_inf.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init_inf.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init_inf.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_mcu.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_mcu.o.cmd new file mode 100644 index 000000000..d0b20c2fc --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_mcu.o.cmd @@ -0,0 +1,814 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_mcu.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.rtmp_mcu.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rtmp_mcu)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_rtmp_mcu.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_mcu.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_mcu.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_mcu.c \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/firmware.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_mcu.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_mcu.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_mcu.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_timer.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_timer.o.cmd new file mode 100644 index 000000000..a31addbfc --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.rtmp_timer.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_timer.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.rtmp_timer.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rtmp_timer)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_rtmp_timer.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_timer.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_timer.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_timer.c \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_timer.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_timer.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_timer.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.spectrum.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.spectrum.o.cmd new file mode 100644 index 000000000..bcfc7098d --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/.spectrum.o.cmd @@ -0,0 +1,814 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/spectrum.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.spectrum.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(spectrum)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/.tmp_spectrum.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/spectrum.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/spectrum.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/spectrum.c \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/action.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/spectrum.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/spectrum.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/spectrum.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/action.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/action.c new file mode 100644 index 000000000..fecf10b85 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/action.c @@ -0,0 +1,1134 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + action.c + + Abstract: + Handle association related requests either from WSTA or from local MLME + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Jan Lee 2006 created for rt2860 + */ + +#include "rt_config.h" +#include "action.h" + +extern UCHAR ZeroSsid[32]; + +static VOID ReservedAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + + +/* + ========================================================================== + Description: + association state machine init, including state transition and timer init + Parameters: + S - pointer to the association state machine + Note: + The state machine looks like the following + + ASSOC_IDLE + MT2_MLME_DISASSOC_REQ mlme_disassoc_req_action + MT2_PEER_DISASSOC_REQ peer_disassoc_action + MT2_PEER_ASSOC_REQ drop + MT2_PEER_REASSOC_REQ drop + MT2_CLS3ERR cls3err_action + ========================================================================== + */ +VOID ActionStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + OUT STATE_MACHINE_FUNC Trans[]) +{ + StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_ACT_STATE, MAX_ACT_MSG, (STATE_MACHINE_FUNC)Drop, ACT_IDLE, ACT_MACHINE_BASE); + + StateMachineSetAction(S, ACT_IDLE, MT2_PEER_SPECTRUM_CATE, (STATE_MACHINE_FUNC)PeerSpectrumAction); + StateMachineSetAction(S, ACT_IDLE, MT2_PEER_QOS_CATE, (STATE_MACHINE_FUNC)PeerQOSAction); + + StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)ReservedAction); +#ifdef QOS_DLS_SUPPORT + StateMachineSetAction(S, ACT_IDLE, MT2_PEER_DLS_CATE, (STATE_MACHINE_FUNC)PeerDLSAction); +#endif // QOS_DLS_SUPPORT // + +#ifdef DOT11_N_SUPPORT + StateMachineSetAction(S, ACT_IDLE, MT2_PEER_BA_CATE, (STATE_MACHINE_FUNC)PeerBAAction); + StateMachineSetAction(S, ACT_IDLE, MT2_PEER_HT_CATE, (STATE_MACHINE_FUNC)PeerHTAction); + StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ADD_BA_CATE, (STATE_MACHINE_FUNC)MlmeADDBAAction); + StateMachineSetAction(S, ACT_IDLE, MT2_MLME_ORI_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction); + StateMachineSetAction(S, ACT_IDLE, MT2_MLME_REC_DELBA_CATE, (STATE_MACHINE_FUNC)MlmeDELBAAction); +#endif // DOT11_N_SUPPORT // + + StateMachineSetAction(S, ACT_IDLE, MT2_PEER_PUBLIC_CATE, (STATE_MACHINE_FUNC)PeerPublicAction); + StateMachineSetAction(S, ACT_IDLE, MT2_PEER_RM_CATE, (STATE_MACHINE_FUNC)PeerRMAction); + + StateMachineSetAction(S, ACT_IDLE, MT2_MLME_QOS_CATE, (STATE_MACHINE_FUNC)MlmeQOSAction); + StateMachineSetAction(S, ACT_IDLE, MT2_MLME_DLS_CATE, (STATE_MACHINE_FUNC)MlmeDLSAction); + StateMachineSetAction(S, ACT_IDLE, MT2_ACT_INVALID, (STATE_MACHINE_FUNC)MlmeInvalidAction); + + +} + +#ifdef DOT11_N_SUPPORT +VOID MlmeADDBAAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) + +{ + MLME_ADDBA_REQ_STRUCT *pInfo; + UCHAR Addr[6]; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG Idx; + FRAME_ADDBA_REQ Frame; + ULONG FrameLen; + BA_ORI_ENTRY *pBAEntry = NULL; + + pInfo = (MLME_ADDBA_REQ_STRUCT *)Elem->Msg; + NdisZeroMemory(&Frame, sizeof(FRAME_ADDBA_REQ)); + + if(MlmeAddBAReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr)) + { + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeADDBAAction() allocate memory failed \n")); + return; + } + // 1. find entry + Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID]; + if (Idx == 0) + { + MlmeFreeMemory(pAd, pOutBuffer); + DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() can't find BAOriEntry \n")); + return; + } + else + { + pBAEntry =&pAd->BATable.BAOriEntry[Idx]; + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (ADHOC_ON(pAd) +#ifdef QOS_DLS_SUPPORT + || (IS_ENTRY_DLS(&pAd->MacTab.Content[pInfo->Wcid])) +#endif // QOS_DLS_SUPPORT // + ) + ActHeaderInit(pAd, &Frame.Hdr, pInfo->pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + else + ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pInfo->pAddr); + } +#endif // CONFIG_STA_SUPPORT // + + Frame.Category = CATEGORY_BA; + Frame.Action = ADDBA_REQ; + Frame.BaParm.AMSDUSupported = 0; + Frame.BaParm.BAPolicy = IMMED_BA; + Frame.BaParm.TID = pInfo->TID; + Frame.BaParm.BufSize = pInfo->BaBufSize; + Frame.Token = pInfo->Token; + Frame.TimeOutValue = pInfo->TimeOutValue; + Frame.BaStartSeq.field.FragNum = 0; + Frame.BaStartSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; + + *(USHORT *)(&Frame.BaParm) = cpu2le16(*(USHORT *)(&Frame.BaParm)); + Frame.TimeOutValue = cpu2le16(Frame.TimeOutValue); + Frame.BaStartSeq.word = cpu2le16(Frame.BaStartSeq.word); + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(FRAME_ADDBA_REQ), &Frame, + END_OF_ARGS); + + MiniportMMRequest(pAd, (MGMT_USE_QUEUE_FLAG | MapUserPriorityToAccessCategory[pInfo->TID]), pOutBuffer, FrameLen); + + MlmeFreeMemory(pAd, pOutBuffer); + + DBGPRINT(RT_DEBUG_TRACE, ("BA - Send ADDBA request. StartSeq = %x, FrameLen = %ld. BufSize = %d\n", Frame.BaStartSeq.field.StartSeq, FrameLen, Frame.BaParm.BufSize)); + } +} + +/* + ========================================================================== + Description: + send DELBA and delete BaEntry if any + Parametrs: + Elem - MLME message MLME_DELBA_REQ_STRUCT + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeDELBAAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + MLME_DELBA_REQ_STRUCT *pInfo; + PUCHAR pOutBuffer = NULL; + PUCHAR pOutBuffer2 = NULL; + NDIS_STATUS NStatus; + ULONG Idx; + FRAME_DELBA_REQ Frame; + ULONG FrameLen; + FRAME_BAR FrameBar; + + pInfo = (MLME_DELBA_REQ_STRUCT *)Elem->Msg; + // must send back DELBA + NdisZeroMemory(&Frame, sizeof(FRAME_DELBA_REQ)); + DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeDELBAAction(), Initiator(%d) \n", pInfo->Initiator)); + + if(MlmeDelBAReqSanity(pAd, Elem->Msg, Elem->MsgLen)) + { + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeDELBAAction() allocate memory failed 1. \n")); + return; + } + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + MlmeFreeMemory(pAd, pOutBuffer); + DBGPRINT(RT_DEBUG_ERROR, ("BA - MlmeDELBAAction() allocate memory failed 2. \n")); + return; + } + + // SEND BAR (Send BAR to refresh peer reordering buffer.) + Idx = pAd->MacTab.Content[pInfo->Wcid].BAOriWcidArray[pInfo->TID]; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress); +#endif // CONFIG_STA_SUPPORT // + + FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL funciton. + FrameBar.StartingSeq.field.StartSeq = pAd->MacTab.Content[pInfo->Wcid].TxSeq[pInfo->TID]; // make sure sequence not clear in DEL funciton. + FrameBar.BarControl.TID = pInfo->TID; // make sure sequence not clear in DEL funciton. + FrameBar.BarControl.ACKPolicy = IMMED_BA; // make sure sequence not clear in DEL funciton. + FrameBar.BarControl.Compressed = 1; // make sure sequence not clear in DEL funciton. + FrameBar.BarControl.MTID = 0; // make sure sequence not clear in DEL funciton. + + MakeOutgoingFrame(pOutBuffer2, &FrameLen, + sizeof(FRAME_BAR), &FrameBar, + END_OF_ARGS); + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer2); + DBGPRINT(RT_DEBUG_TRACE,("BA - MlmeDELBAAction() . Send BAR to refresh peer reordering buffer \n")); + + // SEND DELBA FRAME + FrameLen = 0; +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (ADHOC_ON(pAd) +#ifdef QOS_DLS_SUPPORT + || (IS_ENTRY_DLS(&pAd->MacTab.Content[pInfo->Wcid])) +#endif // QOS_DLS_SUPPORT // + ) + ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[pInfo->Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + else + ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[pInfo->Wcid].Addr); + } +#endif // CONFIG_STA_SUPPORT // + Frame.Category = CATEGORY_BA; + Frame.Action = DELBA; + Frame.DelbaParm.Initiator = pInfo->Initiator; + Frame.DelbaParm.TID = pInfo->TID; + Frame.ReasonCode = 39; // Time Out + *(USHORT *)(&Frame.DelbaParm) = cpu2le16(*(USHORT *)(&Frame.DelbaParm)); + Frame.ReasonCode = cpu2le16(Frame.ReasonCode); + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(FRAME_DELBA_REQ), &Frame, + END_OF_ARGS); + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + DBGPRINT(RT_DEBUG_TRACE, ("BA - MlmeDELBAAction() . 3 DELBA sent. Initiator(%d)\n", pInfo->Initiator)); + } +} +#endif // DOT11_N_SUPPORT // + +VOID MlmeQOSAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ +} + +VOID MlmeDLSAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ +} + +VOID MlmeInvalidAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + //PUCHAR pOutBuffer = NULL; + //Return the receiving frame except the MSB of category filed set to 1. 7.3.1.11 +} + +VOID PeerQOSAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ +} + +#ifdef QOS_DLS_SUPPORT +VOID PeerDLSAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Action = Elem->Msg[LENGTH_802_11+1]; + + switch(Action) + { + case ACTION_DLS_REQUEST: +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + PeerDlsReqAction(pAd, Elem); +#endif // CONFIG_STA_SUPPORT // + break; + + case ACTION_DLS_RESPONSE: +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + PeerDlsRspAction(pAd, Elem); +#endif // CONFIG_STA_SUPPORT // + break; + + case ACTION_DLS_TEARDOWN: +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + PeerDlsTearDownAction(pAd, Elem); +#endif // CONFIG_STA_SUPPORT // + break; + } +} +#endif // QOS_DLS_SUPPORT // + + + +#ifdef DOT11_N_SUPPORT +VOID PeerBAAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Action = Elem->Msg[LENGTH_802_11+1]; + + switch(Action) + { + case ADDBA_REQ: + PeerAddBAReqAction(pAd,Elem); + break; + case ADDBA_RESP: + PeerAddBARspAction(pAd,Elem); + break; + case DELBA: + PeerDelBAAction(pAd,Elem); + break; + } +} + + +#ifdef DOT11N_DRAFT3 + +#ifdef CONFIG_STA_SUPPORT +VOID StaPublicAction( + IN PRTMP_ADAPTER pAd, + IN BSS_2040_COEXIST_IE *pBssCoexIE) +{ + MLME_SCAN_REQ_STRUCT ScanReq; + + DBGPRINT(RT_DEBUG_TRACE,("ACTION - StaPeerPublicAction Bss2040Coexist = %x\n", *((PUCHAR)pBssCoexIE))); + + // AP asks Station to return a 20/40 BSS Coexistence mgmt frame. So we first starts a scan, then send back 20/40 BSS Coexistence mgmt frame + if ((pBssCoexIE->field.InfoReq == 1) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040))) + { + // Clear record first. After scan , will update those bit and send back to transmiter. + pAd->CommonCfg.BSSCoexist2040.field.InfoReq = 1; + pAd->CommonCfg.BSSCoexist2040.field.Intolerant40 = 0; + pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq = 0; + // Clear Trigger event table + TriEventInit(pAd); + // Fill out stuff for scan request and kick to scan + ScanParmFill(pAd, &ScanReq, ZeroSsid, 0, BSS_ANY, SCAN_2040_BSS_COEXIST); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; + RTMP_MLME_HANDLER(pAd); + } +} + + +/* +Description : Build Intolerant Channel Rerpot from Trigger event table. +return : how many bytes copied. +*/ +ULONG BuildIntolerantChannelRep( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDest) +{ + ULONG FrameLen = 0; + ULONG ReadOffset = 0; + UCHAR i, j, k, idx = 0; + //UCHAR LastRegClass = 0xff; + UCHAR ChannelList[MAX_TRIGGER_EVENT]; + UCHAR TmpRegClass; + UCHAR RegClassArray[7] = {0, 11,12, 32, 33, 54,55}; // Those regulatory class has channel in 2.4GHz. See Annex J. + + + RTMPZeroMemory(ChannelList, MAX_TRIGGER_EVENT); + + // Find every regulatory class + for ( k = 0;k < 7;k++) + { + TmpRegClass = RegClassArray[k]; + + idx = 0; + // Find Channel report with the same regulatory class in 2.4GHz. + for ( i = 0;i < pAd->CommonCfg.TriggerEventTab.EventANo;i++) + { + if (pAd->CommonCfg.TriggerEventTab.EventA[i].bValid == TRUE) + { + if (pAd->CommonCfg.TriggerEventTab.EventA[i].RegClass == TmpRegClass) + { + for (j = 0;j < idx;j++) + { + if (ChannelList[j] == (UCHAR)pAd->CommonCfg.TriggerEventTab.EventA[i].Channel) + break; + } + if ((j == idx)) + { + ChannelList[idx] = (UCHAR)pAd->CommonCfg.TriggerEventTab.EventA[i].Channel; + idx++; + } + pAd->CommonCfg.TriggerEventTab.EventA[i].bValid = FALSE; + } + DBGPRINT(RT_DEBUG_ERROR,("ACT - BuildIntolerantChannelRep , Total Channel number = %d \n", idx)); + } + } + + // idx > 0 means this regulatory class has some channel report and need to copy to the pDest. + if (idx > 0) + { + // For each regaulatory IE report, contains all channels that has the same regulatory class. + *(pDest + ReadOffset) = IE_2040_BSS_INTOLERANT_REPORT; // IE + *(pDest + ReadOffset + 1) = 1+ idx; // Len = RegClass byte + channel byte. + *(pDest + ReadOffset + 2) = TmpRegClass; // Len = RegClass byte + channel byte. + RTMPMoveMemory(pDest + ReadOffset + 3, ChannelList, idx); + + FrameLen += (3 + idx); + ReadOffset += (3 + idx); + } + + } + + DBGPRINT(RT_DEBUG_ERROR,("ACT-BuildIntolerantChannelRep(Size=%ld)\n", FrameLen)); + hex_dump("ACT-pDestMsg", pDest, 12); + + return FrameLen; +} + +/* + ========================================================================== + Description: + After scan, Update 20/40 BSS Coexistence IE and send out. + According to 802.11n D3.03 11.14.10 + + Parameters: + ========================================================================== + */ +VOID Update2040CoexistFrameAndNotify( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN BOOLEAN bAddIntolerantCha) +{ + BSS_2040_COEXIST_IE OldValue; + + DBGPRINT(RT_DEBUG_ERROR,("ACT - Update2040CoexistFrameAndNotify.BSSCoex=%x.EventANo=%d,EventBCD=%ld\n", + pAd->CommonCfg.BSSCoexist2040.word, + pAd->CommonCfg.TriggerEventTab.EventANo, + pAd->CommonCfg.TriggerEventTab.EventBCountDown)); + OldValue.word = pAd->CommonCfg.BSSCoexist2040.word; + // Reset value. + pAd->CommonCfg.BSSCoexist2040.word = 0; + + if (pAd->CommonCfg.TriggerEventTab.EventBCountDown > 0) + pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq = 1; + + // Need to check !!!! + // How STA will set Intolerant40 if implementation dependent. Now we don't set this bit first!!!!! + // So Only check BSS20WidthReq change. + //if (OldValue.field.BSS20WidthReq != pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq) + { + Send2040CoexistAction(pAd, Wcid, bAddIntolerantCha); + } +} + +/* +Description : Send 20/40 BSS Coexistence Action frame If one trigger event is triggered. +*/ +VOID Send2040CoexistAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN BOOLEAN bAddIntolerantCha) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + FRAME_ACTION_HDR Frame; + ULONG FrameLen; + ULONG IntolerantChaRepLen; + UCHAR HtLen = 1; + + IntolerantChaRepLen = 0; + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_ERROR,("ACT - Send2040CoexistAction() allocate memory failed \n")); + return; + } + + ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[Wcid].Addr, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + + Frame.Category = CATEGORY_PUBLIC; + Frame.Action = ACTION_BSS_2040_COEXIST; //COEXIST_2040_ACTION; + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(FRAME_ACTION_HDR), &Frame, + 1, &BssCoexistIe, + 1, &HtLen, + 1, &pAd->CommonCfg.BSSCoexist2040.word, + END_OF_ARGS); + + if (bAddIntolerantCha == TRUE) + IntolerantChaRepLen = BuildIntolerantChannelRep(pAd, pOutBuffer + FrameLen); + + //2009 PF#3: IOT issue with Motorola AP. It will not check the field of BSSCoexist2040. + //11.14.12 Switching between 40 MHz and 20 MHz + if (!((IntolerantChaRepLen == 0) && (pAd->CommonCfg.BSSCoexist2040.word == 0))) + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen + IntolerantChaRepLen); + + MlmeFreeMemory(pAd, pOutBuffer); + + DBGPRINT(RT_DEBUG_TRACE,("ACT - Send2040CoexistAction( BSSCoexist2040 = 0x%x ) \n", pAd->CommonCfg.BSSCoexist2040.word)); +} + +VOID UpdateBssScanParm( + IN PRTMP_ADAPTER pAd, + IN OVERLAP_BSS_SCAN_IE APBssScan) +{ + pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = le2cpu16(APBssScan.DelayFactor); //APBssScan.DelayFactor[1] * 256 + APBssScan.DelayFactor[0]; + // out of range defined in MIB... So fall back to default value. + if ((pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor <5) || (pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor > 100)) + { + //DBGPRINT(RT_DEBUG_ERROR,("ACT - UpdateBssScanParm( Dot11BssWidthChanTranDelayFactor out of range !!!!) \n")); + pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = 5; + } + + pAd->CommonCfg.Dot11BssWidthTriggerScanInt = le2cpu16(APBssScan.TriggerScanInt); //APBssScan.TriggerScanInt[1] * 256 + APBssScan.TriggerScanInt[0]; + // out of range defined in MIB... So fall back to default value. + if ((pAd->CommonCfg.Dot11BssWidthTriggerScanInt < 10) ||(pAd->CommonCfg.Dot11BssWidthTriggerScanInt > 900)) + { + //DBGPRINT(RT_DEBUG_ERROR,("ACT - UpdateBssScanParm( Dot11BssWidthTriggerScanInt out of range !!!!) \n")); + pAd->CommonCfg.Dot11BssWidthTriggerScanInt = 900; + } + + pAd->CommonCfg.Dot11OBssScanPassiveDwell = le2cpu16(APBssScan.ScanPassiveDwell); //APBssScan.ScanPassiveDwell[1] * 256 + APBssScan.ScanPassiveDwell[0]; + // out of range defined in MIB... So fall back to default value. + if ((pAd->CommonCfg.Dot11OBssScanPassiveDwell < 5) ||(pAd->CommonCfg.Dot11OBssScanPassiveDwell > 1000)) + { + //DBGPRINT(RT_DEBUG_ERROR,("ACT - UpdateBssScanParm( Dot11OBssScanPassiveDwell out of range !!!!) \n")); + pAd->CommonCfg.Dot11OBssScanPassiveDwell = 20; + } + + pAd->CommonCfg.Dot11OBssScanActiveDwell = le2cpu16(APBssScan.ScanActiveDwell); //APBssScan.ScanActiveDwell[1] * 256 + APBssScan.ScanActiveDwell[0]; + // out of range defined in MIB... So fall back to default value. + if ((pAd->CommonCfg.Dot11OBssScanActiveDwell < 10) ||(pAd->CommonCfg.Dot11OBssScanActiveDwell > 1000)) + { + //DBGPRINT(RT_DEBUG_ERROR,("ACT - UpdateBssScanParm( Dot11OBssScanActiveDwell out of range !!!!) \n")); + pAd->CommonCfg.Dot11OBssScanActiveDwell = 10; + } + + pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = le2cpu16(APBssScan.PassiveTalPerChannel); //APBssScan.PassiveTalPerChannel[1] * 256 + APBssScan.PassiveTalPerChannel[0]; + // out of range defined in MIB... So fall back to default value. + if ((pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel < 200) ||(pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel > 10000)) + { + //DBGPRINT(RT_DEBUG_ERROR,("ACT - UpdateBssScanParm( Dot11OBssScanPassiveTotalPerChannel out of range !!!!) \n")); + pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = 200; + } + + pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = le2cpu16(APBssScan.ActiveTalPerChannel); //APBssScan.ActiveTalPerChannel[1] * 256 + APBssScan.ActiveTalPerChannel[0]; + // out of range defined in MIB... So fall back to default value. + if ((pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel < 20) ||(pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel > 10000)) + { + //DBGPRINT(RT_DEBUG_ERROR,("ACT - UpdateBssScanParm( Dot11OBssScanActiveTotalPerChannel out of range !!!!) \n")); + pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = 20; + } + + pAd->CommonCfg.Dot11OBssScanActivityThre = le2cpu16(APBssScan.ScanActThre); //APBssScan.ScanActThre[1] * 256 + APBssScan.ScanActThre[0]; + // out of range defined in MIB... So fall back to default value. + if (pAd->CommonCfg.Dot11OBssScanActivityThre > 100) + { + //DBGPRINT(RT_DEBUG_ERROR,("ACT - UpdateBssScanParm( Dot11OBssScanActivityThre out of range !!!!) \n")); + pAd->CommonCfg.Dot11OBssScanActivityThre = 25; + } + + pAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor); + //DBGPRINT(RT_DEBUG_LOUD,("ACT - UpdateBssScanParm( Dot11BssWidthTriggerScanInt = %d ) \n", pAd->CommonCfg.Dot11BssWidthTriggerScanInt)); +} + +#endif // CONFIG_STA_SUPPORT // + + +BOOLEAN ChannelSwitchSanityCheck( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR NewChannel, + IN UCHAR Secondary) +{ + UCHAR i; + + if (Wcid >= MAX_LEN_OF_MAC_TABLE) + return FALSE; + + if ((NewChannel > 7) && (Secondary == 1)) + return FALSE; + + if ((NewChannel < 5) && (Secondary == 3)) + return FALSE; + + // 0. Check if new channel is in the channellist. + for (i = 0;i < pAd->ChannelListNum;i++) + { + if (pAd->ChannelList[i].Channel == NewChannel) + { + break; + } + } + + if (i == pAd->ChannelListNum) + return FALSE; + + return TRUE; +} + + +VOID ChannelSwitchAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR NewChannel, + IN UCHAR Secondary) +{ + UCHAR BBPValue = 0; + ULONG MACValue; + + DBGPRINT(RT_DEBUG_TRACE,("SPECTRUM - ChannelSwitchAction(NewChannel = %d , Secondary = %d) \n", NewChannel, Secondary)); + + if (ChannelSwitchSanityCheck(pAd, Wcid, NewChannel, Secondary) == FALSE) + return; + + // 1. Switches to BW = 20. + if (Secondary == 0) + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue&= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11); + DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); + } + pAd->CommonCfg.BBPCurrentBW = BW_20; + pAd->CommonCfg.Channel = NewChannel; + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel,FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + pAd->MacTab.Content[Wcid].HTPhyMode.field.BW = 0; + DBGPRINT(RT_DEBUG_TRACE, ("!!!20MHz !!! \n" )); + } + // 1. Switches to BW = 40 And Station supports BW = 40. + else if (((Secondary == 1) || (Secondary == 3)) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == 1)) + { + pAd->CommonCfg.Channel = NewChannel; + + if (Secondary == 1) + { + // Secondary above. + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2; + RTMP_IO_READ32(pAd, TX_BAND_CFG, &MACValue); + MACValue &= 0xfe; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, MACValue); + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue&= (~0x18); + BBPValue|= (0x10); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPValue); + BBPValue&= (~0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPValue); + DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel )); + } + else + { + // Secondary below. + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2; + RTMP_IO_READ32(pAd, TX_BAND_CFG, &MACValue); + MACValue &= 0xfe; + MACValue |= 0x1; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, MACValue); + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue&= (~0x18); + BBPValue|= (0x10); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPValue); + BBPValue&= (~0x20); + BBPValue|= (0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPValue); + DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel )); + } + pAd->CommonCfg.BBPCurrentBW = BW_40; + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + pAd->MacTab.Content[Wcid].HTPhyMode.field.BW = 1; + } +} +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +VOID PeerPublicAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + UCHAR Action = Elem->Msg[LENGTH_802_11+1]; +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) + return; + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + switch(Action) + { + case ACTION_BSS_2040_COEXIST: // Format defined in IEEE 7.4.7a.1 in 11n Draf3.03 + { + //UCHAR BssCoexist; + BSS_2040_COEXIST_ELEMENT *pCoexistInfo; + BSS_2040_COEXIST_IE *pBssCoexistIe; + BSS_2040_INTOLERANT_CH_REPORT *pIntolerantReport = NULL; + + if (Elem->MsgLen <= (LENGTH_802_11 + sizeof(BSS_2040_COEXIST_ELEMENT)) ) + { + DBGPRINT(RT_DEBUG_ERROR, ("ACTION - 20/40 BSS Coexistence Management Frame length too short! len = %ld!\n", Elem->MsgLen)); + break; + } + DBGPRINT(RT_DEBUG_TRACE, ("ACTION - 20/40 BSS Coexistence Management action----> \n")); + hex_dump("CoexistenceMgmtFrame", Elem->Msg, Elem->MsgLen); + + + pCoexistInfo = (BSS_2040_COEXIST_ELEMENT *) &Elem->Msg[LENGTH_802_11+2]; + //hex_dump("CoexistInfo", (PUCHAR)pCoexistInfo, sizeof(BSS_2040_COEXIST_ELEMENT)); + if (Elem->MsgLen >= (LENGTH_802_11 + sizeof(BSS_2040_COEXIST_ELEMENT) + sizeof(BSS_2040_INTOLERANT_CH_REPORT))) + { + pIntolerantReport = (BSS_2040_INTOLERANT_CH_REPORT *)((PUCHAR)pCoexistInfo + sizeof(BSS_2040_COEXIST_ELEMENT)); + } + //hex_dump("IntolerantReport ", (PUCHAR)pIntolerantReport, sizeof(BSS_2040_INTOLERANT_CH_REPORT)); + + if(pAd->CommonCfg.bBssCoexEnable == FALSE || (pAd->CommonCfg.bForty_Mhz_Intolerant == TRUE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("20/40 BSS CoexMgmt=%d, bForty_Mhz_Intolerant=%d, ignore this action!!\n", + pAd->CommonCfg.bBssCoexEnable, + pAd->CommonCfg.bForty_Mhz_Intolerant)); + break; + } + + pBssCoexistIe = (BSS_2040_COEXIST_IE *)(&pCoexistInfo->BssCoexistIe); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (INFRA_ON(pAd)) + { + StaPublicAction(pAd, pBssCoexistIe); + } + } +#endif // CONFIG_STA_SUPPORT // + + } + break; + } + +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +} + + +static VOID ReservedAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Category; + + if (Elem->MsgLen <= LENGTH_802_11) + { + return; + } + + Category = Elem->Msg[LENGTH_802_11]; + DBGPRINT(RT_DEBUG_TRACE,("Rcv reserved category(%d) Action Frame\n", Category)); + hex_dump("Reserved Action Frame", &Elem->Msg[0], Elem->MsgLen); +} + +VOID PeerRMAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) + +{ + return; +} + +#ifdef DOT11_N_SUPPORT +static VOID respond_ht_information_exchange_action( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen; + FRAME_HT_INFO HTINFOframe, *pFrame; + UCHAR *pAddr; + + + // 2. Always send back ADDBA Response + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE,("ACTION - respond_ht_information_exchange_action() allocate memory failed \n")); + return; + } + + // get RA + pFrame = (FRAME_HT_INFO *) &Elem->Msg[0]; + pAddr = pFrame->Hdr.Addr2; + + NdisZeroMemory(&HTINFOframe, sizeof(FRAME_HT_INFO)); + // 2-1. Prepare ADDBA Response frame. +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (ADHOC_ON(pAd)) + ActHeaderInit(pAd, &HTINFOframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + else + ActHeaderInit(pAd, &HTINFOframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr); + } +#endif // CONFIG_STA_SUPPORT // + + HTINFOframe.Category = CATEGORY_HT; + HTINFOframe.Action = HT_INFO_EXCHANGE; + HTINFOframe.HT_Info.Request = 0; + HTINFOframe.HT_Info.Forty_MHz_Intolerant = pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant; + HTINFOframe.HT_Info.STA_Channel_Width = pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth; + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(FRAME_HT_INFO), &HTINFOframe, + END_OF_ARGS); + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); +} + + + + +VOID PeerHTAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Action = Elem->Msg[LENGTH_802_11+1]; + + if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) + return; + + switch(Action) + { + case NOTIFY_BW_ACTION: + DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Notify Channel bandwidth action----> \n")); +#ifdef CONFIG_STA_SUPPORT + if(pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) + { + // Note, this is to patch DIR-1353 AP. When the AP set to Wep, it will use legacy mode. But AP still keeps + // sending BW_Notify Action frame, and cause us to linkup and linkdown. + // In legacy mode, don't need to parse HT action frame. + DBGPRINT(RT_DEBUG_TRACE,("ACTION -Ignore HT Notify Channel BW when link as legacy mode. BW = %d---> \n", + Elem->Msg[LENGTH_802_11+2] )); + break; + } +#endif // CONFIG_STA_SUPPORT // + + if (Elem->Msg[LENGTH_802_11+2] == 0) // 7.4.8.2. if value is 1, keep the same as supported channel bandwidth. + pAd->MacTab.Content[Elem->Wcid].HTPhyMode.field.BW = 0; + else + { + pAd->MacTab.Content[Elem->Wcid].HTPhyMode.field.BW = + pAd->MacTab.Content[Elem->Wcid].MaxHTPhyMode.field.BW & pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth; + } + + break; + + case SMPS_ACTION: + // 7.3.1.25 + DBGPRINT(RT_DEBUG_TRACE,("ACTION - SMPS action----> \n")); + if (((Elem->Msg[LENGTH_802_11+2]&0x1) == 0)) + { + pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_ENABLE; + } + else if (((Elem->Msg[LENGTH_802_11+2]&0x2) == 0)) + { + pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_STATIC; + } + else + { + pAd->MacTab.Content[Elem->Wcid].MmpsMode = MMPS_DYNAMIC; + } + + DBGPRINT(RT_DEBUG_TRACE,("Aid(%d) MIMO PS = %d\n", Elem->Wcid, pAd->MacTab.Content[Elem->Wcid].MmpsMode)); + // rt2860c : add something for smps change. + break; + + case SETPCO_ACTION: + break; + + case MIMO_CHA_MEASURE_ACTION: + break; + + case HT_INFO_EXCHANGE: + { + HT_INFORMATION_OCTET *pHT_info; + + pHT_info = (HT_INFORMATION_OCTET *) &Elem->Msg[LENGTH_802_11+2]; + // 7.4.8.10 + DBGPRINT(RT_DEBUG_TRACE,("ACTION - HT Information Exchange action----> \n")); + if (pHT_info->Request) + { + respond_ht_information_exchange_action(pAd, Elem); + } + } + break; + } +} + + +/* + ========================================================================== + Description: + Retry sending ADDBA Reqest. + + IRQL = DISPATCH_LEVEL + + Parametrs: + p8023Header: if this is already 802.3 format, p8023Header is NULL + + Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere. + FALSE , then continue indicaterx at this moment. + ========================================================================== + */ +VOID ORIBATimerTimeout( + IN PRTMP_ADAPTER pAd) +{ + MAC_TABLE_ENTRY *pEntry; + INT i, total; +// FRAME_BAR FrameBar; +// ULONG FrameLen; +// NDIS_STATUS NStatus; +// PUCHAR pOutBuffer = NULL; +// USHORT Sequence; + UCHAR TID; + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + + total = pAd->MacTab.Size * NUM_OF_TID; + + for (i = 1; ((i <MAX_LEN_OF_BA_ORI_TABLE) && (total > 0)) ; i++) + { + if (pAd->BATable.BAOriEntry[i].ORI_BA_Status == Originator_Done) + { + pEntry = &pAd->MacTab.Content[pAd->BATable.BAOriEntry[i].Wcid]; + TID = pAd->BATable.BAOriEntry[i].TID; + + ASSERT(pAd->BATable.BAOriEntry[i].Wcid < MAX_LEN_OF_MAC_TABLE); + } + total --; + } +} + + +VOID SendRefreshBAR( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry) +{ + FRAME_BAR FrameBar; + ULONG FrameLen; + NDIS_STATUS NStatus; + PUCHAR pOutBuffer = NULL; + USHORT Sequence; + UCHAR i, TID; + USHORT idx; + BA_ORI_ENTRY *pBAEntry; + + for (i = 0; i <NUM_OF_TID; i++) + { + idx = pEntry->BAOriWcidArray[i]; + if (idx == 0) + { + continue; + } + pBAEntry = &pAd->BATable.BAOriEntry[idx]; + + if (pBAEntry->ORI_BA_Status == Originator_Done) + { + TID = pBAEntry->TID; + + ASSERT(pBAEntry->Wcid < MAX_LEN_OF_MAC_TABLE); + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() allocate memory failed \n")); + return; + } + + Sequence = pEntry->TxSeq[TID]; + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + BarHeaderInit(pAd, &FrameBar, pEntry->Addr, pAd->CurrentAddress); +#endif // CONFIG_STA_SUPPORT // + + FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL function. + FrameBar.StartingSeq.field.StartSeq = Sequence; // make sure sequence not clear in DEL funciton. + FrameBar.BarControl.TID = TID; // make sure sequence not clear in DEL funciton. + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(FRAME_BAR), &FrameBar, + END_OF_ARGS); + //if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET))) + if (1) // Now we always send BAR. + { + //MiniportMMRequestUnlock(pAd, 0, pOutBuffer, FrameLen); + MiniportMMRequest(pAd, (MGMT_USE_QUEUE_FLAG | MapUserPriorityToAccessCategory[TID]), pOutBuffer, FrameLen); + + } + MlmeFreeMemory(pAd, pOutBuffer); + } + } +} +#endif // DOT11_N_SUPPORT // + +VOID ActHeaderInit( + IN PRTMP_ADAPTER pAd, + IN OUT PHEADER_802_11 pHdr80211, + IN PUCHAR Addr1, + IN PUCHAR Addr2, + IN PUCHAR Addr3) +{ + NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11)); + pHdr80211->FC.Type = BTYPE_MGMT; + pHdr80211->FC.SubType = SUBTYPE_ACTION; + + COPY_MAC_ADDR(pHdr80211->Addr1, Addr1); + COPY_MAC_ADDR(pHdr80211->Addr2, Addr2); + COPY_MAC_ADDR(pHdr80211->Addr3, Addr3); +} + +VOID BarHeaderInit( + IN PRTMP_ADAPTER pAd, + IN OUT PFRAME_BAR pCntlBar, + IN PUCHAR pDA, + IN PUCHAR pSA) +{ +// USHORT Duration; + + NdisZeroMemory(pCntlBar, sizeof(FRAME_BAR)); + pCntlBar->FC.Type = BTYPE_CNTL; + pCntlBar->FC.SubType = SUBTYPE_BLOCK_ACK_REQ; + pCntlBar->BarControl.MTID = 0; + pCntlBar->BarControl.Compressed = 1; + pCntlBar->BarControl.ACKPolicy = 0; + + + pCntlBar->Duration = 16 + RTMPCalcDuration(pAd, RATE_1, sizeof(FRAME_BA)); + + COPY_MAC_ADDR(pCntlBar->Addr1, pDA); + COPY_MAC_ADDR(pCntlBar->Addr2, pSA); +} + + +/* + ========================================================================== + Description: + Insert Category and action code into the action frame. + + Parametrs: + 1. frame buffer pointer. + 2. frame length. + 3. category code of the frame. + 4. action code of the frame. + + Return : None. + ========================================================================== + */ +VOID InsertActField( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN UINT8 Category, + IN UINT8 ActCode) +{ + ULONG TempLen; + + MakeOutgoingFrame( pFrameBuf, &TempLen, + 1, &Category, + 1, &ActCode, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + + return; +} diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ba_action.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ba_action.c new file mode 100644 index 000000000..7d9ede9a0 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ba_action.c @@ -0,0 +1,1798 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + + +#ifdef DOT11_N_SUPPORT + +#include "rt_config.h" + + + +#define BA_ORI_INIT_SEQ (pEntry->TxSeq[TID]) //1 // inital sequence number of BA session + +#define ORI_SESSION_MAX_RETRY 8 +#define ORI_BA_SESSION_TIMEOUT (2000) // ms +#define REC_BA_SESSION_IDLE_TIMEOUT (1000) // ms + +#define REORDERING_PACKET_TIMEOUT ((100 * OS_HZ)/1000) // system ticks -- 100 ms +#define MAX_REORDERING_PACKET_TIMEOUT ((3000 * OS_HZ)/1000) // system ticks -- 100 ms + +#define RESET_RCV_SEQ (0xFFFF) + +static void ba_mpdu_blk_free(PRTMP_ADAPTER pAd, struct reordering_mpdu *mpdu_blk); + + +BA_ORI_ENTRY *BATableAllocOriEntry( + IN PRTMP_ADAPTER pAd, + OUT USHORT *Idx); + +BA_REC_ENTRY *BATableAllocRecEntry( + IN PRTMP_ADAPTER pAd, + OUT USHORT *Idx); + +VOID BAOriSessionSetupTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID BARecSessionIdleTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + + +BUILD_TIMER_FUNCTION(BAOriSessionSetupTimeout); +BUILD_TIMER_FUNCTION(BARecSessionIdleTimeout); + +#define ANNOUNCE_REORDERING_PACKET(_pAd, _mpdu_blk) \ + Announce_Reordering_Packet(_pAd, _mpdu_blk); + +VOID BA_MaxWinSizeReasign( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntryPeer, + OUT UCHAR *pWinSize) +{ + UCHAR MaxSize; + + + if (pAd->MACVersion >= RALINK_2883_VERSION) // 3*3 + { + if (pAd->MACVersion >= RALINK_3070_VERSION) + { + if (pEntryPeer->WepStatus != Ndis802_11EncryptionDisabled) + MaxSize = 7; // for non-open mode + else + MaxSize = 13; + } + else + MaxSize = 31; + } + else if (pAd->MACVersion >= RALINK_2880E_VERSION) // 2880 e + { + if (pEntryPeer->WepStatus != Ndis802_11EncryptionDisabled) + MaxSize = 7; // for non-open mode + else + MaxSize = 13; + } + else + MaxSize = 7; + + DBGPRINT(RT_DEBUG_TRACE, ("ba> Win Size = %d, Max Size = %d\n", + *pWinSize, MaxSize)); + + if ((*pWinSize) > MaxSize) + { + DBGPRINT(RT_DEBUG_TRACE, ("ba> reassign max win size from %d to %d\n", + *pWinSize, MaxSize)); + + *pWinSize = MaxSize; + } +} + +void Announce_Reordering_Packet(IN PRTMP_ADAPTER pAd, + IN struct reordering_mpdu *mpdu) +{ + PNDIS_PACKET pPacket; + + pPacket = mpdu->pPacket; + + if (mpdu->bAMSDU) + { + //ASSERT(0); + BA_Reorder_AMSDU_Annnounce(pAd, pPacket); + } + else + { + // + // pass this 802.3 packet to upper layer or forward this packet to WM directly + // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket, RTMP_GET_PACKET_IF(pPacket)); +#endif // CONFIG_STA_SUPPORT // + } +} + +/* + * Insert a reordering mpdu into sorted linked list by sequence no. + */ +BOOLEAN ba_reordering_mpdu_insertsorted(struct reordering_list *list, struct reordering_mpdu *mpdu) +{ + + struct reordering_mpdu **ppScan = &list->next; + + while (*ppScan != NULL) + { + if (SEQ_SMALLER((*ppScan)->Sequence, mpdu->Sequence, MAXSEQ)) + { + ppScan = &(*ppScan)->next; + } + else if ((*ppScan)->Sequence == mpdu->Sequence) + { + /* give up this duplicated frame */ + return(FALSE); + } + else + { + /* find position */ + break; + } + } + + mpdu->next = *ppScan; + *ppScan = mpdu; + list->qlen++; + return TRUE; +} + + +/* + * caller lock critical section if necessary + */ +static inline void ba_enqueue(struct reordering_list *list, struct reordering_mpdu *mpdu_blk) +{ + list->qlen++; + mpdu_blk->next = list->next; + list->next = mpdu_blk; +} + +/* + * caller lock critical section if necessary + */ +static inline struct reordering_mpdu * ba_dequeue(struct reordering_list *list) +{ + struct reordering_mpdu *mpdu_blk = NULL; + + ASSERT(list); + + if (list->qlen) + { + list->qlen--; + mpdu_blk = list->next; + if (mpdu_blk) + { + list->next = mpdu_blk->next; + mpdu_blk->next = NULL; + } + } + return mpdu_blk; +} + + +static inline struct reordering_mpdu *ba_reordering_mpdu_dequeue(struct reordering_list *list) +{ + return(ba_dequeue(list)); +} + + +static inline struct reordering_mpdu *ba_reordering_mpdu_probe(struct reordering_list *list) + { + ASSERT(list); + + return(list->next); + } + + +/* + * free all resource for reordering mechanism + */ +void ba_reordering_resource_release(PRTMP_ADAPTER pAd) +{ + BA_TABLE *Tab; + PBA_REC_ENTRY pBAEntry; + struct reordering_mpdu *mpdu_blk; + int i; + + Tab = &pAd->BATable; + + /* I. release all pending reordering packet */ + NdisAcquireSpinLock(&pAd->BATabLock); + for (i = 0; i < MAX_LEN_OF_BA_REC_TABLE; i++) + { + pBAEntry = &Tab->BARecEntry[i]; + if (pBAEntry->REC_BA_Status != Recipient_NONE) + { + while ((mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list))) + { + ASSERT(mpdu_blk->pPacket); + RELEASE_NDIS_PACKET(pAd, mpdu_blk->pPacket, NDIS_STATUS_FAILURE); + ba_mpdu_blk_free(pAd, mpdu_blk); + } + } + } + NdisReleaseSpinLock(&pAd->BATabLock); + + ASSERT(pBAEntry->list.qlen == 0); + /* II. free memory of reordering mpdu table */ + NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock); + os_free_mem(pAd, pAd->mpdu_blk_pool.mem); + NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock); +} + + + +/* + * Allocate all resource for reordering mechanism + */ +BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num) +{ + int i; + PUCHAR mem; + struct reordering_mpdu *mpdu_blk; + struct reordering_list *freelist; + + /* allocate spinlock */ + NdisAllocateSpinLock(&pAd->mpdu_blk_pool.lock); + + /* initialize freelist */ + freelist = &pAd->mpdu_blk_pool.freelist; + freelist->next = NULL; + freelist->qlen = 0; + + DBGPRINT(RT_DEBUG_TRACE, ("Allocate %d memory for BA reordering\n", (UINT32)(num*sizeof(struct reordering_mpdu)))); + + /* allocate number of mpdu_blk memory */ + os_alloc_mem(pAd, (PUCHAR *)&mem, (num*sizeof(struct reordering_mpdu))); + + pAd->mpdu_blk_pool.mem = mem; + + if (mem == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("Can't Allocate Memory for BA Reordering\n")); + return(FALSE); + } + + /* build mpdu_blk free list */ + for (i=0; i<num; i++) + { + /* get mpdu_blk */ + mpdu_blk = (struct reordering_mpdu *) mem; + /* initial mpdu_blk */ + NdisZeroMemory(mpdu_blk, sizeof(struct reordering_mpdu)); + /* next mpdu_blk */ + mem += sizeof(struct reordering_mpdu); + /* insert mpdu_blk into freelist */ + ba_enqueue(freelist, mpdu_blk); + } + + return(TRUE); +} + +//static int blk_count=0; // sample take off, no use + +static struct reordering_mpdu *ba_mpdu_blk_alloc(PRTMP_ADAPTER pAd) +{ + struct reordering_mpdu *mpdu_blk; + + NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock); + mpdu_blk = ba_dequeue(&pAd->mpdu_blk_pool.freelist); + if (mpdu_blk) + { +// blk_count++; + /* reset mpdu_blk */ + NdisZeroMemory(mpdu_blk, sizeof(struct reordering_mpdu)); + } + NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock); + return mpdu_blk; +} + +static void ba_mpdu_blk_free(PRTMP_ADAPTER pAd, struct reordering_mpdu *mpdu_blk) +{ + ASSERT(mpdu_blk); + + NdisAcquireSpinLock(&pAd->mpdu_blk_pool.lock); +// blk_count--; + ba_enqueue(&pAd->mpdu_blk_pool.freelist, mpdu_blk); + NdisReleaseSpinLock(&pAd->mpdu_blk_pool.lock); +} + + +static USHORT ba_indicate_reordering_mpdus_in_order( + IN PRTMP_ADAPTER pAd, + IN PBA_REC_ENTRY pBAEntry, + IN USHORT StartSeq) +{ + struct reordering_mpdu *mpdu_blk; + USHORT LastIndSeq = RESET_RCV_SEQ; + + NdisAcquireSpinLock(&pBAEntry->RxReRingLock); + + while ((mpdu_blk = ba_reordering_mpdu_probe(&pBAEntry->list))) + { + /* find in-order frame */ + if (!SEQ_STEPONE(mpdu_blk->Sequence, StartSeq, MAXSEQ)) + { + break; + } + /* dequeue in-order frame from reodering list */ + mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list); + /* pass this frame up */ + ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk); + /* move to next sequence */ + StartSeq = mpdu_blk->Sequence; + LastIndSeq = StartSeq; + /* free mpdu_blk */ + ba_mpdu_blk_free(pAd, mpdu_blk); + } + + NdisReleaseSpinLock(&pBAEntry->RxReRingLock); + + /* update last indicated sequence */ + return LastIndSeq; +} + +static void ba_indicate_reordering_mpdus_le_seq( + IN PRTMP_ADAPTER pAd, + IN PBA_REC_ENTRY pBAEntry, + IN USHORT Sequence) +{ + struct reordering_mpdu *mpdu_blk; + + NdisAcquireSpinLock(&pBAEntry->RxReRingLock); + while ((mpdu_blk = ba_reordering_mpdu_probe(&pBAEntry->list))) + { + /* find in-order frame */ + if ((mpdu_blk->Sequence == Sequence) || SEQ_SMALLER(mpdu_blk->Sequence, Sequence, MAXSEQ)) + { + /* dequeue in-order frame from reodering list */ + mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list); + /* pass this frame up */ + ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk); + /* free mpdu_blk */ + ba_mpdu_blk_free(pAd, mpdu_blk); + } + else + { + break; + } + } + NdisReleaseSpinLock(&pBAEntry->RxReRingLock); +} + + +static void ba_refresh_reordering_mpdus( + IN PRTMP_ADAPTER pAd, + PBA_REC_ENTRY pBAEntry) +{ + struct reordering_mpdu *mpdu_blk; + + NdisAcquireSpinLock(&pBAEntry->RxReRingLock); + + /* dequeue in-order frame from reodering list */ + while ((mpdu_blk = ba_reordering_mpdu_dequeue(&pBAEntry->list))) + { + /* pass this frame up */ + ANNOUNCE_REORDERING_PACKET(pAd, mpdu_blk); + + pBAEntry->LastIndSeq = mpdu_blk->Sequence; + ba_mpdu_blk_free(pAd, mpdu_blk); + + /* update last indicated sequence */ + } + ASSERT(pBAEntry->list.qlen == 0); + pBAEntry->LastIndSeq = RESET_RCV_SEQ; + NdisReleaseSpinLock(&pBAEntry->RxReRingLock); +} + + +//static +void ba_flush_reordering_timeout_mpdus( + IN PRTMP_ADAPTER pAd, + IN PBA_REC_ENTRY pBAEntry, + IN ULONG Now32) + +{ + USHORT Sequence; + +// if ((RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+REORDERING_PACKET_TIMEOUT)) && +// (pBAEntry->list.qlen > ((pBAEntry->BAWinSize*7)/8))) //|| +// (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(10*REORDERING_PACKET_TIMEOUT))) && +// (pBAEntry->list.qlen > (pBAEntry->BAWinSize/8))) + if (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(MAX_REORDERING_PACKET_TIMEOUT/6))) + &&(pBAEntry->list.qlen > 1) + ) + { + DBGPRINT(RT_DEBUG_TRACE,("timeout[%d] (%08lx-%08lx = %d > %d): %x, flush all!\n ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), + (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), MAX_REORDERING_PACKET_TIMEOUT, + pBAEntry->LastIndSeq)); + ba_refresh_reordering_mpdus(pAd, pBAEntry); + pBAEntry->LastIndSeqAtTimer = Now32; + } + else + if (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer+(REORDERING_PACKET_TIMEOUT))) + && (pBAEntry->list.qlen > 0) + ) + { +// DBGPRINT(RT_DEBUG_OFF, ("timeout[%d] (%lx-%lx = %d > %d): %x, ", pBAEntry->list.qlen, Now32, (pBAEntry->LastIndSeqAtTimer), +// (int)((long) Now32 - (long)(pBAEntry->LastIndSeqAtTimer)), REORDERING_PACKET_TIMEOUT, +// pBAEntry->LastIndSeq)); + // + // force LastIndSeq to shift to LastIndSeq+1 + // + Sequence = (pBAEntry->LastIndSeq+1) & MAXSEQ; + ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence); + pBAEntry->LastIndSeqAtTimer = Now32; + pBAEntry->LastIndSeq = Sequence; + // + // indicate in-order mpdus + // + Sequence = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, Sequence); + if (Sequence != RESET_RCV_SEQ) + { + pBAEntry->LastIndSeq = Sequence; + } + + DBGPRINT(RT_DEBUG_OFF, ("%x, flush one!\n", pBAEntry->LastIndSeq)); + + } +} + + +/* + * generate ADDBA request to + * set up BA agreement + */ +VOID BAOriSessionSetUp( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN UCHAR TID, + IN USHORT TimeOut, + IN ULONG DelayTime, + IN BOOLEAN isForced) + +{ + //MLME_ADDBA_REQ_STRUCT AddbaReq; + BA_ORI_ENTRY *pBAEntry = NULL; + USHORT Idx; + BOOLEAN Cancelled; + + ASSERT(TID < NUM_OF_TID); + + if ((pAd->CommonCfg.BACapability.field.AutoBA != TRUE) && (isForced == FALSE)) + return; + + // if this entry is limited to use legacy tx mode, it doesn't generate BA. + if (RTMPStaFixedTxMode(pAd, pEntry) != FIXED_TXMODE_HT) + return; + + if ((pEntry->BADeclineBitmap & (1<<TID)) && (isForced == FALSE)) + { + // try again after 3 secs + DelayTime = 3000; +// DBGPRINT(RT_DEBUG_TRACE, ("DeCline BA from Peer\n")); +// return; + } + + + Idx = pEntry->BAOriWcidArray[TID]; + if (Idx == 0) + { + // allocate a BA session + pBAEntry = BATableAllocOriEntry(pAd, &Idx); + if (pBAEntry == NULL) + { + DBGPRINT(RT_DEBUG_TRACE,("ADDBA - MlmeADDBAAction() allocate BA session failed \n")); + return; + } + } + else + { + pBAEntry =&pAd->BATable.BAOriEntry[Idx]; + } + + if (pBAEntry->ORI_BA_Status >= Originator_WaitRes) + { + return; + } + + pEntry->BAOriWcidArray[TID] = Idx; + + // Initialize BA session + pBAEntry->ORI_BA_Status = Originator_WaitRes; + pBAEntry->Wcid = pEntry->Aid; + pBAEntry->BAWinSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit; + pBAEntry->Sequence = BA_ORI_INIT_SEQ; + pBAEntry->Token = 1; // (2008-01-21) Jan Lee recommends it - this token can't be 0 + pBAEntry->TID = TID; + pBAEntry->TimeOutValue = TimeOut; + pBAEntry->pAdapter = pAd; + + if (!(pEntry->TXBAbitmap & (1<<TID))) + { + RTMPInitTimer(pAd, &pBAEntry->ORIBATimer, GET_TIMER_FUNCTION(BAOriSessionSetupTimeout), pBAEntry, FALSE); + } + else + RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled); + + // set timer to send ADDBA request + RTMPSetTimer(&pBAEntry->ORIBATimer, DelayTime); +} + +VOID BAOriSessionAdd( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN PFRAME_ADDBA_RSP pFrame) +{ + BA_ORI_ENTRY *pBAEntry = NULL; + BOOLEAN Cancelled; + UCHAR TID; + USHORT Idx; + PUCHAR pOutBuffer2 = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen; + FRAME_BAR FrameBar; + + TID = pFrame->BaParm.TID; + Idx = pEntry->BAOriWcidArray[TID]; + pBAEntry =&pAd->BATable.BAOriEntry[Idx]; + + // Start fill in parameters. + if ((Idx !=0) && (pBAEntry->TID == TID) && (pBAEntry->ORI_BA_Status == Originator_WaitRes)) + { + pBAEntry->BAWinSize = min(pBAEntry->BAWinSize, ((UCHAR)pFrame->BaParm.BufSize)); + BA_MaxWinSizeReasign(pAd, pEntry, &pBAEntry->BAWinSize); + + pBAEntry->TimeOutValue = pFrame->TimeOutValue; + pBAEntry->ORI_BA_Status = Originator_Done; + pAd->BATable.numDoneOriginator ++; + + // reset sequence number + pBAEntry->Sequence = BA_ORI_INIT_SEQ; + // Set Bitmap flag. + pEntry->TXBAbitmap |= (1<<TID); + RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled); + + pBAEntry->ORIBATimer.TimerValue = 0; //pFrame->TimeOutValue; + + DBGPRINT(RT_DEBUG_TRACE,("%s : TXBAbitmap = %x, BAWinSize = %d, TimeOut = %ld\n", __FUNCTION__, pEntry->TXBAbitmap, + pBAEntry->BAWinSize, pBAEntry->ORIBATimer.TimerValue)); + + // SEND BAR ; + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer2); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE,("BA - BAOriSessionAdd() allocate memory failed \n")); + return; + } + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + BarHeaderInit(pAd, &FrameBar, pAd->MacTab.Content[pBAEntry->Wcid].Addr, pAd->CurrentAddress); +#endif // CONFIG_STA_SUPPORT // + + FrameBar.StartingSeq.field.FragNum = 0; // make sure sequence not clear in DEL function. + FrameBar.StartingSeq.field.StartSeq = pBAEntry->Sequence; // make sure sequence not clear in DEL funciton. + FrameBar.BarControl.TID = pBAEntry->TID; // make sure sequence not clear in DEL funciton. + MakeOutgoingFrame(pOutBuffer2, &FrameLen, + sizeof(FRAME_BAR), &FrameBar, + END_OF_ARGS); + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer2, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer2); + + + if (pBAEntry->ORIBATimer.TimerValue) + RTMPSetTimer(&pBAEntry->ORIBATimer, pBAEntry->ORIBATimer.TimerValue); // in mSec + } +} + +BOOLEAN BARecSessionAdd( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN PFRAME_ADDBA_REQ pFrame) +{ + BA_REC_ENTRY *pBAEntry = NULL; + BOOLEAN Status = TRUE; + BOOLEAN Cancelled; + USHORT Idx; + UCHAR TID; + UCHAR BAWinSize; + //UINT32 Value; + //UINT offset; + + + ASSERT(pEntry); + + // find TID + TID = pFrame->BaParm.TID; + + BAWinSize = min(((UCHAR)pFrame->BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit); + + // Intel patch + if (BAWinSize == 0) + { + BAWinSize = 64; + } + + // get software BA rec array index, Idx + Idx = pEntry->BARecWcidArray[TID]; + + + if (Idx == 0) + { + // allocate new array entry for the new session + pBAEntry = BATableAllocRecEntry(pAd, &Idx); + } + else + { + pBAEntry = &pAd->BATable.BARecEntry[Idx]; + // flush all pending reordering mpdus + ba_refresh_reordering_mpdus(pAd, pBAEntry); + } + + DBGPRINT(RT_DEBUG_TRACE,("%s(%ld): Idx = %d, BAWinSize(req %d) = %d\n", __FUNCTION__, pAd->BATable.numAsRecipient, Idx, + pFrame->BaParm.BufSize, BAWinSize)); + + // Start fill in parameters. + if (pBAEntry != NULL) + { + ASSERT(pBAEntry->list.qlen == 0); + + pBAEntry->REC_BA_Status = Recipient_HandleRes; + pBAEntry->BAWinSize = BAWinSize; + pBAEntry->Wcid = pEntry->Aid; + pBAEntry->TID = TID; + pBAEntry->TimeOutValue = pFrame->TimeOutValue; + pBAEntry->REC_BA_Status = Recipient_Accept; + // initial sequence number + pBAEntry->LastIndSeq = RESET_RCV_SEQ; //pFrame->BaStartSeq.field.StartSeq; + + DBGPRINT(RT_DEBUG_OFF, ("Start Seq = %08x\n", pFrame->BaStartSeq.field.StartSeq)); + + if (pEntry->RXBAbitmap & (1<<TID)) + { + RTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled); + } + else + { + RTMPInitTimer(pAd, &pBAEntry->RECBATimer, GET_TIMER_FUNCTION(BARecSessionIdleTimeout), pBAEntry, TRUE); + } + + + // Set Bitmap flag. + pEntry->RXBAbitmap |= (1<<TID); + pEntry->BARecWcidArray[TID] = Idx; + + pEntry->BADeclineBitmap &= ~(1<<TID); + + // Set BA session mask in WCID table. + RTMP_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID); + + DBGPRINT(RT_DEBUG_TRACE,("MACEntry[%d]RXBAbitmap = 0x%x. BARecWcidArray=%d\n", + pEntry->Aid, pEntry->RXBAbitmap, pEntry->BARecWcidArray[TID])); + } + else + { + Status = FALSE; + DBGPRINT(RT_DEBUG_TRACE,("Can't Accept ADDBA for %02x:%02x:%02x:%02x:%02x:%02x TID = %d\n", + PRINT_MAC(pEntry->Addr), TID)); + } + return(Status); +} + + +BA_REC_ENTRY *BATableAllocRecEntry( + IN PRTMP_ADAPTER pAd, + OUT USHORT *Idx) +{ + int i; + BA_REC_ENTRY *pBAEntry = NULL; + + + NdisAcquireSpinLock(&pAd->BATabLock); + + if (pAd->BATable.numAsRecipient >= (MAX_LEN_OF_BA_REC_TABLE - 1)) + { + DBGPRINT(RT_DEBUG_OFF, ("BA Recipeint Session (%ld) > %d\n", + pAd->BATable.numAsRecipient, (MAX_LEN_OF_BA_REC_TABLE - 1))); + goto done; + } + + // reserve idx 0 to identify BAWcidArray[TID] as empty + for (i=1; i < MAX_LEN_OF_BA_REC_TABLE; i++) + { + pBAEntry =&pAd->BATable.BARecEntry[i]; + if ((pBAEntry->REC_BA_Status == Recipient_NONE)) + { + // get one + pAd->BATable.numAsRecipient++; + pBAEntry->REC_BA_Status = Recipient_USED; + *Idx = i; + break; + } + } + +done: + NdisReleaseSpinLock(&pAd->BATabLock); + return pBAEntry; +} + +BA_ORI_ENTRY *BATableAllocOriEntry( + IN PRTMP_ADAPTER pAd, + OUT USHORT *Idx) +{ + int i; + BA_ORI_ENTRY *pBAEntry = NULL; + + NdisAcquireSpinLock(&pAd->BATabLock); + + if (pAd->BATable.numAsOriginator >= (MAX_LEN_OF_BA_ORI_TABLE - 1)) + { + goto done; + } + + // reserve idx 0 to identify BAWcidArray[TID] as empty + for (i=1; i<MAX_LEN_OF_BA_ORI_TABLE; i++) + { + pBAEntry =&pAd->BATable.BAOriEntry[i]; + if ((pBAEntry->ORI_BA_Status == Originator_NONE)) + { + // get one + pAd->BATable.numAsOriginator++; + pBAEntry->ORI_BA_Status = Originator_USED; + pBAEntry->pAdapter = pAd; + *Idx = i; + break; + } + } + +done: + NdisReleaseSpinLock(&pAd->BATabLock); + return pBAEntry; +} + + +VOID BATableFreeOriEntry( + IN PRTMP_ADAPTER pAd, + IN ULONG Idx) +{ + BA_ORI_ENTRY *pBAEntry = NULL; + MAC_TABLE_ENTRY *pEntry; + + + if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE)) + return; + + pBAEntry =&pAd->BATable.BAOriEntry[Idx]; + + if (pBAEntry->ORI_BA_Status != Originator_NONE) + { + pEntry = &pAd->MacTab.Content[pBAEntry->Wcid]; + pEntry->BAOriWcidArray[pBAEntry->TID] = 0; + + + NdisAcquireSpinLock(&pAd->BATabLock); + if (pBAEntry->ORI_BA_Status == Originator_Done) + { + pAd->BATable.numDoneOriginator -= 1; + pEntry->TXBAbitmap &= (~(1<<(pBAEntry->TID) )); + DBGPRINT(RT_DEBUG_TRACE, ("BATableFreeOriEntry numAsOriginator= %ld\n", pAd->BATable.numAsRecipient)); + // Erase Bitmap flag. + } + + ASSERT(pAd->BATable.numAsOriginator != 0); + + pAd->BATable.numAsOriginator -= 1; + + pBAEntry->ORI_BA_Status = Originator_NONE; + pBAEntry->Token = 0; + NdisReleaseSpinLock(&pAd->BATabLock); + } +} + + +VOID BATableFreeRecEntry( + IN PRTMP_ADAPTER pAd, + IN ULONG Idx) +{ + BA_REC_ENTRY *pBAEntry = NULL; + MAC_TABLE_ENTRY *pEntry; + + + if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_REC_TABLE)) + return; + + pBAEntry =&pAd->BATable.BARecEntry[Idx]; + + if (pBAEntry->REC_BA_Status != Recipient_NONE) + { + pEntry = &pAd->MacTab.Content[pBAEntry->Wcid]; + pEntry->BARecWcidArray[pBAEntry->TID] = 0; + + NdisAcquireSpinLock(&pAd->BATabLock); + + ASSERT(pAd->BATable.numAsRecipient != 0); + + pAd->BATable.numAsRecipient -= 1; + + pBAEntry->REC_BA_Status = Recipient_NONE; + NdisReleaseSpinLock(&pAd->BATabLock); + } +} + + +VOID BAOriSessionTearDown( + IN OUT PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR TID, + IN BOOLEAN bPassive, + IN BOOLEAN bForceSend) +{ + ULONG Idx = 0; + BA_ORI_ENTRY *pBAEntry; + BOOLEAN Cancelled; + + if (Wcid >= MAX_LEN_OF_MAC_TABLE) + { + return; + } + + // + // Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID). + // + Idx = pAd->MacTab.Content[Wcid].BAOriWcidArray[TID]; + if ((Idx == 0) || (Idx >= MAX_LEN_OF_BA_ORI_TABLE)) + { + if (bForceSend == TRUE) + { + // force send specified TID DelBA + MLME_DELBA_REQ_STRUCT DelbaReq; + MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); + if (Elem != NULL) + { + NdisZeroMemory(&DelbaReq, sizeof(DelbaReq)); + NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM)); + + COPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr); + DelbaReq.Wcid = Wcid; + DelbaReq.TID = TID; + DelbaReq.Initiator = ORIGINATOR; + Elem->MsgLen = sizeof(DelbaReq); + NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq)); + MlmeDELBAAction(pAd, Elem); + kfree(Elem); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s(bForceSend):alloc memory failed!\n", __FUNCTION__)); + } + } + + return; + } + + DBGPRINT(RT_DEBUG_TRACE,("%s===>Wcid=%d.TID=%d \n", __FUNCTION__, Wcid, TID)); + + pBAEntry = &pAd->BATable.BAOriEntry[Idx]; + DBGPRINT(RT_DEBUG_TRACE,("\t===>Idx = %ld, Wcid=%d.TID=%d, ORI_BA_Status = %d \n", Idx, Wcid, TID, pBAEntry->ORI_BA_Status)); + // + // Prepare DelBA action frame and send to the peer. + // + if ((bPassive == FALSE) && (TID == pBAEntry->TID) && (pBAEntry->ORI_BA_Status == Originator_Done)) + { + MLME_DELBA_REQ_STRUCT DelbaReq; + MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); + if (Elem != NULL) + { + NdisZeroMemory(&DelbaReq, sizeof(DelbaReq)); + NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM)); + + COPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr); + DelbaReq.Wcid = Wcid; + DelbaReq.TID = pBAEntry->TID; + DelbaReq.Initiator = ORIGINATOR; + Elem->MsgLen = sizeof(DelbaReq); + NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq)); + MlmeDELBAAction(pAd, Elem); + kfree(Elem); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s():alloc memory failed!\n", __FUNCTION__)); + return; + } + } + RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled); + BATableFreeOriEntry(pAd, Idx); + + if (bPassive) + { + //BAOriSessionSetUp(pAd, &pAd->MacTab.Content[Wcid], TID, 0, 10000, TRUE); + } +} + +VOID BARecSessionTearDown( + IN OUT PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR TID, + IN BOOLEAN bPassive) +{ + ULONG Idx = 0; + BA_REC_ENTRY *pBAEntry; + + if (Wcid >= MAX_LEN_OF_MAC_TABLE) + { + return; + } + + // + // Locate corresponding BA Originator Entry in BA Table with the (pAddr,TID). + // + Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID]; + if (Idx == 0) + return; + + DBGPRINT(RT_DEBUG_TRACE,("%s===>Wcid=%d.TID=%d \n", __FUNCTION__, Wcid, TID)); + + + pBAEntry = &pAd->BATable.BARecEntry[Idx]; + DBGPRINT(RT_DEBUG_TRACE,("\t===>Idx = %ld, Wcid=%d.TID=%d, REC_BA_Status = %d \n", Idx, Wcid, TID, pBAEntry->REC_BA_Status)); + // + // Prepare DelBA action frame and send to the peer. + // + if ((TID == pBAEntry->TID) && (pBAEntry->REC_BA_Status == Recipient_Accept)) + { + MLME_DELBA_REQ_STRUCT DelbaReq; + BOOLEAN Cancelled; + //ULONG offset; + //UINT32 VALUE; + + RTMPCancelTimer(&pBAEntry->RECBATimer, &Cancelled); + + // + // 1. Send DELBA Action Frame + // + if (bPassive == FALSE) + { + MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); + if (Elem != NULL) + { + NdisZeroMemory(&DelbaReq, sizeof(DelbaReq)); + NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM)); + + COPY_MAC_ADDR(DelbaReq.Addr, pAd->MacTab.Content[Wcid].Addr); + DelbaReq.Wcid = Wcid; + DelbaReq.TID = TID; + DelbaReq.Initiator = RECIPIENT; + Elem->MsgLen = sizeof(DelbaReq); + NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq)); + MlmeDELBAAction(pAd, Elem); + kfree(Elem); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s():alloc memory failed!\n", __FUNCTION__)); + return; + } + } + + + // + // 2. Free resource of BA session + // + // flush all pending reordering mpdus + ba_refresh_reordering_mpdus(pAd, pBAEntry); + + NdisAcquireSpinLock(&pAd->BATabLock); + + // Erase Bitmap flag. + pBAEntry->LastIndSeq = RESET_RCV_SEQ; + pBAEntry->BAWinSize = 0; + // Erase Bitmap flag at software mactable + pAd->MacTab.Content[Wcid].RXBAbitmap &= (~(1<<(pBAEntry->TID))); + pAd->MacTab.Content[Wcid].BARecWcidArray[TID] = 0; + + RTMP_DEL_BA_SESSION_FROM_ASIC(pAd, Wcid, TID); + + NdisReleaseSpinLock(&pAd->BATabLock); + + } + + BATableFreeRecEntry(pAd, Idx); +} + +VOID BASessionTearDownALL( + IN OUT PRTMP_ADAPTER pAd, + IN UCHAR Wcid) +{ + int i; + + for (i=0; i<NUM_OF_TID; i++) + { + BAOriSessionTearDown(pAd, Wcid, i, FALSE, FALSE); + BARecSessionTearDown(pAd, Wcid, i, FALSE); + } +} + + +/* + ========================================================================== + Description: + Retry sending ADDBA Reqest. + + IRQL = DISPATCH_LEVEL + + Parametrs: + p8023Header: if this is already 802.3 format, p8023Header is NULL + + Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere. + FALSE , then continue indicaterx at this moment. + ========================================================================== + */ +VOID BAOriSessionSetupTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + BA_ORI_ENTRY *pBAEntry = (BA_ORI_ENTRY *)FunctionContext; + MAC_TABLE_ENTRY *pEntry; + PRTMP_ADAPTER pAd; + + if (pBAEntry == NULL) + return; + + pAd = pBAEntry->pAdapter; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Do nothing if monitor mode is on + if (MONITOR_ON(pAd)) + return; + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef RALINK_ATE + // Nothing to do in ATE mode. + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + + pEntry = &pAd->MacTab.Content[pBAEntry->Wcid]; + + if ((pBAEntry->ORI_BA_Status == Originator_WaitRes) && (pBAEntry->Token < ORI_SESSION_MAX_RETRY)) + { + MLME_ADDBA_REQ_STRUCT AddbaReq; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (INFRA_ON(pAd) && + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) && + (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))) + { + /* In scan progress and have no chance to send out, just re-schedule to another time period */ + RTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT); + return; + } + } +#endif // CONFIG_STA_SUPPORT // + + NdisZeroMemory(&AddbaReq, sizeof(AddbaReq)); + COPY_MAC_ADDR(AddbaReq.pAddr, pEntry->Addr); + AddbaReq.Wcid = (UCHAR)(pEntry->Aid); + AddbaReq.TID = pBAEntry->TID; + AddbaReq.BaBufSize = pAd->CommonCfg.BACapability.field.RxBAWinLimit; + AddbaReq.TimeOutValue = 0; + AddbaReq.Token = pBAEntry->Token; + MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ADD_BA_CATE, sizeof(MLME_ADDBA_REQ_STRUCT), (PVOID)&AddbaReq, 0); + RTMP_MLME_HANDLER(pAd); + DBGPRINT(RT_DEBUG_TRACE,("BA Ori Session Timeout(%d) : Send ADD BA again\n", pBAEntry->Token)); + + pBAEntry->Token++; + RTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT); + } + else + { + BATableFreeOriEntry(pAd, pEntry->BAOriWcidArray[pBAEntry->TID]); + } +} + +/* + ========================================================================== + Description: + Retry sending ADDBA Reqest. + + IRQL = DISPATCH_LEVEL + + Parametrs: + p8023Header: if this is already 802.3 format, p8023Header is NULL + + Return : TRUE if put into rx reordering buffer, shouldn't indicaterxhere. + FALSE , then continue indicaterx at this moment. + ========================================================================== + */ +VOID BARecSessionIdleTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + + BA_REC_ENTRY *pBAEntry = (BA_REC_ENTRY *)FunctionContext; + PRTMP_ADAPTER pAd; + ULONG Now32; + + if (pBAEntry == NULL) + return; + + if ((pBAEntry->REC_BA_Status == Recipient_Accept)) + { + NdisGetSystemUpTime(&Now32); + + if (RTMP_TIME_AFTER((unsigned long)Now32, (unsigned long)(pBAEntry->LastIndSeqAtTimer + REC_BA_SESSION_IDLE_TIMEOUT))) + { + pAd = pBAEntry->pAdapter; + // flush all pending reordering mpdus + ba_refresh_reordering_mpdus(pAd, pBAEntry); + DBGPRINT(RT_DEBUG_OFF, ("%ld: REC BA session Timeout\n", Now32)); + } + } +} + + +VOID PeerAddBAReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) + +{ + // 7.4.4.1 + //ULONG Idx; + UCHAR Status = 1; + UCHAR pAddr[6]; + FRAME_ADDBA_RSP ADDframe; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + PFRAME_ADDBA_REQ pAddreqFrame = NULL; + //UCHAR BufSize; + ULONG FrameLen; + PULONG ptemp; + PMAC_TABLE_ENTRY pMacEntry; + + DBGPRINT(RT_DEBUG_TRACE, ("%s ==> (Wcid = %d)\n", __FUNCTION__, Elem->Wcid)); + + //hex_dump("AddBAReq", Elem->Msg, Elem->MsgLen); + + //ADDBA Request from unknown peer, ignore this. + if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) + return; + + pMacEntry = &pAd->MacTab.Content[Elem->Wcid]; + DBGPRINT(RT_DEBUG_TRACE,("BA - PeerAddBAReqAction----> \n")); + ptemp = (PULONG)Elem->Msg; + //DBGPRINT_RAW(RT_DEBUG_EMU, ("%08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x:: %08x\n", *(ptemp), *(ptemp+1), *(ptemp+2), *(ptemp+3), *(ptemp+4), *(ptemp+5), *(ptemp+6), *(ptemp+7), *(ptemp+8))); + + if (PeerAddBAReqActionSanity(pAd, Elem->Msg, Elem->MsgLen, pAddr)) + { + + if ((pAd->CommonCfg.bBADecline == FALSE) && IS_HT_STA(pMacEntry)) + { + pAddreqFrame = (PFRAME_ADDBA_REQ)(&Elem->Msg[0]); + DBGPRINT(RT_DEBUG_OFF, ("Rcv Wcid(%d) AddBAReq\n", Elem->Wcid)); + if (BARecSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pAddreqFrame)) + Status = 0; + else + Status = 38; // more parameters have invalid values + } + else + { + Status = 37; // the request has been declined. + } + } + + if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[Elem->Wcid])) + ASSERT(pAd->MacTab.Content[Elem->Wcid].Sst == SST_ASSOC); + + pAddreqFrame = (PFRAME_ADDBA_REQ)(&Elem->Msg[0]); + // 2. Always send back ADDBA Response + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE,("ACTION - PeerBAAction() allocate memory failed \n")); + return; + } + + NdisZeroMemory(&ADDframe, sizeof(FRAME_ADDBA_RSP)); + // 2-1. Prepare ADDBA Response frame. +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (ADHOC_ON(pAd) +#ifdef QOS_DLS_SUPPORT + || (IS_ENTRY_DLS(&pAd->MacTab.Content[Elem->Wcid])) +#endif // QOS_DLS_SUPPORT // + ) + ActHeaderInit(pAd, &ADDframe.Hdr, pAddr, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + else + ActHeaderInit(pAd, &ADDframe.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAddr); + } +#endif // CONFIG_STA_SUPPORT // + ADDframe.Category = CATEGORY_BA; + ADDframe.Action = ADDBA_RESP; + ADDframe.Token = pAddreqFrame->Token; + // What is the Status code?? need to check. + ADDframe.StatusCode = Status; + ADDframe.BaParm.BAPolicy = IMMED_BA; + ADDframe.BaParm.AMSDUSupported = 0; + ADDframe.BaParm.TID = pAddreqFrame->BaParm.TID; + ADDframe.BaParm.BufSize = min(((UCHAR)pAddreqFrame->BaParm.BufSize), (UCHAR)pAd->CommonCfg.BACapability.field.RxBAWinLimit); + if (ADDframe.BaParm.BufSize == 0) + { + ADDframe.BaParm.BufSize = 64; + } + ADDframe.TimeOutValue = 0; //pAddreqFrame->TimeOutValue; + + *(USHORT *)(&ADDframe.BaParm) = cpu2le16(*(USHORT *)(&ADDframe.BaParm)); + ADDframe.StatusCode = cpu2le16(ADDframe.StatusCode); + ADDframe.TimeOutValue = cpu2le16(ADDframe.TimeOutValue); + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(FRAME_ADDBA_RSP), &ADDframe, + END_OF_ARGS); + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + DBGPRINT(RT_DEBUG_TRACE, ("%s(%d): TID(%d), BufSize(%d) <== \n", __FUNCTION__, Elem->Wcid, ADDframe.BaParm.TID, + ADDframe.BaParm.BufSize)); +} + + +VOID PeerAddBARspAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) + +{ + //UCHAR Idx, i; + //PUCHAR pOutBuffer = NULL; + PFRAME_ADDBA_RSP pFrame = NULL; + //PBA_ORI_ENTRY pBAEntry; + + //ADDBA Response from unknown peer, ignore this. + if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) + return; + + DBGPRINT(RT_DEBUG_TRACE, ("%s ==> Wcid(%d)\n", __FUNCTION__, Elem->Wcid)); + + //hex_dump("PeerAddBARspAction()", Elem->Msg, Elem->MsgLen); + + if (PeerAddBARspActionSanity(pAd, Elem->Msg, Elem->MsgLen)) + { + pFrame = (PFRAME_ADDBA_RSP)(&Elem->Msg[0]); + + DBGPRINT(RT_DEBUG_TRACE, ("\t\t StatusCode = %d\n", pFrame->StatusCode)); + switch (pFrame->StatusCode) + { + case 0: + // I want a BAsession with this peer as an originator. + BAOriSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pFrame); + break; + default: + // check status == USED ??? + BAOriSessionTearDown(pAd, Elem->Wcid, pFrame->BaParm.TID, TRUE, FALSE); + break; + } + // Rcv Decline StatusCode + if ((pFrame->StatusCode == 37) +#ifdef CONFIG_STA_SUPPORT + || ((pAd->OpMode == OPMODE_STA) && STA_TGN_WIFI_ON(pAd) && (pFrame->StatusCode != 0)) +#endif // CONFIG_STA_SUPPORT // + ) + { + pAd->MacTab.Content[Elem->Wcid].BADeclineBitmap |= 1<<pFrame->BaParm.TID; + } + } +} + +VOID PeerDelBAAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) + +{ + //UCHAR Idx; + //PUCHAR pOutBuffer = NULL; + PFRAME_DELBA_REQ pDelFrame = NULL; + + DBGPRINT(RT_DEBUG_TRACE,("%s ==>\n", __FUNCTION__)); + //DELBA Request from unknown peer, ignore this. + if (PeerDelBAActionSanity(pAd, Elem->Wcid, Elem->Msg, Elem->MsgLen)) + { + pDelFrame = (PFRAME_DELBA_REQ)(&Elem->Msg[0]); + if (pDelFrame->DelbaParm.Initiator == ORIGINATOR) + { + DBGPRINT(RT_DEBUG_TRACE,("BA - PeerDelBAAction----> ORIGINATOR\n")); + BARecSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE); + } + else + { + DBGPRINT(RT_DEBUG_TRACE,("BA - PeerDelBAAction----> RECIPIENT, Reason = %d\n", pDelFrame->ReasonCode)); + //hex_dump("DelBA Frame", pDelFrame, Elem->MsgLen); + BAOriSessionTearDown(pAd, Elem->Wcid, pDelFrame->DelbaParm.TID, TRUE, FALSE); + } + } +} + + +BOOLEAN CntlEnqueueForRecv( + IN PRTMP_ADAPTER pAd, + IN ULONG Wcid, + IN ULONG MsgLen, + IN PFRAME_BA_REQ pMsg) +{ + PFRAME_BA_REQ pFrame = pMsg; + //PRTMP_REORDERBUF pBuffer; + //PRTMP_REORDERBUF pDmaBuf; + PBA_REC_ENTRY pBAEntry; + //BOOLEAN Result; + ULONG Idx; + //UCHAR NumRxPkt; + UCHAR TID;//, i; + + TID = (UCHAR)pFrame->BARControl.TID; + + DBGPRINT(RT_DEBUG_TRACE, ("%s(): BAR-Wcid(%ld), Tid (%d)\n", __FUNCTION__, Wcid, TID)); + //hex_dump("BAR", (PCHAR) pFrame, MsgLen); + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return FALSE; + + // First check the size, it MUST not exceed the mlme queue size + if (MsgLen > MGMT_DMA_BUFFER_SIZE) + { + DBGPRINT_ERR(("CntlEnqueueForRecv: frame too large, size = %ld \n", MsgLen)); + return FALSE; + } + else if (MsgLen != sizeof(FRAME_BA_REQ)) + { + DBGPRINT_ERR(("CntlEnqueueForRecv: BlockAck Request frame length size = %ld incorrect\n", MsgLen)); + return FALSE; + } + else if (MsgLen != sizeof(FRAME_BA_REQ)) + { + DBGPRINT_ERR(("CntlEnqueueForRecv: BlockAck Request frame length size = %ld incorrect\n", MsgLen)); + return FALSE; + } + + if ((Wcid < MAX_LEN_OF_MAC_TABLE) && (TID < 8)) + { + // if this receiving packet is from SA that is in our OriEntry. Since WCID <9 has direct mapping. no need search. + Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID]; + pBAEntry = &pAd->BATable.BARecEntry[Idx]; + } + else + { + return FALSE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("BAR(%ld) : Tid (%d) - %04x:%04x\n", Wcid, TID, pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq )); + + if (SEQ_SMALLER(pBAEntry->LastIndSeq, pFrame->BAStartingSeq.field.StartSeq, MAXSEQ)) + { + //DBGPRINT(RT_DEBUG_TRACE, ("BAR Seq = %x, LastIndSeq = %x\n", pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq)); + ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, pFrame->BAStartingSeq.field.StartSeq); + pBAEntry->LastIndSeq = (pFrame->BAStartingSeq.field.StartSeq == 0) ? MAXSEQ :(pFrame->BAStartingSeq.field.StartSeq -1); + } + //ba_refresh_reordering_mpdus(pAd, pBAEntry); + return TRUE; +} + +/* +Description : Send PSMP Action frame If PSMP mode switches. +*/ +VOID SendPSMPAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR Psmp) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + //ULONG Idx; + FRAME_PSMP_ACTION Frame; + ULONG FrameLen; + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_ERROR,("BA - MlmeADDBAAction() allocate memory failed \n")); + return; + } +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + ActHeaderInit(pAd, &Frame.Hdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->MacTab.Content[Wcid].Addr); +#endif // CONFIG_STA_SUPPORT // + + Frame.Category = CATEGORY_HT; + Frame.Action = SMPS_ACTION; + switch (Psmp) + { + case MMPS_ENABLE: +#ifdef RT30xx + if (IS_RT30xx(pAd) + &&(pAd->Antenna.field.RxPath>1||pAd->Antenna.field.TxPath>1)) + { + RTMP_ASIC_MMPS_DISABLE(pAd); + } +#endif // RT30xx // + Frame.Psmp = 0; + break; + case MMPS_DYNAMIC: + Frame.Psmp = 3; + break; + case MMPS_STATIC: +#ifdef RT30xx + if (IS_RT30xx(pAd) + &&(pAd->Antenna.field.RxPath>1||pAd->Antenna.field.TxPath>1)) + { + RTMP_ASIC_MMPS_ENABLE(pAd); + } +#endif // RT30xx // + Frame.Psmp = 1; + break; + } + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(FRAME_PSMP_ACTION), &Frame, + END_OF_ARGS); + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + DBGPRINT(RT_DEBUG_ERROR,("HT - SendPSMPAction( %d ) \n", Frame.Psmp)); +} + + +#define RADIO_MEASUREMENT_REQUEST_ACTION 0 + +typedef struct GNU_PACKED +{ + UCHAR RegulatoryClass; + UCHAR ChannelNumber; + USHORT RandomInterval; + USHORT MeasurementDuration; + UCHAR MeasurementMode; + UCHAR BSSID[MAC_ADDR_LEN]; + UCHAR ReportingCondition; + UCHAR Threshold; + UCHAR SSIDIE[2]; // 2 byte +} BEACON_REQUEST; + +typedef struct GNU_PACKED +{ + UCHAR ID; + UCHAR Length; + UCHAR Token; + UCHAR RequestMode; + UCHAR Type; +} MEASUREMENT_REQ; + + + + +void convert_reordering_packet_to_preAMSDU_or_802_3_packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + PNDIS_PACKET pRxPkt; + UCHAR Header802_3[LENGTH_802_3]; + + // 1. get 802.3 Header + // 2. remove LLC + // a. pointer pRxBlk->pData to payload + // b. modify pRxBlk->DataSize + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3); +#endif // CONFIG_STA_SUPPORT // + + ASSERT(pRxBlk->pRxPacket); + pRxPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); + + SET_OS_PKT_NETDEV(pRxPkt, get_netdev_from_bssid(pAd, FromWhichBSSID)); + SET_OS_PKT_DATAPTR(pRxPkt, pRxBlk->pData); + SET_OS_PKT_LEN(pRxPkt, pRxBlk->DataSize); + SET_OS_PKT_DATATAIL(pRxPkt, pRxBlk->pData, pRxBlk->DataSize); + + // + // copy 802.3 header, if necessary + // + if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU)) + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef LINUX + NdisMoveMemory(skb_push(pRxPkt, LENGTH_802_3), Header802_3, LENGTH_802_3); +#endif + } +#endif // CONFIG_STA_SUPPORT // + } +} + + +#define INDICATE_LEGACY_OR_AMSDU(_pAd, _pRxBlk, _fromWhichBSSID) \ + do \ + { \ + if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_AMSDU)) \ + { \ + Indicate_AMSDU_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \ + } \ + else if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_EAP)) \ + { \ + Indicate_EAPOL_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \ + } \ + else \ + { \ + Indicate_Legacy_Packet(_pAd, _pRxBlk, _fromWhichBSSID); \ + } \ + } while (0); + + + +static VOID ba_enqueue_reordering_packet( + IN PRTMP_ADAPTER pAd, + IN PBA_REC_ENTRY pBAEntry, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + struct reordering_mpdu *mpdu_blk; + UINT16 Sequence = (UINT16) pRxBlk->pHeader->Sequence; + + mpdu_blk = ba_mpdu_blk_alloc(pAd); + if ((mpdu_blk != NULL) && + (!RX_BLK_TEST_FLAG(pRxBlk, fRX_EAP))) + { + // Write RxD buffer address & allocated buffer length + NdisAcquireSpinLock(&pBAEntry->RxReRingLock); + + mpdu_blk->Sequence = Sequence; + + mpdu_blk->bAMSDU = RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU); + + convert_reordering_packet_to_preAMSDU_or_802_3_packet(pAd, pRxBlk, FromWhichBSSID); + + STATS_INC_RX_PACKETS(pAd, FromWhichBSSID); + + // + // it is necessary for reordering packet to record + // which BSS it come from + // + RTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID); + + mpdu_blk->pPacket = pRxBlk->pRxPacket; + + if (ba_reordering_mpdu_insertsorted(&pBAEntry->list, mpdu_blk) == FALSE) + { + // had been already within reordering list + // don't indicate + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_SUCCESS); + ba_mpdu_blk_free(pAd, mpdu_blk); + } + + ASSERT((0<= pBAEntry->list.qlen) && (pBAEntry->list.qlen <= pBAEntry->BAWinSize)); + NdisReleaseSpinLock(&pBAEntry->RxReRingLock); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("!!! (%d) Can't allocate reordering mpdu blk\n", + pBAEntry->list.qlen)); + /* + * flush all pending reordering mpdus + * and receving mpdu to upper layer + * make tcp/ip to take care reordering mechanism + */ + //ba_refresh_reordering_mpdus(pAd, pBAEntry); + ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, Sequence); + + pBAEntry->LastIndSeq = Sequence; + INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID); + } +} + + +/* + ========================================================================== + Description: + Indicate this packet to upper layer or put it into reordering buffer + + Parametrs: + pRxBlk : carry necessary packet info 802.11 format + FromWhichBSSID : the packet received from which BSS + + Return : + none + + Note : + the packet queued into reordering buffer need to cover to 802.3 format + or pre_AMSDU format + ========================================================================== + */ + +VOID Indicate_AMPDU_Packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + USHORT Idx; + PBA_REC_ENTRY pBAEntry = NULL; + UINT16 Sequence = pRxBlk->pHeader->Sequence; + ULONG Now32; + UCHAR Wcid = pRxBlk->pRxWI->WirelessCliID; + UCHAR TID = pRxBlk->pRxWI->TID; + + + if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU) && (pRxBlk->DataSize > MAX_RX_PKT_LEN)) + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + + + if (Wcid < MAX_LEN_OF_MAC_TABLE) + { + Idx = pAd->MacTab.Content[Wcid].BARecWcidArray[TID]; + if (Idx == 0) + { + /* Rec BA Session had been torn down */ + INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID); + return; + } + pBAEntry = &pAd->BATable.BARecEntry[Idx]; + } + else + { + // impossible !!! + ASSERT(0); + // release packet + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + ASSERT(pBAEntry); + + // update last rx time + NdisGetSystemUpTime(&Now32); + + pBAEntry->rcvSeq = Sequence; + + + ba_flush_reordering_timeout_mpdus(pAd, pBAEntry, Now32); + pBAEntry->LastIndSeqAtTimer = Now32; + + // + // Reset Last Indicate Sequence + // + if (pBAEntry->LastIndSeq == RESET_RCV_SEQ) + { + ASSERT((pBAEntry->list.qlen == 0) && (pBAEntry->list.next == NULL)); + + // reset rcv sequence of BA session + pBAEntry->LastIndSeq = Sequence; + pBAEntry->LastIndSeqAtTimer = Now32; + INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID); + return; + } + + // + // I. Check if in order. + // + if (SEQ_STEPONE(Sequence, pBAEntry->LastIndSeq, MAXSEQ)) + { + USHORT LastIndSeq; + + pBAEntry->LastIndSeq = Sequence; + INDICATE_LEGACY_OR_AMSDU(pAd, pRxBlk, FromWhichBSSID); + LastIndSeq = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, pBAEntry->LastIndSeq); + if (LastIndSeq != RESET_RCV_SEQ) + { + pBAEntry->LastIndSeq = LastIndSeq; + } + pBAEntry->LastIndSeqAtTimer = Now32; + } + // + // II. Drop Duplicated Packet + // + else if (Sequence == pBAEntry->LastIndSeq) + { + + // drop and release packet + pBAEntry->nDropPacket++; + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + } + // + // III. Drop Old Received Packet + // + else if (SEQ_SMALLER(Sequence, pBAEntry->LastIndSeq, MAXSEQ)) + { + + // drop and release packet + pBAEntry->nDropPacket++; + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + } + // + // IV. Receive Sequence within Window Size + // + else if (SEQ_SMALLER(Sequence, (((pBAEntry->LastIndSeq+pBAEntry->BAWinSize+1)) & MAXSEQ), MAXSEQ)) + { + ba_enqueue_reordering_packet(pAd, pBAEntry, pRxBlk, FromWhichBSSID); + } + // + // V. Receive seq surpasses Win(lastseq + nMSDU). So refresh all reorder buffer + // + else + { + LONG WinStartSeq, TmpSeq; + + + TmpSeq = Sequence - (pBAEntry->BAWinSize) -1; + if (TmpSeq < 0) + { + TmpSeq = (MAXSEQ+1) + TmpSeq; + } + WinStartSeq = (TmpSeq+1) & MAXSEQ; + ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, WinStartSeq); + pBAEntry->LastIndSeq = WinStartSeq; //TmpSeq; + + pBAEntry->LastIndSeqAtTimer = Now32; + + ba_enqueue_reordering_packet(pAd, pBAEntry, pRxBlk, FromWhichBSSID); + + TmpSeq = ba_indicate_reordering_mpdus_in_order(pAd, pBAEntry, pBAEntry->LastIndSeq); + if (TmpSeq != RESET_RCV_SEQ) + { + pBAEntry->LastIndSeq = TmpSeq; + } + } +} + +#endif // DOT11_N_SUPPORT // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/br_ftph.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/br_ftph.c new file mode 100644 index 000000000..46fab70a3 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/br_ftph.c @@ -0,0 +1,212 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + bg_ftph.c + + Abstract: + Provide fast path between LAN and WLAN. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Sample Lin 01-22-2008 Created + + */ + +#include "rt_config.h" + +#ifdef BG_FT_SUPPORT +#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) +#include <linux/netfilter_bridge.h> +#include "../net/bridge/br_private.h" + +/* extern export symbol in other drivers */ +/* + Example in other drivers: + UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket); + EXPORT_SYMBOL(RALINK_FP_Handle); + + packet_forward() + { + UINT32 HandRst = 1; + + ...... + + if (RALINK_FP_Handle != NULL) + HandRst = RALINK_FP_Handle(skb); + + if (HandRst != 0) + { + // pass the packet to upper layer + skb->protocol = eth_type_trans(skb, skb->dev); + netif_rx(skb); + } + } +*/ +UINT32 BG_FTPH_PacketFromApHandle( + IN PNDIS_PACKET pPacket); + +#ifdef BG_FT_OPEN_SUPPORT +extern UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket); +#else +UINT32 (*RALINK_FP_Handle)(PNDIS_PACKET pPacket); +#endif // BG_FT_OPEN_SUPPORT // + + + + +/* --------------------------------- Public -------------------------------- */ + +/* +======================================================================== +Routine Description: + Init bridge fast path module. + +Arguments: + None + +Return Value: + None + +Note: + Used in module init. +======================================================================== +*/ +VOID BG_FTPH_Init(VOID) +{ + RALINK_FP_Handle = BG_FTPH_PacketFromApHandle; +} /* End of BG_FTPH_Init */ + + +/* +======================================================================== +Routine Description: + Remove bridge fast path module. + +Arguments: + None + +Return Value: + None + +Note: + Used in module remove. +======================================================================== +*/ +VOID BG_FTPH_Remove(VOID) +{ + RALINK_FP_Handle = NULL; +} /* End of BG_FTPH_Init */ + + +/* +======================================================================== +Routine Description: + Pass the packet to the port directly or bridge layer. + +Arguments: + pAd - WLAN control block pointer + skb_p - the received packet + +Return Value: + None + +Note: +======================================================================== +*/ +static inline unsigned packet_length(const struct sk_buff *skb) +{ +#define VLAN_HLEN 4 + return skb->len - (skb->protocol == htons(ETH_P_8021Q) ? VLAN_HLEN : 0); +} + + +UINT32 BG_FTPH_PacketFromApHandle( + IN PNDIS_PACKET pPacket) +{ + struct net_device *pNetDev; + struct sk_buff *pRxPkt; + struct net_bridge_fdb_entry *pSrcFdbEntry, *pDstFdbEntry; + + + /* init */ + pRxPkt = RTPKT_TO_OSPKT(pPacket); + pNetDev = pRxPkt->dev; + + /* if pNetDev is promisc mode ??? */ + DBGPRINT(RT_DEBUG_INFO, ("ft bg> BG_FTPH_PacketFromApHandle\n")); + + if (pNetDev != NULL) + { + if (pNetDev->br_port != NULL) + { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12) + pDstFdbEntry = br_fdb_get_hook(pNetDev->br_port->br, pRxPkt->data); + pSrcFdbEntry = br_fdb_get_hook(pNetDev->br_port->br, pRxPkt->data + 6); +#else + /* br_fdb_get is not exported symbol, need exported in net/bridge/br.c */ + pDstFdbEntry = br_fdb_get(pNetDev->br_port->br, pRxPkt->data); + pSrcFdbEntry = br_fdb_get(pNetDev->br_port->br, pRxPkt->data + 6); +#endif + + /* check destination address in bridge forwarding table */ + if ((pSrcFdbEntry == NULL) || + (pDstFdbEntry == NULL) || + (pDstFdbEntry->is_local) || + (pDstFdbEntry->dst == NULL) || + (pDstFdbEntry->dst->dev == NULL) || + (pDstFdbEntry->dst->dev == pNetDev) || + (pNetDev->br_port->state != BR_STATE_FORWARDING) || + ((pSrcFdbEntry->dst != NULL) && + (pSrcFdbEntry->dst->dev != NULL) && + (pSrcFdbEntry->dst->dev != pNetDev))) + { + + goto LabelPassToUpperLayer; + } /* End of if */ + + if ((!pDstFdbEntry->is_local) && + (pDstFdbEntry->dst != NULL) && + (pDstFdbEntry->dst->dev != NULL)) + { + pRxPkt->dev = pDstFdbEntry->dst->dev; + pDstFdbEntry->dst->dev->hard_start_xmit(pRxPkt, pDstFdbEntry->dst->dev); + return 0; + } /* End of if */ + } /* End of if */ + } /* End of if */ + +LabelPassToUpperLayer: + DBGPRINT(RT_DEBUG_TRACE, ("ft bg> Pass packet to bridge module.\n")); + return 1; +} /* End of BG_FTPH_PacketFromApHandle */ + + +#endif // CONFIG_BRIDGE || CONFIG_BRIDGE_MODULE // +#endif // BG_FT_SUPPORT // + +/* End of bg_ftph.c */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/client_wds.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/client_wds.c new file mode 100644 index 000000000..15cdf3c59 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/client_wds.c @@ -0,0 +1,204 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + client_wds.c + + Abstract: +*/ + + +#ifdef CLIENT_WDS + +#include "rt_config.h" + +VOID CliWds_ProxyTabInit( + IN PRTMP_ADAPTER pAd) +{ + INT idx; + ULONG i; + + NdisAllocateSpinLock(&pAd->ApCfg.CliWdsTabLock); + + pAd->ApCfg.pCliWdsEntryPool = kmalloc(sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE, GFP_ATOMIC); + if (pAd->ApCfg.pCliWdsEntryPool) + { + NdisZeroMemory(pAd->ApCfg.pCliWdsEntryPool, sizeof(CLIWDS_PROXY_ENTRY) * CLIWDS_POOL_SIZE); + initList(&pAd->ApCfg.CliWdsEntryFreeList); + for (i = 0; i < CLIWDS_POOL_SIZE; i++) + insertTailList(&pAd->ApCfg.CliWdsEntryFreeList, (PLIST_ENTRY)(pAd->ApCfg.pCliWdsEntryPool + (ULONG)i)); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s Fail to alloc memory for pAd->CommonCfg.pCliWdsEntryPool", __FUNCTION__)); + } + + for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++) + initList(&pAd->ApCfg.CliWdsProxyTab[idx]); + + return; +} + + +VOID CliWds_ProxyTabDestory( + IN PRTMP_ADAPTER pAd) +{ + INT idx; + PCLIWDS_PROXY_ENTRY pCliWdsEntry; + + NdisFreeSpinLock(&pAd->ApCfg.CliWdsTabLock); + + for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++) + { + pCliWdsEntry = + (PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTab[idx].pHead; + while(pCliWdsEntry) + { + PCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext; + CliWdsEntyFree(pAd, pCliWdsEntry); + pCliWdsEntry = pCliWdsEntryNext; + } + } + + if (pAd->ApCfg.pCliWdsEntryPool) + kfree(pAd->ApCfg.pCliWdsEntryPool); + pAd->ApCfg.pCliWdsEntryPool = NULL; + + return; +} + + +PCLIWDS_PROXY_ENTRY CliWdsEntyAlloc( + IN PRTMP_ADAPTER pAd) +{ + PCLIWDS_PROXY_ENTRY pCliWdsEntry; + + RTMP_SEM_LOCK(&pAd->ApCfg.CliWdsTabLock); + + pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)removeHeadList(&pAd->ApCfg.CliWdsEntryFreeList); + + RTMP_SEM_UNLOCK(&pAd->ApCfg.CliWdsTabLock); + + return pCliWdsEntry; +} + + +VOID CliWdsEntyFree( + IN PRTMP_ADAPTER pAd, + IN PCLIWDS_PROXY_ENTRY pCliWdsEntry) +{ + RTMP_SEM_LOCK(&pAd->ApCfg.CliWdsTabLock); + + insertTailList(&pAd->ApCfg.CliWdsEntryFreeList, (PLIST_ENTRY)pCliWdsEntry); + + RTMP_SEM_UNLOCK(&pAd->ApCfg.CliWdsTabLock); + + return; +} + + +PUCHAR CliWds_ProxyLookup( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pMac) +{ + UINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1)); + PCLIWDS_PROXY_ENTRY pCliWdsEntry; + + pCliWdsEntry = + (PCLIWDS_PROXY_ENTRY)pAd->ApCfg.CliWdsProxyTab[HashId].pHead; + while (pCliWdsEntry) + { + if (MAC_ADDR_EQUAL(pMac, pCliWdsEntry->Addr)) + { + ULONG Now; + NdisGetSystemUpTime(&Now); + + pCliWdsEntry->LastRefTime = Now; + if (VALID_WCID(pCliWdsEntry->Aid)) + return pAd->MacTab.Content[pCliWdsEntry->Aid].Addr; + else + return NULL; + } + pCliWdsEntry = pCliWdsEntry->pNext; + } + return NULL; +} + + +VOID CliWds_ProxyTabUpdate( + IN PRTMP_ADAPTER pAd, + IN SHORT Aid, + IN PUCHAR pMac) +{ + UINT8 HashId = (*(pMac + 5) & (CLIWDS_HASH_TAB_SIZE - 1)); + PCLIWDS_PROXY_ENTRY pCliWdsEntry; + + if (CliWds_ProxyLookup(pAd, pMac) != NULL) + return; + + pCliWdsEntry = CliWdsEntyAlloc(pAd); + if (pCliWdsEntry) + { + ULONG Now; + NdisGetSystemUpTime(&Now); + + pCliWdsEntry->Aid = Aid; + COPY_MAC_ADDR(&pCliWdsEntry->Addr, pMac); + pCliWdsEntry->LastRefTime = Now; + pCliWdsEntry->pNext = NULL; + insertTailList(&pAd->ApCfg.CliWdsProxyTab[HashId], (PLIST_ENTRY)pCliWdsEntry); + } + return; +} + + +VOID CliWds_ProxyTabMaintain( + IN PRTMP_ADAPTER pAd) +{ + ULONG idx; + PCLIWDS_PROXY_ENTRY pCliWdsEntry; + ULONG Now; + + NdisGetSystemUpTime(&Now); + for (idx = 0; idx < CLIWDS_HASH_TAB_SIZE; idx++) + { + pCliWdsEntry = (PCLIWDS_PROXY_ENTRY)(pAd->ApCfg.CliWdsProxyTab[idx].pHead); + while(pCliWdsEntry) + { + PCLIWDS_PROXY_ENTRY pCliWdsEntryNext = pCliWdsEntry->pNext; + if (RTMP_TIME_AFTER(Now, pCliWdsEntry->LastRefTime + (CLI_WDS_ENTRY_AGEOUT * OS_HZ / 1000))) + { + delEntryList(&pAd->ApCfg.CliWdsProxyTab[idx], (PLIST_ENTRY)pCliWdsEntry); + CliWdsEntyFree(pAd, pCliWdsEntry); + } + pCliWdsEntry = pCliWdsEntryNext; + } + } + return; +} + +#endif // CLIENT_WDS // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_aes.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_aes.c new file mode 100644 index 000000000..2d3f6e8f5 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_aes.c @@ -0,0 +1,1145 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_aes.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Paul Wu 02-25-02 Initial +*/ + +#include "rt_config.h" + + + +/*****************************/ +/******** SBOX Table *********/ +/*****************************/ + +UCHAR SboxTable[256] = +{ + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +VOID xor_32( + IN PUCHAR a, + IN PUCHAR b, + OUT PUCHAR out) +{ + INT i; + + for (i=0;i<4; i++) + { + out[i] = a[i] ^ b[i]; + } +} + +VOID xor_128( + IN PUCHAR a, + IN PUCHAR b, + OUT PUCHAR out) +{ + INT i; + + for (i=0;i<16; i++) + { + out[i] = a[i] ^ b[i]; + } +} + +UCHAR RTMPCkipSbox( + IN UCHAR a) +{ + return SboxTable[(int)a]; +} + +VOID next_key( + IN PUCHAR key, + IN INT round) +{ + UCHAR rcon; + UCHAR sbox_key[4]; + UCHAR rcon_table[12] = + { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + 0x1b, 0x36, 0x36, 0x36 + }; + + sbox_key[0] = RTMPCkipSbox(key[13]); + sbox_key[1] = RTMPCkipSbox(key[14]); + sbox_key[2] = RTMPCkipSbox(key[15]); + sbox_key[3] = RTMPCkipSbox(key[12]); + + rcon = rcon_table[round]; + + xor_32(&key[0], sbox_key, &key[0]); + key[0] = key[0] ^ rcon; + + xor_32(&key[4], &key[0], &key[4]); + xor_32(&key[8], &key[4], &key[8]); + xor_32(&key[12], &key[8], &key[12]); +} + +VOID byte_sub( + IN PUCHAR in, + OUT PUCHAR out) +{ + INT i; + + for (i=0; i< 16; i++) + { + out[i] = RTMPCkipSbox(in[i]); + } +} + +/************************************/ +/* bitwise_xor() */ +/* A 128 bit, bitwise exclusive or */ +/************************************/ + +void bitwise_xor(unsigned char *ina, unsigned char *inb, unsigned char *out) +{ + int i; + for (i=0; i<16; i++) + { + out[i] = ina[i] ^ inb[i]; + } +} + +VOID shift_row( + IN PUCHAR in, + OUT PUCHAR out) +{ + out[0] = in[0]; + out[1] = in[5]; + out[2] = in[10]; + out[3] = in[15]; + out[4] = in[4]; + out[5] = in[9]; + out[6] = in[14]; + out[7] = in[3]; + out[8] = in[8]; + out[9] = in[13]; + out[10] = in[2]; + out[11] = in[7]; + out[12] = in[12]; + out[13] = in[1]; + out[14] = in[6]; + out[15] = in[11]; +} + +VOID mix_column( + IN PUCHAR in, + OUT PUCHAR out) +{ + INT i; + UCHAR add1b[4]; + UCHAR add1bf7[4]; + UCHAR rotl[4]; + UCHAR swap_halfs[4]; + UCHAR andf7[4]; + UCHAR rotr[4]; + UCHAR temp[4]; + UCHAR tempb[4]; + + for (i=0 ; i<4; i++) + { + if ((in[i] & 0x80)== 0x80) + add1b[i] = 0x1b; + else + add1b[i] = 0x00; + } + + swap_halfs[0] = in[2]; /* Swap halfs */ + swap_halfs[1] = in[3]; + swap_halfs[2] = in[0]; + swap_halfs[3] = in[1]; + + rotl[0] = in[3]; /* Rotate left 8 bits */ + rotl[1] = in[0]; + rotl[2] = in[1]; + rotl[3] = in[2]; + + andf7[0] = in[0] & 0x7f; + andf7[1] = in[1] & 0x7f; + andf7[2] = in[2] & 0x7f; + andf7[3] = in[3] & 0x7f; + + for (i = 3; i>0; i--) /* logical shift left 1 bit */ + { + andf7[i] = andf7[i] << 1; + if ((andf7[i-1] & 0x80) == 0x80) + { + andf7[i] = (andf7[i] | 0x01); + } + } + andf7[0] = andf7[0] << 1; + andf7[0] = andf7[0] & 0xfe; + + xor_32(add1b, andf7, add1bf7); + + xor_32(in, add1bf7, rotr); + + temp[0] = rotr[0]; /* Rotate right 8 bits */ + rotr[0] = rotr[1]; + rotr[1] = rotr[2]; + rotr[2] = rotr[3]; + rotr[3] = temp[0]; + + xor_32(add1bf7, rotr, temp); + xor_32(swap_halfs, rotl,tempb); + xor_32(temp, tempb, out); +} + + +/************************************************/ +/* construct_mic_header1() */ +/* Builds the first MIC header block from */ +/* header fields. */ +/************************************************/ + +void construct_mic_header1( + unsigned char *mic_header1, + int header_length, + unsigned char *mpdu) +{ + mic_header1[0] = (unsigned char)((header_length - 2) / 256); + mic_header1[1] = (unsigned char)((header_length - 2) % 256); + mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */ + mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */ + mic_header1[4] = mpdu[4]; /* A1 */ + mic_header1[5] = mpdu[5]; + mic_header1[6] = mpdu[6]; + mic_header1[7] = mpdu[7]; + mic_header1[8] = mpdu[8]; + mic_header1[9] = mpdu[9]; + mic_header1[10] = mpdu[10]; /* A2 */ + mic_header1[11] = mpdu[11]; + mic_header1[12] = mpdu[12]; + mic_header1[13] = mpdu[13]; + mic_header1[14] = mpdu[14]; + mic_header1[15] = mpdu[15]; +} + +/************************************************/ +/* construct_mic_header2() */ +/* Builds the last MIC header block from */ +/* header fields. */ +/************************************************/ + +void construct_mic_header2( + unsigned char *mic_header2, + unsigned char *mpdu, + int a4_exists, + int qc_exists) +{ + int i; + + for (i = 0; i<16; i++) mic_header2[i]=0x00; + + mic_header2[0] = mpdu[16]; /* A3 */ + mic_header2[1] = mpdu[17]; + mic_header2[2] = mpdu[18]; + mic_header2[3] = mpdu[19]; + mic_header2[4] = mpdu[20]; + mic_header2[5] = mpdu[21]; + + // In Sequence Control field, mute sequence numer bits (12-bit) + mic_header2[6] = mpdu[22] & 0x0f; /* SC */ + mic_header2[7] = 0x00; /* mpdu[23]; */ + + if ((!qc_exists) & a4_exists) + { + for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ + + } + + if (qc_exists && (!a4_exists)) + { + mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */ + mic_header2[9] = mpdu[25] & 0x00; + } + + if (qc_exists && a4_exists) + { + for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */ + + mic_header2[14] = mpdu[30] & 0x0f; + mic_header2[15] = mpdu[31] & 0x00; + } +} + + +/************************************************/ +/* construct_mic_iv() */ +/* Builds the MIC IV from header fields and PN */ +/************************************************/ + +void construct_mic_iv( + unsigned char *mic_iv, + int qc_exists, + int a4_exists, + unsigned char *mpdu, + unsigned int payload_length, + unsigned char *pn_vector) +{ + int i; + + mic_iv[0] = 0x59; + if (qc_exists && a4_exists) + mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */ + if (qc_exists && !a4_exists) + mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */ + if (!qc_exists) + mic_iv[1] = 0x00; + for (i = 2; i < 8; i++) + mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */ +#ifdef CONSISTENT_PN_ORDER + for (i = 8; i < 14; i++) + mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */ +#else + for (i = 8; i < 14; i++) + mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */ +#endif + i = (payload_length / 256); + i = (payload_length % 256); + mic_iv[14] = (unsigned char) (payload_length / 256); + mic_iv[15] = (unsigned char) (payload_length % 256); + +} + +/****************************************/ +/* aes128k128d() */ +/* Performs a 128 bit AES encrypt with */ +/* 128 bit data. */ +/****************************************/ +void aes128k128d(unsigned char *key, unsigned char *data, unsigned char *ciphertext) +{ + int round; + int i; + unsigned char intermediatea[16]; + unsigned char intermediateb[16]; + unsigned char round_key[16]; + + for(i=0; i<16; i++) round_key[i] = key[i]; + + for (round = 0; round < 11; round++) + { + if (round == 0) + { + xor_128(round_key, data, ciphertext); + next_key(round_key, round); + } + else if (round == 10) + { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + xor_128(intermediateb, round_key, ciphertext); + } + else /* 1 - 9 */ + { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + mix_column(&intermediateb[0], &intermediatea[0]); + mix_column(&intermediateb[4], &intermediatea[4]); + mix_column(&intermediateb[8], &intermediatea[8]); + mix_column(&intermediateb[12], &intermediatea[12]); + xor_128(intermediatea, round_key, ciphertext); + next_key(round_key, round); + } + } + +} + +void construct_ctr_preload( + unsigned char *ctr_preload, + int a4_exists, + int qc_exists, + unsigned char *mpdu, + unsigned char *pn_vector, + int c) +{ + + int i = 0; + for (i=0; i<16; i++) ctr_preload[i] = 0x00; + i = 0; + + ctr_preload[0] = 0x01; /* flag */ + if (qc_exists && a4_exists) ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */ + if (qc_exists && !a4_exists) ctr_preload[1] = mpdu[24] & 0x0f; + + for (i = 2; i < 8; i++) + ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */ +#ifdef CONSISTENT_PN_ORDER + for (i = 8; i < 14; i++) + ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */ +#else + for (i = 8; i < 14; i++) + ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */ +#endif + ctr_preload[14] = (unsigned char) (c / 256); // Ctr + ctr_preload[15] = (unsigned char) (c % 256); + +} + +BOOLEAN RTMPSoftDecryptAES( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pData, + IN ULONG DataByteCnt, + IN PCIPHER_KEY pWpaKey) +{ + UINT HeaderLen; + UCHAR PN[6]; + UINT payload_len; + UINT num_blocks; + UINT payload_remainder; + USHORT fc; + UCHAR fc0; + UCHAR fc1; + UINT frame_type; + UINT frame_subtype; + UINT from_ds; + UINT to_ds; + INT a4_exists; + INT qc_exists; + UCHAR aes_out[16]; + int payload_index; + UINT i; + UCHAR ctr_preload[16]; + UCHAR chain_buffer[16]; + UCHAR padded_buffer[16]; + UCHAR mic_iv[16]; + UCHAR mic_header1[16]; + UCHAR mic_header2[16]; + UCHAR MIC[8]; + UCHAR TrailMIC[8]; + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pData, DIR_READ, FALSE); +#endif + + fc0 = *pData; + fc1 = *(pData + 1); + + fc = *((PUSHORT)pData); + + frame_type = ((fc0 >> 2) & 0x03); + frame_subtype = ((fc0 >> 4) & 0x0f); + + from_ds = (fc1 & 0x2) >> 1; + to_ds = (fc1 & 0x1); + + a4_exists = (from_ds & to_ds); + qc_exists = ((frame_subtype == 0x08) || /* Assumed QoS subtypes */ + (frame_subtype == 0x09) || /* Likely to change. */ + (frame_subtype == 0x0a) || + (frame_subtype == 0x0b) + ); + + HeaderLen = 24; + + if (a4_exists) + HeaderLen += 6; + + if (qc_exists) + HeaderLen += 2; + + if (pWpaKey->KeyLen == 0) + { + DBGPRINT(RT_DEBUG_TRACE, ("RTMPSoftDecryptAES failed!(the Length can not be 0)\n")); + return FALSE; + } + + PN[0] = *(pData+ HeaderLen); + PN[1] = *(pData+ HeaderLen + 1); + PN[2] = *(pData+ HeaderLen + 4); + PN[3] = *(pData+ HeaderLen + 5); + PN[4] = *(pData+ HeaderLen + 6); + PN[5] = *(pData+ HeaderLen + 7); + + payload_len = DataByteCnt - HeaderLen - 8 - 8; // 8 bytes for CCMP header , 8 bytes for MIC + payload_remainder = (payload_len) % 16; + num_blocks = (payload_len) / 16; + + + + // Find start of payload + payload_index = HeaderLen + 8; //IV+EIV + + for (i=0; i< num_blocks; i++) + { + construct_ctr_preload(ctr_preload, + a4_exists, + qc_exists, + pData, + PN, + i+1 ); + + aes128k128d(pWpaKey->Key, ctr_preload, aes_out); + + bitwise_xor(aes_out, pData + payload_index, chain_buffer); + NdisMoveMemory(pData + payload_index - 8, chain_buffer, 16); + payload_index += 16; + } + + // + // If there is a short final block, then pad it + // encrypt it and copy the unpadded part back + // + if (payload_remainder > 0) + { + construct_ctr_preload(ctr_preload, + a4_exists, + qc_exists, + pData, + PN, + num_blocks + 1); + + NdisZeroMemory(padded_buffer, 16); + NdisMoveMemory(padded_buffer, pData + payload_index, payload_remainder); + + aes128k128d(pWpaKey->Key, ctr_preload, aes_out); + + bitwise_xor(aes_out, padded_buffer, chain_buffer); + NdisMoveMemory(pData + payload_index - 8, chain_buffer, payload_remainder); + payload_index += payload_remainder; + } + + // + // Descrypt the MIC + // + construct_ctr_preload(ctr_preload, + a4_exists, + qc_exists, + pData, + PN, + 0); + NdisZeroMemory(padded_buffer, 16); + NdisMoveMemory(padded_buffer, pData + payload_index, 8); + + aes128k128d(pWpaKey->Key, ctr_preload, aes_out); + + bitwise_xor(aes_out, padded_buffer, chain_buffer); + + NdisMoveMemory(TrailMIC, chain_buffer, 8); + + + // + // Calculate MIC + // + + //Force the protected frame bit on + *(pData + 1) = *(pData + 1) | 0x40; + + // Find start of payload + // Because the CCMP header has been removed + payload_index = HeaderLen; + + construct_mic_iv( + mic_iv, + qc_exists, + a4_exists, + pData, + payload_len, + PN); + + construct_mic_header1( + mic_header1, + HeaderLen, + pData); + + construct_mic_header2( + mic_header2, + pData, + a4_exists, + qc_exists); + + aes128k128d(pWpaKey->Key, mic_iv, aes_out); + bitwise_xor(aes_out, mic_header1, chain_buffer); + aes128k128d(pWpaKey->Key, chain_buffer, aes_out); + bitwise_xor(aes_out, mic_header2, chain_buffer); + aes128k128d(pWpaKey->Key, chain_buffer, aes_out); + + // iterate through each 16 byte payload block + for (i = 0; i < num_blocks; i++) + { + bitwise_xor(aes_out, pData + payload_index, chain_buffer); + payload_index += 16; + aes128k128d(pWpaKey->Key, chain_buffer, aes_out); + } + + // Add on the final payload block if it needs padding + if (payload_remainder > 0) + { + NdisZeroMemory(padded_buffer, 16); + NdisMoveMemory(padded_buffer, pData + payload_index, payload_remainder); + + bitwise_xor(aes_out, padded_buffer, chain_buffer); + aes128k128d(pWpaKey->Key, chain_buffer, aes_out); + } + + // aes_out contains padded mic, discard most significant + // 8 bytes to generate 64 bit MIC + for (i = 0 ; i < 8; i++) MIC[i] = aes_out[i]; + + if (!NdisEqualMemory(MIC, TrailMIC, 8)) + { + DBGPRINT(RT_DEBUG_ERROR, ("RTMPSoftDecryptAES, MIC Error !\n")); //MIC error. + return FALSE; + } + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pData, DIR_READ, FALSE); +#endif + + return TRUE; +} + + +/* + ======================================================================== + + Routine Description: + Construct AAD of CCMP. + + Arguments: + + Return Value: + + Note: + It's described in IEEE Std 802.11-2007. + The AAD is constructed from the MPDU header. + + ======================================================================== +*/ +VOID RTMPConstructCCMPAAD( + IN PUCHAR pHdr, + IN BOOLEAN isDataFrame, + IN UINT8 a4_exists, + IN UINT8 qc_exists, + OUT UCHAR *aad_hdr, + OUT UINT *aad_len) +{ + UINT len = 0; + + /* Frame control - + Subtype bits (bits 4 5 6) in a Data MPDU masked to 0 + Retry bit (bit 11) masked to 0 + PwrMgt bit (bit 12) masked to 0 + MoreData bit (bit 13) masked to 0 + Protected Frame bit (bit 14) always set to 1 */ + if (isDataFrame) + aad_hdr[0] = (*pHdr) & 0x8f; + else + aad_hdr[0] = (*pHdr); + aad_hdr[1] = (*(pHdr + 1)) & 0xc7; + aad_hdr[1] = aad_hdr[1] | 0x40; + len = 2; + + /* Append Addr 1, 2 & 3 */ + NdisMoveMemory(&aad_hdr[len], pHdr + 4, 3 * MAC_ADDR_LEN); + len += (3 * MAC_ADDR_LEN); + + /* SC - + MPDU Sequence Control field, with the Sequence Number + subfield (bits 4-15 of the Sequence Control field) + masked to 0. The Fragment Number subfield is not modified. */ + aad_hdr[len] = (*(pHdr + 22)) & 0x0f; + aad_hdr[len + 1] = 0x00; + len += 2; + + + /* Append the Addr4 field if present. */ + if (a4_exists) + { + NdisMoveMemory(&aad_hdr[len], pHdr + 24, MAC_ADDR_LEN); + len += MAC_ADDR_LEN; + } + + /* QC - + QoS Control field, if present, a 2-octet field that includes + the MSDU priority. The QC TID field is used in the + construction of the AAD and the remaining QC fields are + set to 0 for the AAD calculation (bits 4 to 15 are set to 0). */ + if (qc_exists & a4_exists) + { + aad_hdr[len] = (*(pHdr + 30)) & 0x0f; // Qos_TC + aad_hdr[len + 1] = 0x00; + len += 2; + } + else if (qc_exists & !a4_exists) + { + aad_hdr[len] = (*(pHdr + 24)) & 0x0f; // Qos_TC + aad_hdr[len + 1] = 0x00; + len += 2; + } + + *aad_len = len; +} + +/* + ======================================================================== + + Routine Description: + Construct NONCE header of CCMP. + + Arguments: + + Return Value: + + Note: + + ======================================================================== +*/ +VOID RTMPConstructCCMPNonce( + IN PUCHAR pHdr, + IN UINT8 a4_exists, + IN UINT8 qc_exists, + IN BOOLEAN isMgmtFrame, + IN UCHAR *pn, + OUT UCHAR *nonce_hdr, + OUT UINT *nonce_hdr_len) +{ + UINT n_offset = 0; + INT i; + + /* Decide the Priority Octet + The Priority sub-field of the Nonce Flags field shall + be set to the fixed value 0 when there is no QC field + present in the MPDU header. When the QC field is present, + bits 0 to 3 of the Priority field shall be set to the + value of the QC TID (bits 0 to 3 of the QC field).*/ + if (qc_exists && a4_exists) + nonce_hdr[0] = (*(pHdr + 30)) & 0x0f; + if (qc_exists && !a4_exists) + nonce_hdr[0] = (*(pHdr + 24)) & 0x0f; + + n_offset += 1; + + /* Fill in MPDU Address A2 field */ + NdisMoveMemory(&nonce_hdr[n_offset], pHdr + 10, MAC_ADDR_LEN); + n_offset += MAC_ADDR_LEN; + + /* Fill in the PN. The PN field occupies octets 7�V12. + The octets of PN shall be ordered so that PN0 is at octet index 12 + and PN5 is at octet index 7. */ + for (i = 0; i < 6; i++) + nonce_hdr[n_offset + i] = pn[5 - i]; + n_offset += LEN_PN; + + *nonce_hdr_len = n_offset; + +} + +/* + ======================================================================== + + Routine Description: + Construct CCMP header. + + Arguments: + + Return Value: + + Note: + It's a 8-octets header. + + ======================================================================== +*/ +VOID RTMPConstructCCMPHdr( + IN UINT8 key_idx, + IN UCHAR *pn, + OUT UCHAR *ccmp_hdr) +{ + NdisZeroMemory(ccmp_hdr, LEN_CCMP_HDR); + + ccmp_hdr[0] = pn[0]; + ccmp_hdr[1] = pn[1]; + ccmp_hdr[3] = (key_idx <<6) | 0x20; + ccmp_hdr[4] = pn[2]; + ccmp_hdr[5] = pn[3]; + ccmp_hdr[6] = pn[4]; + ccmp_hdr[7] = pn[5]; +} + +/* + ======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + + ======================================================================== +*/ +BOOLEAN RTMPSoftEncryptCCMP( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHdr, + IN PUCHAR pIV, + IN PUCHAR pKey, + INOUT PUCHAR pData, + IN UINT32 DataLen) +{ + UINT8 frame_type, frame_subtype; + UINT8 from_ds, to_ds; + UINT8 a4_exists, qc_exists; + UINT8 aad_hdr[30]; + UINT aad_len = 0; + UINT8 nonce_hdr[13]; + UINT32 nonce_hdr_len = 0; + UINT32 out_len = DataLen + 8; + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE); +#endif + + /* Initial variable */ + NdisZeroMemory(aad_hdr, 30); + NdisZeroMemory(nonce_hdr, 13); + + /* Indicate type and subtype of Frame Control field */ + frame_type = (((*pHdr) >> 2) & 0x03); + frame_subtype = (((*pHdr) >> 4) & 0x0f); + + /* Indicate the fromDS and ToDS */ + from_ds = ((*(pHdr + 1)) & 0x2) >> 1; + to_ds = ((*(pHdr + 1)) & 0x1); + + /* decide if the Address 4 exist or QoS exist */ + a4_exists = (from_ds & to_ds); + qc_exists = ((frame_subtype == SUBTYPE_QDATA) || + (frame_subtype == SUBTYPE_QDATA_CFACK) || + (frame_subtype == SUBTYPE_QDATA_CFPOLL) || + (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL)); + + /* Construct AAD header */ + RTMPConstructCCMPAAD(pHdr, + (frame_type == BTYPE_DATA), + a4_exists, + qc_exists, + aad_hdr, + &aad_len); + + /* Construct NONCE header */ + RTMPConstructCCMPNonce(pHdr, + a4_exists, + qc_exists, + (frame_type == BTYPE_MGMT), + pIV, + nonce_hdr, + &nonce_hdr_len); + + /* CCM originator processing - + Use the temporal key, AAD, nonce, and MPDU data to + form the cipher text and MIC. */ + if (AES_CCM_Encrypt(pData, DataLen, + pKey, 16, + nonce_hdr, nonce_hdr_len, + aad_hdr, aad_len, LEN_CCMP_MIC, + pData, &out_len)) + return FALSE; + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE); +#endif + + return TRUE; +} + +/* + ======================================================================== + + Routine Description: + Decrypt data with CCMP. + + Arguments: + + Return Value: + + Note: + + ======================================================================== +*/ +BOOLEAN RTMPSoftDecryptCCMP( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHdr, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + INOUT UINT16 *DataLen) +{ + UINT8 frame_type, frame_subtype; + UINT8 from_ds, to_ds; + UINT8 a4_exists, qc_exists; + UINT8 aad_hdr[30]; + UINT aad_len = 0; + UINT8 pn[LEN_PN]; + PUCHAR cipherData_ptr; + UINT32 cipherData_len; + UINT8 nonce_hdr[13]; + UINT32 nonce_hdr_len = 0; + UINT32 out_len = *DataLen; + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE); +#endif + + /* Check the key is valid */ + if (pKey->KeyLen == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The key is not available !\n", __FUNCTION__)); + return FALSE; + } + + /* Initial variable */ + NdisZeroMemory(aad_hdr, 30); + NdisZeroMemory(nonce_hdr, 13); + + /* Indicate type and subtype of Frame Control field */ + frame_type = (((*pHdr) >> 2) & 0x03); + frame_subtype = (((*pHdr) >> 4) & 0x0f); + + /* Indicate the fromDS and ToDS */ + from_ds = ((*(pHdr + 1)) & 0x2) >> 1; + to_ds = ((*(pHdr + 1)) & 0x1); + + /* decide if the Address 4 exist or QoS exist */ + a4_exists = (from_ds & to_ds); + qc_exists = ((frame_subtype == SUBTYPE_QDATA) || + (frame_subtype == SUBTYPE_QDATA_CFACK) || + (frame_subtype == SUBTYPE_QDATA_CFPOLL) || + (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL)); + + /* Extract PN and from CCMP header */ + pn[0] = pData[0]; + pn[1] = pData[1]; + pn[2] = pData[4]; + pn[3] = pData[5]; + pn[4] = pData[6]; + pn[5] = pData[7]; + + /* skip ccmp header */ + cipherData_ptr = pData + LEN_CCMP_HDR; + cipherData_len = *DataLen - LEN_CCMP_HDR; + + /* Construct AAD header */ + RTMPConstructCCMPAAD(pHdr, + (frame_type == BTYPE_DATA), + a4_exists, + qc_exists, + aad_hdr, + &aad_len); + + /* Construct NONCE header */ + RTMPConstructCCMPNonce(pHdr, + a4_exists, + qc_exists, + (frame_type == BTYPE_MGMT), + pn, + nonce_hdr, + &nonce_hdr_len); + + /* CCM recipient processing - + uses the temporal key, AAD, nonce, MIC, + and MPDU cipher text data */ + if (AES_CCM_Decrypt(cipherData_ptr, cipherData_len, + pKey->Key, 16, + nonce_hdr, nonce_hdr_len, + aad_hdr, aad_len, LEN_CCMP_MIC, + pData, &out_len)) + return FALSE; + + *DataLen = out_len; + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHdr, DIR_READ, FALSE); +#endif + + return TRUE; +} + +/* + ======================================================================== + + Routine Description: + CCMP test vector + + Arguments: + + Return Value: + + Note: + + ======================================================================== +*/ +VOID CCMP_test_vector( + IN PRTMP_ADAPTER pAd, + IN INT input) +{ + UINT8 Key_ID = 0; + //UINT8 A1[6] = {0x0f, 0xd2, 0xe1, 0x28, 0xa5, 0x7c}; + //UINT8 A2[6] = {0x50, 0x30, 0xf1, 0x84, 0x44, 0x08}; + //UINT8 A3[6] = {0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba}; + UINT8 TK[16] = {0xc9, 0x7c, 0x1f, 0x67, 0xce, 0x37, 0x11, 0x85, + 0x51, 0x4a, 0x8a, 0x19, 0xf2, 0xbd, 0xd5, 0x2f}; + UINT8 PN[6] = {0x0C, 0xE7, 0x76, 0x97, 0x03, 0xB5}; + UINT8 HDR[24]= {0x08, 0x48, 0xc3, 0x2c, 0x0f, 0xd2, 0xe1, 0x28, + 0xa5, 0x7c, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, + 0xab, 0xae, 0xa5, 0xb8, 0xfc, 0xba, 0x80, 0x33}; + UINT8 AAD[22] = {0x08, 0x40, 0x0f, 0xd2, 0xe1, 0x28, 0xa5, 0x7c, + 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0xab, 0xae, + 0xa5, 0xb8, 0xfc, 0xba, 0x00, 0x00}; + UINT8 CCMP_HDR[8] = {0x0c, 0xe7, 0x00, 0x20, 0x76, 0x97, 0x03, 0xb5}; + UINT8 CCM_NONCE[13] = {0x00, 0x50, 0x30, 0xf1, 0x84, 0x44, 0x08, 0xb5, + 0x03, 0x97, 0x76, 0xe7, 0x0c}; + UINT8 P_TEXT_DATA[20] = {0xf8, 0xba, 0x1a, 0x55, 0xd0, 0x2f, 0x85, 0xae, + 0x96, 0x7b, 0xb6, 0x2f, 0xb6, 0xcd, 0xa8, 0xeb, + 0x7e, 0x78, 0xa0, 0x50}; + UINT8 C_TEXT_DATA[28] = {0xf3, 0xd0, 0xa2, 0xfe, 0x9a, 0x3d, 0xbf, 0x23, + 0x42, 0xa6, 0x43, 0xe4, 0x32, 0x46, 0xe8, 0x0c, + 0x3c, 0x04, 0xd0, 0x19, 0x78, 0x45, 0xce, 0x0b, + 0x16, 0xf9, 0x76, 0x23}; + UINT8 res_buf[100]; + UINT res_len = 0; + + printk("== CCMP test vector == \n"); + + /* Check AAD */ + NdisZeroMemory(res_buf, 100); + res_len = 0; + RTMPConstructCCMPAAD(HDR, TRUE, 0, 0, res_buf, &res_len); + if (res_len == 22 && NdisEqualMemory(res_buf, AAD, res_len)) + printk("Construct AAD is OK!!!\n"); + else + { + printk("\n!!!Construct AAD is FAILURE!!!\n\n"); + hex_dump("Calculate AAD", res_buf, res_len); + } + /* Check NONCE */ + NdisZeroMemory(res_buf, 100); + res_len = 0; + RTMPConstructCCMPNonce(HDR, 0, 0, FALSE, PN, res_buf, &res_len); + if (res_len == 13 && NdisEqualMemory(res_buf, CCM_NONCE, res_len)) + printk("Construct NONCE is OK!!!\n"); + else + { + printk("\n!!!Construct NONCE is FAILURE!!!\n\n"); + hex_dump("Calculate NONCE", res_buf, res_len); + } + /* Check CCMP-Header */ + NdisZeroMemory(res_buf, 100); + res_len = 0; + RTMPConstructCCMPHdr(Key_ID, PN, res_buf); + if (NdisEqualMemory(res_buf, CCMP_HDR, 8)) + printk("Construct CCMP_HDR is OK!!!\n"); + else + { + printk("\n!!!Construct CCMP_HDR is FAILURE!!!\n\n"); + hex_dump("Calculate CCMP_HDR", res_buf, 8); + } + + /* Encrypt action */ + NdisZeroMemory(res_buf, 100); + NdisMoveMemory(res_buf, P_TEXT_DATA, sizeof(P_TEXT_DATA)); + res_len = sizeof(C_TEXT_DATA); + if (AES_CCM_Encrypt(res_buf, sizeof(P_TEXT_DATA), + TK, sizeof(TK), + CCM_NONCE, sizeof(CCM_NONCE), + AAD, sizeof(AAD), 8, + res_buf, &res_len) == 0) + { + if (res_len == sizeof(C_TEXT_DATA) && + NdisEqualMemory(res_buf, C_TEXT_DATA, res_len)) + printk("CCM_Encrypt is OK!!!\n"); + else + { + printk("\n!!!CCM_Encrypt is FAILURE!!!\n\n"); + hex_dump("CCM_Encrypt", res_buf, res_len); + } + } + + /* Decrypt action */ + NdisZeroMemory(res_buf, 100); + NdisMoveMemory(res_buf, C_TEXT_DATA, sizeof(C_TEXT_DATA)); + res_len = sizeof(P_TEXT_DATA); + if (AES_CCM_Decrypt(res_buf, sizeof(C_TEXT_DATA), TK, 16, + CCM_NONCE, sizeof(CCM_NONCE), + AAD, sizeof(AAD), 8, + res_buf, &res_len) == 0) + { + if (res_len == sizeof(P_TEXT_DATA) && + NdisEqualMemory(res_buf, P_TEXT_DATA, res_len)) + printk("CCM_Decrypt is OK!!!\n"); + else + { + printk("\n!!!CCM_Decrypt is FAILURE!!!\n\n"); + hex_dump("CCM_Decrypt", res_buf, res_len); + } + } + + + printk("== CCMP test vector == \n"); + + } + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_asic.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_asic.c new file mode 100644 index 000000000..d4cbbdd4c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_asic.c @@ -0,0 +1,3346 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_asic.c + + Abstract: + Functions used to communicate with ASIC + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#include "rt_config.h" + +#ifdef RT28xx +// Reset the RFIC setting to new series +RTMP_RF_REGS RF2850RegTable[] = { +// ch R1 R2 R3(TX0~4=0) R4 + {1, 0x98402ecc, 0x984c0786, 0x9816b455, 0x9800510b}, + {2, 0x98402ecc, 0x984c0786, 0x98168a55, 0x9800519f}, + {3, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800518b}, + {4, 0x98402ecc, 0x984c078a, 0x98168a55, 0x9800519f}, + {5, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800518b}, + {6, 0x98402ecc, 0x984c078e, 0x98168a55, 0x9800519f}, + {7, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800518b}, + {8, 0x98402ecc, 0x984c0792, 0x98168a55, 0x9800519f}, + {9, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800518b}, + {10, 0x98402ecc, 0x984c0796, 0x98168a55, 0x9800519f}, + {11, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800518b}, + {12, 0x98402ecc, 0x984c079a, 0x98168a55, 0x9800519f}, + {13, 0x98402ecc, 0x984c079e, 0x98168a55, 0x9800518b}, + {14, 0x98402ecc, 0x984c07a2, 0x98168a55, 0x98005193}, + + // 802.11 UNI / HyperLan 2 + {36, 0x98402ecc, 0x984c099a, 0x98158a55, 0x980ed1a3}, + {38, 0x98402ecc, 0x984c099e, 0x98158a55, 0x980ed193}, + {40, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed183}, + {44, 0x98402ec8, 0x984c0682, 0x98158a55, 0x980ed1a3}, + {46, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed18b}, + {48, 0x98402ec8, 0x984c0686, 0x98158a55, 0x980ed19b}, + {52, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed193}, + {54, 0x98402ec8, 0x984c068a, 0x98158a55, 0x980ed1a3}, + {56, 0x98402ec8, 0x984c068e, 0x98158a55, 0x980ed18b}, + {60, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed183}, + {62, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed193}, + {64, 0x98402ec8, 0x984c0692, 0x98158a55, 0x980ed1a3}, // Plugfest#4, Day4, change RFR3 left4th 9->5. + + // 802.11 HyperLan 2 + {100, 0x98402ec8, 0x984c06b2, 0x98178a55, 0x980ed783}, + + // 2008.04.30 modified + // The system team has AN to improve the EVM value + // for channel 102 to 108 for the RT2850/RT2750 dual band solution. + {102, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed793}, + {104, 0x98402ec8, 0x985c06b2, 0x98578a55, 0x980ed1a3}, + {108, 0x98402ecc, 0x985c0a32, 0x98578a55, 0x980ed193}, + + {110, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed183}, + {112, 0x98402ecc, 0x984c0a36, 0x98178a55, 0x980ed19b}, + {116, 0x98402ecc, 0x984c0a3a, 0x98178a55, 0x980ed1a3}, + {118, 0x98402ecc, 0x984c0a3e, 0x98178a55, 0x980ed193}, + {120, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed183}, + {124, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed193}, + {126, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed15b}, // 0x980ed1bb->0x980ed15b required by Rory 20070927 + {128, 0x98402ec4, 0x984c0382, 0x98178a55, 0x980ed1a3}, + {132, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed18b}, + {134, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed193}, + {136, 0x98402ec4, 0x984c0386, 0x98178a55, 0x980ed19b}, + {140, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed183}, + + // 802.11 UNII + {149, 0x98402ec4, 0x984c038a, 0x98178a55, 0x980ed1a7}, + {151, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed187}, + {153, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed18f}, + {157, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed19f}, + {159, 0x98402ec4, 0x984c038e, 0x98178a55, 0x980ed1a7}, + {161, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed187}, + {165, 0x98402ec4, 0x984c0392, 0x98178a55, 0x980ed197}, + {167, 0x98402ec4, 0x984c03d2, 0x98179855, 0x9815531f}, + {169, 0x98402ec4, 0x984c03d2, 0x98179855, 0x98155327}, + {171, 0x98402ec4, 0x984c03d6, 0x98179855, 0x98155307}, + {173, 0x98402ec4, 0x984c03d6, 0x98179855, 0x9815530f}, + + // Japan + {184, 0x95002ccc, 0x9500491e, 0x9509be55, 0x950c0a0b}, + {188, 0x95002ccc, 0x95004922, 0x9509be55, 0x950c0a13}, + {192, 0x95002ccc, 0x95004926, 0x9509be55, 0x950c0a1b}, + {196, 0x95002ccc, 0x9500492a, 0x9509be55, 0x950c0a23}, + {208, 0x95002ccc, 0x9500493a, 0x9509be55, 0x950c0a13}, + {212, 0x95002ccc, 0x9500493e, 0x9509be55, 0x950c0a1b}, + {216, 0x95002ccc, 0x95004982, 0x9509be55, 0x950c0a23}, + + // still lack of MMAC(Japan) ch 34,38,42,46 +}; +UCHAR NUM_OF_2850_CHNL = (sizeof(RF2850RegTable) / sizeof(RTMP_RF_REGS)); +#endif // RT28xx // + +FREQUENCY_ITEM FreqItems3020[] = +{ + /**************************************************/ + // ISM : 2.4 to 2.483 GHz // + /**************************************************/ + // 11g + /**************************************************/ + //-CH---N-------R---K----------- + {1, 241, 2, 2}, + {2, 241, 2, 7}, + {3, 242, 2, 2}, + {4, 242, 2, 7}, + {5, 243, 2, 2}, + {6, 243, 2, 7}, + {7, 244, 2, 2}, + {8, 244, 2, 7}, + {9, 245, 2, 2}, + {10, 245, 2, 7}, + {11, 246, 2, 2}, + {12, 246, 2, 7}, + {13, 247, 2, 2}, + {14, 248, 2, 4}, +}; +UCHAR NUM_OF_3020_CHNL = (sizeof(FreqItems3020) / sizeof(FREQUENCY_ITEM)); + +#ifdef RT35xx +FREQUENCY_ITEM FreqItems3572[] = +{ + /**************************************************/ + // ISM : 2.4 to 2.483 GHz // + /**************************************************/ + //-CH---N-------R---K----------- + {1, 241, 2, 2}, + {2, 241, 2, 7}, + {3, 242, 2, 2}, + {4, 242, 2, 7}, + {5, 243, 2, 2}, + {6, 243, 2, 7}, + {7, 244, 2, 2}, + {8, 244, 2, 7}, + {9, 245, 2, 2}, + {10, 245, 2, 7}, + {11, 246, 2, 2}, + {12, 246, 2, 7}, + {13, 247, 2, 2}, + {14, 248, 2, 4}, + + /**************************************************/ + // 5 GHz + /**************************************************/ + {36, 0x56, 0, 4}, + {38, 0x56, 0, 6}, + {40, 0x56, 0, 8}, + {44, 0x57, 0, 0}, + {46, 0x57, 0, 2}, + {48, 0x57, 0, 4}, + {52, 0x57, 0, 8}, + {54, 0x57, 0, 10}, + {56, 0x58, 0, 0}, + {60, 0x58, 0, 4}, + {62, 0x58, 0, 6}, + {64, 0x58, 0, 8}, + + {100, 0x5B, 0, 8}, + {102, 0x5B, 0, 10}, + {104, 0x5C, 0, 0}, + {108, 0x5C, 0, 4}, + {110, 0x5C, 0, 6}, + {112, 0x5C, 0, 8}, +// {114, 0x5C, 0, 10}, + {116, 0x5D, 0, 0}, + {118, 0x5D, 0, 2}, + {120, 0x5D, 0, 4}, + {124, 0x5D, 0, 8}, + {126, 0x5D, 0, 10}, + {128, 0x5E, 0, 0}, + {132, 0x5E, 0, 4}, + {134, 0x5E, 0, 6}, + {136, 0x5E, 0, 8}, + {140, 0x5F, 0, 0}, + + {149, 0x5F, 0, 9}, + {151, 0x5F, 0, 11}, + {153, 0x60, 0, 1}, + {157, 0x60, 0, 5}, + {159, 0x60, 0, 7}, + {161, 0x60, 0, 9}, + {165, 0x61, 0, 1}, + {167, 0x61, 0, 3}, + {169, 0x61, 0, 5}, + {171, 0x61, 0, 7}, + {173, 0x61, 0, 9}, +}; +UCHAR NUM_OF_3572_CHNL = (sizeof(FreqItems3572) / sizeof(FREQUENCY_ITEM)); +#endif // RT35xx // + +VOID AsicUpdateAutoFallBackTable( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pRateTable) +{ + UCHAR i; + HT_FBK_CFG0_STRUC HtCfg0; + HT_FBK_CFG1_STRUC HtCfg1; + LG_FBK_CFG0_STRUC LgCfg0; + LG_FBK_CFG1_STRUC LgCfg1; + PRTMP_TX_RATE_SWITCH pCurrTxRate, pNextTxRate; + + // set to initial value + HtCfg0.word = 0x65432100; + HtCfg1.word = 0xedcba988; + LgCfg0.word = 0xedcba988; + LgCfg1.word = 0x00002100; + + pNextTxRate = (PRTMP_TX_RATE_SWITCH)pRateTable+1; + for (i = 1; i < *((PUCHAR) pRateTable); i++) + { + pCurrTxRate = (PRTMP_TX_RATE_SWITCH)pRateTable+1+i; + switch (pCurrTxRate->Mode) + { + case 0: //CCK + break; + case 1: //OFDM + { + switch(pCurrTxRate->CurrMCS) + { + case 0: + LgCfg0.field.OFDMMCS0FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS; + break; + case 1: + LgCfg0.field.OFDMMCS1FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS; + break; + case 2: + LgCfg0.field.OFDMMCS2FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS; + break; + case 3: + LgCfg0.field.OFDMMCS3FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS; + break; + case 4: + LgCfg0.field.OFDMMCS4FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS; + break; + case 5: + LgCfg0.field.OFDMMCS5FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS; + break; + case 6: + LgCfg0.field.OFDMMCS6FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS; + break; + case 7: + LgCfg0.field.OFDMMCS7FBK = (pNextTxRate->Mode == MODE_OFDM) ? (pNextTxRate->CurrMCS+8): pNextTxRate->CurrMCS; + break; + } + } + break; +#ifdef DOT11_N_SUPPORT + case 2: //HT-MIX + case 3: //HT-GF + { + if ((pNextTxRate->Mode >= MODE_HTMIX) && (pCurrTxRate->CurrMCS != pNextTxRate->CurrMCS)) + { + switch(pCurrTxRate->CurrMCS) + { + case 0: + HtCfg0.field.HTMCS0FBK = pNextTxRate->CurrMCS; + break; + case 1: + HtCfg0.field.HTMCS1FBK = pNextTxRate->CurrMCS; + break; + case 2: + HtCfg0.field.HTMCS2FBK = pNextTxRate->CurrMCS; + break; + case 3: + HtCfg0.field.HTMCS3FBK = pNextTxRate->CurrMCS; + break; + case 4: + HtCfg0.field.HTMCS4FBK = pNextTxRate->CurrMCS; + break; + case 5: + HtCfg0.field.HTMCS5FBK = pNextTxRate->CurrMCS; + break; + case 6: + HtCfg0.field.HTMCS6FBK = pNextTxRate->CurrMCS; + break; + case 7: + HtCfg0.field.HTMCS7FBK = pNextTxRate->CurrMCS; + break; + case 8: + HtCfg1.field.HTMCS8FBK = pNextTxRate->CurrMCS; + break; + case 9: + HtCfg1.field.HTMCS9FBK = pNextTxRate->CurrMCS; + break; + case 10: + HtCfg1.field.HTMCS10FBK = pNextTxRate->CurrMCS; + break; + case 11: + HtCfg1.field.HTMCS11FBK = pNextTxRate->CurrMCS; + break; + case 12: + HtCfg1.field.HTMCS12FBK = pNextTxRate->CurrMCS; + break; + case 13: + HtCfg1.field.HTMCS13FBK = pNextTxRate->CurrMCS; + break; + case 14: + HtCfg1.field.HTMCS14FBK = pNextTxRate->CurrMCS; + break; + case 15: + HtCfg1.field.HTMCS15FBK = pNextTxRate->CurrMCS; + break; + default: + DBGPRINT(RT_DEBUG_ERROR, ("AsicUpdateAutoFallBackTable: not support CurrMCS=%d\n", pCurrTxRate->CurrMCS)); + } + } + } + break; +#endif // DOT11_N_SUPPORT // + } + + pNextTxRate = pCurrTxRate; + } + + RTMP_IO_WRITE32(pAd, HT_FBK_CFG0, HtCfg0.word); + RTMP_IO_WRITE32(pAd, HT_FBK_CFG1, HtCfg1.word); + RTMP_IO_WRITE32(pAd, LG_FBK_CFG0, LgCfg0.word); + RTMP_IO_WRITE32(pAd, LG_FBK_CFG1, LgCfg1.word); +} + +/* + ======================================================================== + + Routine Description: + Set MAC register value according operation mode. + OperationMode AND bNonGFExist are for MM and GF Proteciton. + If MM or GF mask is not set, those passing argument doesn't not take effect. + + Operation mode meaning: + = 0 : Pure HT, no preotection. + = 0x01; there may be non-HT devices in both the control and extension channel, protection is optional in BSS. + = 0x10: No Transmission in 40M is protected. + = 0x11: Transmission in both 40M and 20M shall be protected + if (bNonGFExist) + we should choose not to use GF. But still set correct ASIC registers. + ======================================================================== +*/ +VOID AsicUpdateProtect( + IN PRTMP_ADAPTER pAd, + IN USHORT OperationMode, + IN UCHAR SetMask, + IN BOOLEAN bDisableBGProtect, + IN BOOLEAN bNonGFExist) +{ + PROT_CFG_STRUC ProtCfg, ProtCfg4; + UINT32 Protect[6]; + USHORT offset; + UCHAR i; + UINT32 MacReg = 0; + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + +#ifdef DOT11_N_SUPPORT + if (!(pAd->CommonCfg.bHTProtect) && (OperationMode != 8)) + { + return; + } + + if (pAd->BATable.numDoneOriginator) + { + // + // enable the RTS/CTS to avoid channel collision + // + SetMask |= ALLN_SETPROTECT; + OperationMode = 8; + } +#endif // DOT11_N_SUPPORT // + + // Config ASIC RTS threshold register + RTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg); + MacReg &= 0xFF0000FF; + // If the user want disable RtsThreshold and enbale Amsdu/Ralink-Aggregation, set the RtsThreshold as 4096 + if (( +#ifdef DOT11_N_SUPPORT + (pAd->CommonCfg.BACapability.field.AmsduEnable) || +#endif // DOT11_N_SUPPORT // + (pAd->CommonCfg.bAggregationCapable == TRUE)) + && pAd->CommonCfg.RtsThreshold == MAX_RTS_THRESHOLD) + { + MacReg |= (0x1000 << 8); + } + else + { + MacReg |= (pAd->CommonCfg.RtsThreshold << 8); + } + + RTMP_IO_WRITE32(pAd, TX_RTS_CFG, MacReg); + + // Initial common protection settings + RTMPZeroMemory(Protect, sizeof(Protect)); + ProtCfg4.word = 0; + ProtCfg.word = 0; + ProtCfg.field.TxopAllowGF40 = 1; + ProtCfg.field.TxopAllowGF20 = 1; + ProtCfg.field.TxopAllowMM40 = 1; + ProtCfg.field.TxopAllowMM20 = 1; + ProtCfg.field.TxopAllowOfdm = 1; + ProtCfg.field.TxopAllowCck = 1; + ProtCfg.field.RTSThEn = 1; + ProtCfg.field.ProtectNav = ASIC_SHORTNAV; + + // update PHY mode and rate + if (pAd->CommonCfg.Channel > 14) + ProtCfg.field.ProtectRate = 0x4000; + ProtCfg.field.ProtectRate |= pAd->CommonCfg.RtsRate; + + // Handle legacy(B/G) protection + if (bDisableBGProtect) + { + //ProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate; + ProtCfg.field.ProtectCtrl = 0; + Protect[0] = ProtCfg.word; + Protect[1] = ProtCfg.word; + pAd->FlgCtsEnabled = 0; /* CTS-self is not used */ + } + else + { + //ProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate; + ProtCfg.field.ProtectCtrl = 0; // CCK do not need to be protected + Protect[0] = ProtCfg.word; + ProtCfg.field.ProtectCtrl = ASIC_CTS; // OFDM needs using CCK to protect + Protect[1] = ProtCfg.word; + pAd->FlgCtsEnabled = 1; /* CTS-self is used */ + } + +#ifdef DOT11_N_SUPPORT + // Decide HT frame protection. + if ((SetMask & ALLN_SETPROTECT) != 0) + { + switch(OperationMode) + { + case 0x0: + // NO PROTECT + // 1.All STAs in the BSS are 20/40 MHz HT + // 2. in ai 20/40MHz BSS + // 3. all STAs are 20MHz in a 20MHz BSS + // Pure HT. no protection. + + // MM20_PROT_CFG + // Reserved (31:27) + // PROT_TXOP(25:20) -- 010111 + // PROT_NAV(19:18) -- 01 (Short NAV protection) + // PROT_CTRL(17:16) -- 00 (None) + // PROT_RATE(15:0) -- 0x4004 (OFDM 24M) + Protect[2] = 0x01744004; + + // MM40_PROT_CFG + // Reserved (31:27) + // PROT_TXOP(25:20) -- 111111 + // PROT_NAV(19:18) -- 01 (Short NAV protection) + // PROT_CTRL(17:16) -- 00 (None) + // PROT_RATE(15:0) -- 0x4084 (duplicate OFDM 24M) + Protect[3] = 0x03f44084; + + // CF20_PROT_CFG + // Reserved (31:27) + // PROT_TXOP(25:20) -- 010111 + // PROT_NAV(19:18) -- 01 (Short NAV protection) + // PROT_CTRL(17:16) -- 00 (None) + // PROT_RATE(15:0) -- 0x4004 (OFDM 24M) + Protect[4] = 0x01744004; + + // CF40_PROT_CFG + // Reserved (31:27) + // PROT_TXOP(25:20) -- 111111 + // PROT_NAV(19:18) -- 01 (Short NAV protection) + // PROT_CTRL(17:16) -- 00 (None) + // PROT_RATE(15:0) -- 0x4084 (duplicate OFDM 24M) + Protect[5] = 0x03f44084; + + if (bNonGFExist) + { + // PROT_NAV(19:18) -- 01 (Short NAV protectiion) + // PROT_CTRL(17:16) -- 01 (RTS/CTS) + Protect[4] = 0x01754004; + Protect[5] = 0x03f54084; + } + pAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE; + break; + + case 1: + // This is "HT non-member protection mode." + // If there may be non-HT STAs my BSS + ProtCfg.word = 0x01744004; // PROT_CTRL(17:16) : 0 (None) + ProtCfg4.word = 0x03f44084; // duplicaet legacy 24M. BW set 1. + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED)) + { + ProtCfg.word = 0x01740003; //ERP use Protection bit is set, use protection rate at Clause 18.. + ProtCfg4.word = 0x03f40003; // Don't duplicate RTS/CTS in CCK mode. 0x03f40083; + } + //Assign Protection method for 20&40 MHz packets + ProtCfg.field.ProtectCtrl = ASIC_RTS; + ProtCfg.field.ProtectNav = ASIC_SHORTNAV; + ProtCfg4.field.ProtectCtrl = ASIC_RTS; + ProtCfg4.field.ProtectNav = ASIC_SHORTNAV; + Protect[2] = ProtCfg.word; + Protect[3] = ProtCfg4.word; + Protect[4] = ProtCfg.word; + Protect[5] = ProtCfg4.word; + pAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE; + break; + + case 2: + // If only HT STAs are in BSS. at least one is 20MHz. Only protect 40MHz packets + ProtCfg.word = 0x01744004; // PROT_CTRL(17:16) : 0 (None) + ProtCfg4.word = 0x03f44084; // duplicaet legacy 24M. BW set 1. + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED)) + { + ProtCfg.word = 0x01740003; //ERP use Protection bit is set, use protection rate at Clause 18.. + ProtCfg4.word = 0x03f40003; // Don't duplicate RTS/CTS in CCK mode. 0x03f40083; + } + //Assign Protection method for 40MHz packets + ProtCfg4.field.ProtectCtrl = ASIC_RTS; + ProtCfg4.field.ProtectNav = ASIC_SHORTNAV; + Protect[2] = ProtCfg.word; + Protect[3] = ProtCfg4.word; + if (bNonGFExist) + { + ProtCfg.field.ProtectCtrl = ASIC_RTS; + ProtCfg.field.ProtectNav = ASIC_SHORTNAV; + } + Protect[4] = ProtCfg.word; + Protect[5] = ProtCfg4.word; + + pAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE; + break; + + case 3: + // HT mixed mode. PROTECT ALL! + // Assign Rate + ProtCfg.word = 0x01744004; //duplicaet legacy 24M. BW set 1. + ProtCfg4.word = 0x03f44084; + // both 20MHz and 40MHz are protected. Whether use RTS or CTS-to-self depends on the + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED)) + { + ProtCfg.word = 0x01740003; //ERP use Protection bit is set, use protection rate at Clause 18.. + ProtCfg4.word = 0x03f40003; // Don't duplicate RTS/CTS in CCK mode. 0x03f40083 + } + //Assign Protection method for 20&40 MHz packets + ProtCfg.field.ProtectCtrl = ASIC_RTS; + ProtCfg.field.ProtectNav = ASIC_SHORTNAV; + ProtCfg4.field.ProtectCtrl = ASIC_RTS; + ProtCfg4.field.ProtectNav = ASIC_SHORTNAV; + Protect[2] = ProtCfg.word; + Protect[3] = ProtCfg4.word; + Protect[4] = ProtCfg.word; + Protect[5] = ProtCfg4.word; + pAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE; + break; + + case 8: + // Special on for Atheros problem n chip. + ProtCfg.word = 0x01754004; //duplicaet legacy 24M. BW set 1. + ProtCfg4.word = 0x03f54084; + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED)) + { + ProtCfg.word = 0x01750003; //ERP use Protection bit is set, use protection rate at Clause 18.. + ProtCfg4.word = 0x03f50003; // Don't duplicate RTS/CTS in CCK mode. 0x03f40083 + } + + Protect[2] = ProtCfg.word; //0x01754004; + Protect[3] = ProtCfg4.word; //0x03f54084; + Protect[4] = ProtCfg.word; //0x01754004; + Protect[5] = ProtCfg4.word; //0x03f54084; + pAd->CommonCfg.IOTestParm.bRTSLongProtOn = TRUE; + break; + } + } +#endif // DOT11_N_SUPPORT // + + offset = CCK_PROT_CFG; + for (i = 0;i < 6;i++) + { + if ((SetMask & (1<< i))) + { + RTMP_IO_WRITE32(pAd, offset + i*4, Protect[i]); + } +} +} + + +VOID AsicBBPAdjust(RTMP_ADAPTER *pAd) +{ + UINT32 Value; + UCHAR byteValue = 0; + +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && + (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE) + /*(pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE)*/ + ) + { + pAd->CommonCfg.BBPCurrentBW = BW_40; + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2; + + // TX : control channel at lower + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value &= (~0x1); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + + // RX : control channel at lower + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &byteValue); + byteValue &= (~0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, byteValue); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &byteValue); + byteValue &= (~0x18); + byteValue |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, byteValue); + if (pAd->CommonCfg.Channel > 14) + { // request by Gary 20070208 for middle and long range A Band +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, 0x48); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, 0x48); + } + else + { // request by Gary 20070208 for middle and long range G Band +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, 0x38); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, 0x38); + } + // + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16); + } + else + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x12); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x10); + } + + DBGPRINT(RT_DEBUG_TRACE, ("ApStartUp : ExtAbove, ChannelWidth=%d, Channel=%d, ExtChanOffset=%d(%d) \n", + pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth, + pAd->CommonCfg.Channel, + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA, + pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset)); + } + else if ((pAd->CommonCfg.Channel > 2) && + (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && + (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW) + /*(pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW)*/) + { + pAd->CommonCfg.BBPCurrentBW = BW_40; + if (pAd->CommonCfg.Channel == 14) + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 1; + else + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2; + + // TX : control channel at upper + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value |= (0x1); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + + // RX : control channel at upper + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &byteValue); + byteValue |= (0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, byteValue); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &byteValue); + byteValue &= (~0x18); + byteValue |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, byteValue); + + if (pAd->CommonCfg.Channel > 14) + { // request by Gary 20070208 for middle and long range A Band +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, 0x48); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, 0x48); + } + else + { // request by Gary 20070208 for middle and long range G band +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, 0x38); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, 0x38); + } + + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16); + } + else + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x12); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x10); + } + DBGPRINT(RT_DEBUG_TRACE, ("ApStartUp : ExtBlow, ChannelWidth=%d, Channel=%d, ExtChanOffset=%d(%d) \n", + pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth, + pAd->CommonCfg.Channel, + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA, + pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset)); + } + else +#endif // DOT11_N_SUPPORT // + { + pAd->CommonCfg.BBPCurrentBW = BW_20; + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; + + // TX : control channel at lower + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value &= (~0x1); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &byteValue); + byteValue &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, byteValue); + + // 20 MHz bandwidth + if (pAd->CommonCfg.Channel > 14) + { // request by Gary 20070208 +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, 0x40); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, 0x40); + } + else + { // request by Gary 20070208 + //RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, 0x30); + // request by Brian 20070306 +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, 0x38); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, 0x38); + } + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11); + } + else + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x12); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0a); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x10); + } + +#ifdef DOT11_N_SUPPORT + DBGPRINT(RT_DEBUG_TRACE, ("ApStartUp : 20MHz, ChannelWidth=%d, Channel=%d, ExtChanOffset=%d(%d) \n", + pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth, + pAd->CommonCfg.Channel, + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA, + pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset)); +#endif // DOT11_N_SUPPORT // + } + + if (pAd->CommonCfg.Channel > 14) + { // request by Gary 20070208 for middle and long range A Band + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, 0x1D); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, 0x1D); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, 0x1D); + //RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0x1D); + } + else + { // request by Gary 20070208 for middle and long range G band + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, 0x2D); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, 0x2D); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, 0x2D); + //RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0x2D); + } + +} + + +/* + ========================================================================== + Description: + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicSwitchChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel, + IN BOOLEAN bScan) +{ + CHAR TxPwer = 0, TxPwer2 = DEFAULT_RF_TX_POWER; //Bbp94 = BBPR94_DEFAULT, TxPwer2 = DEFAULT_RF_TX_POWER; + UCHAR index; + UINT32 Value = 0; //BbpReg, Value; + UCHAR RFValue; + + + RFValue = 0; + // Search Tx power value + + /* + We can't use ChannelList to search channel, since some central channl's txpowr doesn't list + in ChannelList, so use TxPower array instead. + */ + for (index = 0; index < MAX_NUM_OF_CHANNELS; index++) + { + if (Channel == pAd->TxPower[index].Channel) + { + TxPwer = pAd->TxPower[index].Power; + TxPwer2 = pAd->TxPower[index].Power2; + break; + } + } + + if (index == MAX_NUM_OF_CHANNELS) + { + DBGPRINT(RT_DEBUG_ERROR, ("AsicSwitchChannel: Can't find the Channel#%d \n", Channel)); + } + +#ifdef RT30xx + // The RF programming sequence is difference between 3xxx and 2xxx + if ((IS_RT3070(pAd) || IS_RT3090(pAd)||IS_RT3390(pAd)) && + ((pAd->RfIcType == RFIC_3020) || (pAd->RfIcType == RFIC_2020) || + (pAd->RfIcType == RFIC_3021) || (pAd->RfIcType == RFIC_3022) || (pAd->RfIcType == RFIC_3320))) + { + /* modify by WY for Read RF Reg. error */ + UCHAR calRFValue; + for (index = 0; index < NUM_OF_3020_CHNL; index++) + { + if (Channel == FreqItems3020[index].Channel) + { + // Programming channel parameters + RT30xxWriteRFRegister(pAd, RF_R02, FreqItems3020[index].N); + RT30xxWriteRFRegister(pAd, RF_R03, FreqItems3020[index].K); + RT30xxReadRFRegister(pAd, RF_R06, &RFValue); + RFValue = (RFValue & 0xFC) | FreqItems3020[index].R; + RT30xxWriteRFRegister(pAd, RF_R06, RFValue); + + // Set Tx0 Power + RT30xxReadRFRegister(pAd, RF_R12, &RFValue); + RFValue = (RFValue & 0xE0) | TxPwer; + RT30xxWriteRFRegister(pAd, RF_R12, RFValue); + + // Set Tx1 Power + RT30xxReadRFRegister(pAd, RF_R13, &RFValue); + RFValue = (RFValue & 0xE0) | TxPwer2; + RT30xxWriteRFRegister(pAd, RF_R13, RFValue); + + // Tx/Rx Stream setting + RT30xxReadRFRegister(pAd, RF_R01, &RFValue); + //if (IS_RT3090(pAd)) + // RFValue |= 0x01; // Enable RF block. + RFValue &= 0x03; //clear bit[7~2] + if (pAd->Antenna.field.TxPath == 1) + RFValue |= 0xA0; + else if (pAd->Antenna.field.TxPath == 2) + RFValue |= 0x80; + if (pAd->Antenna.field.RxPath == 1) + RFValue |= 0x50; + else if (pAd->Antenna.field.RxPath == 2) + RFValue |= 0x40; + RT30xxWriteRFRegister(pAd, RF_R01, RFValue); + + // Set RF offset + RT30xxReadRFRegister(pAd, RF_R23, &RFValue); + RFValue = (RFValue & 0x80) | pAd->RfFreqOffset; + RT30xxWriteRFRegister(pAd, RF_R23, RFValue); + + // Set BW + if (!bScan && (pAd->CommonCfg.BBPCurrentBW == BW_40)) + { + calRFValue = pAd->Mlme.CaliBW40RfR24; + //DISABLE_11N_CHECK(pAd); + } + else + { + calRFValue = pAd->Mlme.CaliBW20RfR24; + } + RT30xxReadRFRegister(pAd, RF_R24, (PUCHAR)(&RFValue)); + calRFValue = (RFValue & 0xC0) | (calRFValue & ~0xC0); // <bit 5>:tx_h20M<bit 5> and <bit 4:0>:tx_agc_fc<bit 4:0> + RT30xxWriteRFRegister(pAd, RF_R24, calRFValue); + + // Set BW + if (IS_RT3390(pAd)) // RT3390 has different AGC for Tx and Rx + { + if (!bScan && (pAd->CommonCfg.BBPCurrentBW == BW_40)) + { + calRFValue = pAd->Mlme.CaliBW40RfR31; + } + else + { + calRFValue = pAd->Mlme.CaliBW20RfR31; + } + } + RT30xxReadRFRegister(pAd, RF_R31, (PUCHAR)(&RFValue)); + calRFValue = (RFValue & 0xC0) | (calRFValue & ~0xC0); // <bit 5>:rx_h20M<bit 5> and <bit 4:0>:rx_agc_fc<bit 4:0> + RT30xxWriteRFRegister(pAd, RF_R31, calRFValue); + + // Enable RF tuning + RT30xxReadRFRegister(pAd, RF_R07, &RFValue); + RFValue = RFValue | 0x1; + RT30xxWriteRFRegister(pAd, RF_R07, RFValue); + + // latch channel for future usage. + pAd->LatchRfRegs.Channel = Channel; + + DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%d, Pwr1=%d, %dT), N=0x%02X, K=0x%02X, R=0x%02X\n", + Channel, + pAd->RfIcType, + TxPwer, + TxPwer2, + pAd->Antenna.field.TxPath, + FreqItems3020[index].N, + FreqItems3020[index].K, + FreqItems3020[index].R)); + + break; + } + } + } + else +#endif // RT30xx // +#ifdef RT35xx + /* 3562:RFIC_3052/ 3062:RFIC_3022 */ + if (IS_RT3572(pAd) /*&& (pAd->RfIcType == RFIC_3052)*/) + { + for (index = 0; index < NUM_OF_3572_CHNL; index++) + { + // RT3062, 2.4G + if ((pAd->RfIcType != RFIC_3052) && (Channel > 14)) + { + break; + } + + if (Channel == FreqItems3572[index].Channel) + { + // for 2.4G, restore BBP25, BBP26 + if (Channel <= 14) + { + BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, pAd->Bbp25); + BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R26, pAd->Bbp26); + } + // hard code for 5GGhz, Gary 2008-12-10 + else + { + // Enable IQ Phase Correction + BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x09); + // IQ Phase correction value + BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R26, 0xFF); + } + + // Programming channel parameters + RT30xxWriteRFRegister(pAd, RF_R02, FreqItems3572[index].N); + RT30xxWriteRFRegister(pAd, RF_R03, FreqItems3572[index].K); + + RT30xxReadRFRegister(pAd, RF_R06, &RFValue); + if (Channel <= 14) + RFValue = (RFValue & 0xF0) | FreqItems3572[index].R | 0x8; + else + RFValue = (RFValue & 0xF0) | FreqItems3572[index].R | 0x4; + RT30xxWriteRFRegister(pAd, RF_R06, RFValue); + + // Pll mode for 2.4G or 5G + RT30xxReadRFRegister(pAd, RF_R05, &RFValue); + if (Channel <= 14) + RFValue = (RFValue & 0xF3) | 0x4; + else + RFValue = (RFValue & 0xF3) | 0x8; + RT30xxWriteRFRegister(pAd, RF_R05, RFValue); + + // Set Tx0 Power + RT30xxReadRFRegister(pAd, RF_R12, (PUCHAR)&RFValue); + if (Channel <= 14) + RFValue = 0x60 | TxPwer; + else + RFValue = 0xE0 | (TxPwer & 0x3) | ((TxPwer & 0xC) << 1); + RT30xxWriteRFRegister(pAd, RF_R12, RFValue); + + // Set Tx1 Power + RT30xxReadRFRegister(pAd, RF_R13, (PUCHAR)&RFValue); + if (Channel <= 14) + RFValue = 0x60 | TxPwer2; + else + RFValue = 0xE0 | (TxPwer2 & 0x3) | ((TxPwer2 & 0xC) << 1); + RT30xxWriteRFRegister(pAd, RF_R13, RFValue); + + // Tx/Rx Stream setting + RT30xxReadRFRegister(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue &= 0x03; //clear bit[7~2] + if (pAd->Antenna.field.TxPath == 1) + RFValue |= 0xA0; + else if (pAd->Antenna.field.TxPath == 2) + RFValue |= 0x80; + if (pAd->Antenna.field.RxPath == 1) + RFValue |= 0x50; + else if (pAd->Antenna.field.RxPath == 2) + RFValue |= 0x40; + RT30xxWriteRFRegister(pAd, RF_R01, (UCHAR)RFValue); + + // Set RF offset + RT30xxReadRFRegister(pAd, RF_R23, (PUCHAR)&RFValue); + RFValue = (RFValue & 0x80) | pAd->RfFreqOffset; + RT30xxWriteRFRegister(pAd, RF_R23, (UCHAR)RFValue); + + // Set BW + if (!bScan && (pAd->CommonCfg.BBPCurrentBW == BW_40)) + { + RFValue = pAd->Mlme.CaliBW40RfR24; + //DISABLE_11N_CHECK(pAd); + } + else + { + RFValue = pAd->Mlme.CaliBW20RfR24; + } + // R24, R31, one is for tx, the other is for rx + RT30xxWriteRFRegister(pAd, RF_R24, (UCHAR)RFValue); + RT30xxWriteRFRegister(pAd, RF_R31, (UCHAR)RFValue); + + // Enable RF tuning + RT30xxReadRFRegister(pAd, RF_R07, (PUCHAR)&RFValue); + if (Channel <= 14) + //RFValue = (RFValue & 0x37) | 0xCC; + RFValue = 0xd8; //?? to check 3572?? hardcode + else + RFValue = (RFValue & 0x37) | 0x14; + RT30xxWriteRFRegister(pAd, RF_R07, (UCHAR)RFValue); + + // TSSI_BS + RT30xxReadRFRegister(pAd, RF_R09, (PUCHAR)&RFValue); + if (Channel <= 14) + RFValue = 0xC3; //RFValue = (RFValue & 0xBF) | 0x40; + else + RFValue = 0xC0; //RFValue = (RFValue & 0xBF) | 0x40; + RT30xxWriteRFRegister(pAd, RF_R09, (UCHAR)RFValue); + + // Loop filter 1 + RT30xxWriteRFRegister(pAd, RF_R10, (UCHAR)0xF1); + + // Loop filter 2 + if (Channel <= 14) + RT30xxWriteRFRegister(pAd, RF_R11, (UCHAR)0xB9); + else + RT30xxWriteRFRegister(pAd, RF_R11, (UCHAR)0x00); + + // tx_mx2_ic + if (Channel <= 14) + RT30xxWriteRFRegister(pAd, RF_R15, (UCHAR)0x53); + else + RT30xxWriteRFRegister(pAd, RF_R15, (UCHAR)0x43); + // tx_mx1_ic + //RT30xxReadRFRegister(pAd, RF_R16, (PUCHAR)&RFValue); + if (Channel <= 14) + { + RFValue = 0x4c; + + RFValue &= (~0x7); // clean bit [2:0] + RFValue |= pAd->TxMixerGain24G; + } + else + { + RFValue = 0x7a; + + RFValue &= (~0x7); // clean bit [2:0] + RFValue |= pAd->TxMixerGain5G; + } + RT30xxWriteRFRegister(pAd, RF_R16, (UCHAR)RFValue); + + // tx_lo1 + RT30xxWriteRFRegister(pAd, RF_R17, (UCHAR)0x23); + + // tx_lo2 + RFValue = ((Channel <= 14) ? (0x93) : ((Channel <= 64) ? (0xb7) : ((Channel <= 128) ? (0x74) : (0x72)))); + RT30xxWriteRFRegister(pAd, RF_R19, (UCHAR)RFValue); + + // rx_l01 + RFValue = ((Channel <= 14) ? (0xB3) : ((Channel <= 64) ? (0xF6) : ((Channel <= 128) ? (0xF4) : (0xF3)))); + RT30xxWriteRFRegister(pAd, RF_R20, (UCHAR)RFValue); + + // pfd_delay + RFValue = ((Channel <= 14) ? (0x15) : ((Channel <= 64) ? (0x3d) : ((Channel <= 128) ? (0x01) : (0x01)))); + RT30xxWriteRFRegister(pAd, RF_R25, (UCHAR)RFValue); + + // rx_lo2 + if (Channel <= 14) + RT30xxWriteRFRegister(pAd, RF_R26, (UCHAR)0x85); + else + RT30xxWriteRFRegister(pAd, RF_R26, (UCHAR)0x87); + + // ldo_rf_vc + if (Channel <= 14) + RT30xxWriteRFRegister(pAd, RF_R27, (UCHAR)0x00); + else + RT30xxWriteRFRegister(pAd, RF_R27, (UCHAR)0x01); + + // drv_cc + if (Channel <= 14) + RT30xxWriteRFRegister(pAd, RF_R29, (UCHAR)0x9B); + else + RT30xxWriteRFRegister(pAd, RF_R29, (UCHAR)0x9F); + + RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value); + if (Channel <= 14) + Value = ((Value & 0xFFFF7FFF) | 0x00000080); + else + Value = (Value & 0xFFFF7F7F); + RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value); + + // Enable RF tuning, this must be in the last + RT30xxReadRFRegister(pAd, RF_R07, (PUCHAR)&RFValue); + RFValue = RFValue | 0x1; + RT30xxWriteRFRegister(pAd, RF_R07, (UCHAR)RFValue); + + RTMPusecDelay(2000); + + // latch channel for future usage. + pAd->LatchRfRegs.Channel = Channel; + + DBGPRINT(RT_DEBUG_TRACE, ("RT35xx: SwitchChannel#%d(RF=%d, Pwr0=%d, Pwr1=%d, %dT), N=0x%02X, K=0x%02X, R=0x%02X\n", + Channel, + pAd->RfIcType, + TxPwer, + TxPwer2, + pAd->Antenna.field.TxPath, + FreqItems3572[index].N, + FreqItems3572[index].K, + FreqItems3572[index].R)); + break; + } + } + } + else +#endif // RT35xx // + { +#ifdef RT28xx + ULONG R2 = 0, R3 = DEFAULT_RF_TX_POWER, R4 = 0; + RTMP_RF_REGS *RFRegTable; + + RFRegTable = RF2850RegTable; +#endif // RT28xx // + + switch (pAd->RfIcType) + { +#ifdef RT28xx + case RFIC_2820: + case RFIC_2850: + case RFIC_2720: + case RFIC_2750: + for (index = 0; index < NUM_OF_2850_CHNL; index++) + { + if (Channel == RFRegTable[index].Channel) + { + R2 = RFRegTable[index].R2; + if (pAd->Antenna.field.TxPath == 1) + { + R2 |= 0x4000; // If TXpath is 1, bit 14 = 1; + } + + if (pAd->Antenna.field.RxPath == 2) + { + R2 |= 0x40; // write 1 to off Rxpath. + } + else if (pAd->Antenna.field.RxPath == 1) + { + R2 |= 0x20040; // write 1 to off RxPath + } + + if (Channel > 14) + { + // initialize R3, R4 + R3 = (RFRegTable[index].R3 & 0xffffc1ff); + R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->RfFreqOffset << 15); + + // 5G band power range: 0xF9~0X0F, TX0 Reg3 bit9/TX1 Reg4 bit6="0" means the TX power reduce 7dB + // R3 + if ((TxPwer >= -7) && (TxPwer < 0)) + { + TxPwer = (7+TxPwer); + TxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer); + R3 |= (TxPwer << 10); + DBGPRINT(RT_DEBUG_ERROR, ("AsicSwitchChannel: TxPwer=%d \n", TxPwer)); + } + else + { + TxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer); + R3 |= (TxPwer << 10) | (1 << 9); + } + + // R4 + if ((TxPwer2 >= -7) && (TxPwer2 < 0)) + { + TxPwer2 = (7+TxPwer2); + TxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2); + R4 |= (TxPwer2 << 7); + DBGPRINT(RT_DEBUG_ERROR, ("AsicSwitchChannel: TxPwer2=%d \n", TxPwer2)); + } + else + { + TxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2); + R4 |= (TxPwer2 << 7) | (1 << 6); + } + + } + else + { + R3 = (RFRegTable[index].R3 & 0xffffc1ff) | (TxPwer << 9); // set TX power0 + R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->RfFreqOffset << 15) | (TxPwer2 <<6);// Set freq Offset & TxPwr1 + } + + // Based on BBP current mode before changing RF channel. + if (!bScan && (pAd->CommonCfg.BBPCurrentBW == BW_40)) + { + R4 |=0x200000; + } + + // Update variables + pAd->LatchRfRegs.Channel = Channel; + pAd->LatchRfRegs.R1 = RFRegTable[index].R1; + pAd->LatchRfRegs.R2 = R2; + pAd->LatchRfRegs.R3 = R3; + pAd->LatchRfRegs.R4 = R4; + +#ifdef DFS_DEBUG +#ifdef DFS_FCC_BW40_FIX + if (pAd->infType == RTMP_DEV_INF_PCI) // RT2880 PCI + { + /* only for RT2880 */ + // FCC DFS test + pAd->LatchRfRegs.R1 |= 0x100; + pAd->LatchRfRegs.R4 |= 0x00400000; + } +#endif // DFS_FCC_BW40_FIX // +#endif // DFS_DEBUG // + + // Set RF value 1's set R3[bit2] = [0] + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2); + RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04))); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4); + + RTMPusecDelay(200); + + // Set RF value 2's set R3[bit2] = [1] + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2); + RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 | 0x04)); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4); + + RTMPusecDelay(200); + + // Set RF value 3's set R3[bit2] = [0] + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2); + RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04))); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4); + + break; + } + } + + DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%lu, Pwr1=%lu, %dT) to , R1=0x%08lx, R2=0x%08lx, R3=0x%08lx, R4=0x%08lx\n", + Channel, + pAd->RfIcType, + (R3 & 0x00003e00) >> 9, + (R4 & 0x000007c0) >> 6, + pAd->Antenna.field.TxPath, + pAd->LatchRfRegs.R1, + pAd->LatchRfRegs.R2, + pAd->LatchRfRegs.R3, + pAd->LatchRfRegs.R4)); + + break; +#endif // RT28xx // + default: + DBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d : unknown RFIC=%d\n", + Channel, pAd->RfIcType)); + break; + } + } + + // Change BBP setting during siwtch from a->g, g->a + if (Channel <= 14) + { + ULONG TxPinCfg = 0x00050F0A;//Gary 2007/08/09 0x050A0A + + + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd))); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd))); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd))); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0);//(0x44 - GET_LNA_GAIN(pAd))); // According the Rory's suggestion to solve the middle range issue. + //RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62); + + // Rx High power VGA offset for LNA select + if (pAd->NicConfig2.field.ExternalLNAForG) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46); + } + else + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x84); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50); + } + + // 5G band selection PIN, bit1 and bit2 are complement + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value &= (~0x6); + Value |= (0x04); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + + // Turn off unused PA or LNA when only 1T or 1R + if (pAd->Antenna.field.TxPath == 1) + { + TxPinCfg &= 0xFFFFFFF3; + } + if (pAd->Antenna.field.RxPath == 1) + { + TxPinCfg &= 0xFFFFF3FF; + } + +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT30xxWriteRFRegister(pAd, RF_R08, (UCHAR)0x00); +#endif // RT35xx // + + RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg); + +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT30xxWriteRFRegister(pAd, RF_R08, (UCHAR)0x80); +#endif // RT35xx // + } + else + { + ULONG TxPinCfg = 0x00050F05;//Gary 2007/8/9 0x050505 + + + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd))); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd))); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd))); + //snowpin - 3562 5G scan issue. RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0);//(0x44 - GET_LNA_GAIN(pAd))); // According the Rory's suggestion to solve the middle range issue. +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + // Rx High power VGA offset for LNA select + if (pAd->NicConfig2.field.ExternalLNAForA) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x94); + } + else + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x94); + } + } + else +#endif // RT35xx // + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0xF2); + } + + // Rx High power VGA offset for LNA select + if (pAd->NicConfig2.field.ExternalLNAForA) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46); + } + else + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50); + } + + // 5G band selection PIN, bit1 and bit2 are complement + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value &= (~0x6); + Value |= (0x02); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + + // Turn off unused PA or LNA when only 1T or 1R + if (pAd->Antenna.field.TxPath == 1) + { + TxPinCfg &= 0xFFFFFFF3; + } + if (pAd->Antenna.field.RxPath == 1) + { + TxPinCfg &= 0xFFFFF3FF; + } + +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT30xxWriteRFRegister(pAd, RF_R08, (UCHAR)0x00); +#endif // RT35xx // + + RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg); + +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT30xxWriteRFRegister(pAd, RF_R08, (UCHAR)0x80); +#endif // RT35xx // + } + + // R66 should be set according to Channel and use 20MHz when scanning + //RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x2E + GET_LNA_GAIN(pAd))); + if (bScan) + RTMPSetAGCInitValue(pAd, BW_20); + else + RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW); + + // + // On 11A, We should delay and wait RF/BBP to be stable + // and the appropriate time should be 1000 micro seconds + // 2005/06/05 - On 11G, We also need this delay time. Otherwise it's difficult to pass the WHQL. + // + RTMPusecDelay(1000); +} + +/* + ========================================================================== + Description: + This function is required for 2421 only, and should not be used during + site survey. It's only required after NIC decided to stay at a channel + for a longer period. + When this function is called, it's always after AsicSwitchChannel(). + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicLockChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel) +{ +} + +/* + ========================================================================== + Description: + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ + +/* + ======================================================================== + + Routine Description: + Antenna miscellaneous setting. + + Arguments: + pAd Pointer to our adapter + BandState Indicate current Band State. + + Return Value: + None + + IRQL <= DISPATCH_LEVEL + + Note: + 1.) Frame End type control + only valid for G only (RF_2527 & RF_2529) + 0: means DPDT, set BBP R4 bit 5 to 1 + 1: means SPDT, set BBP R4 bit 5 to 0 + + + ======================================================================== +*/ +VOID AsicAntennaSetting( + IN PRTMP_ADAPTER pAd, + IN ABGBAND_STATE BandState) +{ +} + +VOID AsicRfTuningExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ +} + +VOID AsicGetAutoAgcOffset( + IN PRTMP_ADAPTER pAd, + IN PCHAR pDeltaPwr, + IN PCHAR pAgcCompensate, + IN PUCHAR pBbpR49) +{ + CHAR DeltaPwr = 0; + BOOLEAN bAutoTxAgc = FALSE; + UCHAR TssiRef, *pTssiMinusBoundary, *pTssiPlusBoundary, TxAgcStep; + UCHAR BbpR49 = 0, idx; + PCHAR pTxAgcCompensate; + + // TX power compensation for temperature variation based on TSSI. try every 4 second + if (pAd->Mlme.OneSecPeriodicRound % 4 == 0) + { + if (pAd->CommonCfg.Channel <= 14) + { + /* bg channel */ + bAutoTxAgc = pAd->bAutoTxAgcG; + TssiRef = pAd->TssiRefG; + pTssiMinusBoundary = &pAd->TssiMinusBoundaryG[0]; + pTssiPlusBoundary = &pAd->TssiPlusBoundaryG[0]; + TxAgcStep = pAd->TxAgcStepG; + pTxAgcCompensate = &pAd->TxAgcCompensateG; + } + else + { + /* a channel */ + bAutoTxAgc = pAd->bAutoTxAgcA; + TssiRef = pAd->TssiRefA; + pTssiMinusBoundary = &pAd->TssiMinusBoundaryA[0]; + pTssiPlusBoundary = &pAd->TssiPlusBoundaryA[0]; + TxAgcStep = pAd->TxAgcStepA; + pTxAgcCompensate = &pAd->TxAgcCompensateA; + } + + if (bAutoTxAgc) + { + /* BbpR1 is unsigned char */ + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpR49); + /* (p) TssiPlusBoundaryG[0] = 0 = (m) TssiMinusBoundaryG[0] */ + /* compensate: +4 +3 +2 +1 0 -1 -2 -3 -4 * steps */ + /* step value is defined in pAd->TxAgcStepG for tx power value */ + + /* [4]+1+[4] p4 p3 p2 p1 o1 m1 m2 m3 m4 */ + /* ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0 + above value are examined in mass factory production */ + /* [4] [3] [2] [1] [0] [1] [2] [3] [4] */ + + /* plus (+) is 0x00 ~ 0x45, minus (-) is 0xa0 ~ 0xf0 */ + /* if value is between p1 ~ o1 or o1 ~ s1, no need to adjust tx power */ + /* if value is 0xa5, tx power will be -= TxAgcStep*(2-1) */ + + if (BbpR49 > pTssiMinusBoundary[1]) + { + // Reading is larger than the reference value + // check for how large we need to decrease the Tx power + for (idx = 1; idx < 5; idx++) + { + if (BbpR49 <= pTssiMinusBoundary[idx]) // Found the range + break; + } + // The index is the step we should decrease, idx = 0 means there is nothing to compensate +// if (R3 > (ULONG) (TxAgcStep * (idx-1))) + *pTxAgcCompensate = -(TxAgcStep * (idx-1)); +// else +// *pTxAgcCompensate = -((UCHAR)R3); + + DeltaPwr += (*pTxAgcCompensate); + DBGPRINT(RT_DEBUG_TRACE, ("-- Tx Power, BBP R49=%x, TssiRef=%x, TxAgcStep=%x, step = -%d\n", + BbpR49, TssiRef, TxAgcStep, idx-1)); + } + else if (BbpR49 < pTssiPlusBoundary[1]) + { + // Reading is smaller than the reference value + // check for how large we need to increase the Tx power + for (idx = 1; idx < 5; idx++) + { + if (BbpR49 >= pTssiPlusBoundary[idx]) // Found the range + break; + } + // The index is the step we should increase, idx = 0 means there is nothing to compensate + *pTxAgcCompensate = TxAgcStep * (idx-1); + DeltaPwr += (*pTxAgcCompensate); + DBGPRINT(RT_DEBUG_TRACE, ("++ Tx Power, BBP R49=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\n", + BbpR49, TssiRef, TxAgcStep, idx-1)); + } + else + { + *pTxAgcCompensate = 0; + DBGPRINT(RT_DEBUG_TRACE, (" Tx Power, BBP R49=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\n", + BbpR49, TssiRef, TxAgcStep, 0)); + } + } + } + else + { + if (pAd->CommonCfg.Channel <= 14) + { + bAutoTxAgc = pAd->bAutoTxAgcG; + pTxAgcCompensate = &pAd->TxAgcCompensateG; + } + else + { + bAutoTxAgc = pAd->bAutoTxAgcA; + pTxAgcCompensate = &pAd->TxAgcCompensateA; + } + + if (bAutoTxAgc) + DeltaPwr += (*pTxAgcCompensate); + } + + *pBbpR49 = BbpR49; + *pDeltaPwr = DeltaPwr; + *pAgcCompensate = *pTxAgcCompensate; +} + +VOID AsicGetTxPowerOffset( + IN PRTMP_ADAPTER pAd, + IN PULONG TxPwr) +{ + if (pAd->CommonCfg.BBPCurrentBW == BW_40) + { + if (pAd->CommonCfg.CentralChannel > 14) + { + TxPwr[0] = pAd->Tx40MPwrCfgABand[0]; + TxPwr[1] = pAd->Tx40MPwrCfgABand[1]; + TxPwr[2] = pAd->Tx40MPwrCfgABand[2]; + TxPwr[3] = pAd->Tx40MPwrCfgABand[3]; + TxPwr[4] = pAd->Tx40MPwrCfgABand[4]; + } + else + { + TxPwr[0] = pAd->Tx40MPwrCfgGBand[0]; + TxPwr[1] = pAd->Tx40MPwrCfgGBand[1]; + TxPwr[2] = pAd->Tx40MPwrCfgGBand[2]; + TxPwr[3] = pAd->Tx40MPwrCfgGBand[3]; + TxPwr[4] = pAd->Tx40MPwrCfgGBand[4]; + } + } + else + { + if (pAd->CommonCfg.Channel > 14) + { + TxPwr[0] = pAd->Tx20MPwrCfgABand[0]; + TxPwr[1] = pAd->Tx20MPwrCfgABand[1]; + TxPwr[2] = pAd->Tx20MPwrCfgABand[2]; + TxPwr[3] = pAd->Tx20MPwrCfgABand[3]; + TxPwr[4] = pAd->Tx20MPwrCfgABand[4]; + } + else + { + TxPwr[0] = pAd->Tx20MPwrCfgGBand[0]; + TxPwr[1] = pAd->Tx20MPwrCfgGBand[1]; + TxPwr[2] = pAd->Tx20MPwrCfgGBand[2]; + TxPwr[3] = pAd->Tx20MPwrCfgGBand[3]; + TxPwr[4] = pAd->Tx20MPwrCfgGBand[4]; + } + } +} + +#ifdef SINGLE_SKU +/* + ========================================================================== + Description: + Gives CCK TX rate 2 more dB TX power. + This routine works only in LINK UP in INFRASTRUCTURE mode. + + calculate desired Tx power in RF R3.Tx0~5, should consider - + 0. if current radio is a noisy environment (pAd->DrsCounters.fNoisyEnvironment) + 1. TxPowerPercentage + 2. auto calibration based on TSSI feedback + 3. extra 2 db for CCK + 4. -10 db upon very-short distance (AvgRSSI >= -40db) to AP + + NOTE: Since this routine requires the value of (pAd->DrsCounters.fNoisyEnvironment), + it should be called AFTER MlmeDynamicTxRatSwitching() + ========================================================================== + */ +VOID AsicAdjustSingleSkuTxPower( + IN PRTMP_ADAPTER pAd) +{ + INT i, j; + CHAR DeltaPwr = 0; + UCHAR BbpR1 = 0, BbpR49 = 0, BbpR1Offset = 0; + CHAR TxAgcCompensate; + ULONG TxPwr[MAX_TXPOWER_ARRAY_SIZE], TotalDeltaPwr[MAX_TXPOWER_ARRAY_SIZE]; + CHAR Value, MinValue = 127; + +#ifdef CONFIG_STA_SUPPORT + CHAR Rssi = -127; +#endif // CONFIG_STA_SUPPORT // + + +#ifdef CONFIG_STA_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) || +#ifdef RTMP_MAC_PCI + (pAd->bPCIclkOff == TRUE) || + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF) || +#endif // RTMP_MAC_PCI // + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) +{ + return; +} + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + Rssi = RTMPMaxRssi(pAd, + pAd->StaCfg.RssiSample.AvgRssi0, + pAd->StaCfg.RssiSample.AvgRssi1, + pAd->StaCfg.RssiSample.AvgRssi2); +#endif // CONFIG_STA_SUPPORT // + + NdisZeroMemory(TotalDeltaPwr, sizeof(TotalDeltaPwr)); + /* Get Tx Rate Offset Table which from eeprom 0xDEh ~ 0xEFh */ + AsicGetTxPowerOffset(pAd, &TxPwr); + /* Get temperature compensation Delta Power Value */ + AsicGetAutoAgcOffset(pAd, &DeltaPwr, &TxAgcCompensate, &BbpR49); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpR1); + BbpR1 &= 0xFC; + + // Handle regulatory max tx power constrain + do + { + UCHAR TxPwrInEEPROM = 0xFF, CountryTxPwr = 0xFF, criterion; + UCHAR AdjustMaxTxPwr[MAX_TXPOWER_ARRAY_SIZE * 8]; + + { + if (pAd->CommonCfg.Channel > 14) // 5G band + TxPwrInEEPROM = ((pAd->CommonCfg.DefineMaxTxPwr & 0xFF00) >> 8); + else // 2.4G band + TxPwrInEEPROM = (pAd->CommonCfg.DefineMaxTxPwr & 0x00FF); + } + + CountryTxPwr = GetCuntryMaxTxPwr(pAd, pAd->CommonCfg.Channel); + criterion = (TxPwr[0] >> 16) & 0xF; // FAE use OFDM 6M as criterion + + DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicAdjustSingleSkuTxPower (criterion=%d, TxPwrInEEPROM=%d, CountryTxPwr=%d)\n", criterion, TxPwrInEEPROM, CountryTxPwr)); + + // Adjust max tx power according to the relationship of tx power in E2PROM + for (i=0; i<MAX_TXPOWER_ARRAY_SIZE; i++) + { + // CCK will have 4dBm larger than OFDM + // Therefore, we should separate to parse the tx power field + if (i == 0) + { + for (j=0; j<8; j++) + { + Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F); + + if (j < 4) + { + // CCK will have 4dBm larger than OFDM + AdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion) + 4; + } + else + { + AdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion); + } + DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicAdjustSingleSkuTxPower (i/j=%d/%d, Value=%d, %d)\n", i, j, Value, AdjustMaxTxPwr[i*8+j])); + } + } + else + { + for (j=0; j<8; j++) + { + Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F); + + AdjustMaxTxPwr[i*8+j] = TxPwrInEEPROM + (Value - criterion); + DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicAdjustSingleSkuTxPower (i/j=%d/%d, Value=%d, %d)\n", i, j, Value, AdjustMaxTxPwr[i*8+j])); + } + } + } + + // Adjust tx power according to the relationship + for (i=0; i<MAX_TXPOWER_ARRAY_SIZE; i++) + { + if (TxPwr[i] != 0xffffffff) + { + for (j=0; j<8; j++) + { + Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F); + + // The system tx power is larger than the regulatory, the power should be restrain + if (AdjustMaxTxPwr[i*8+j] > CountryTxPwr) + { + Value = (AdjustMaxTxPwr[i*8+j] - CountryTxPwr); + if (Value > 0xF) + { + /* If print the Error msg. It means the output power larger than Country Regulatory over 15dBm, + * the origianl design has overflow case. + */ + DBGPRINT_RAW(RT_DEBUG_ERROR,("AsicAdjustSingleSkuTxPower: Value overflow - %d\n", Value)); + } + TotalDeltaPwr[i] = (TotalDeltaPwr[i] & ~(0x0000000F << j*4)) | (Value << j*4); + + DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicAdjustSingleSkuTxPower (i/j=%d/%d, Value=%d, %d)\n", i, j, Value, AdjustMaxTxPwr[i*8+j])); + } + else + DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicAdjustSingleSkuTxPower (i/j=%d/%d, Value=%d, %d, no change)\n", i, j, Value, AdjustMaxTxPwr[i*8+j])); + } + } + } + } while (FALSE); + + /* calculate delta power based on the percentage specified from UI */ + // E2PROM setting is calibrated for maximum TX power (i.e. 100%) + // We lower TX power here according to the percentage specified from UI + if (pAd->CommonCfg.TxPowerPercentage == 0xffffffff) // AUTO TX POWER control + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // to patch high power issue with some APs, like Belkin N1. + if (Rssi > -35) + { + DeltaPwr -= 12; + } + else if (Rssi > -40) + { + DeltaPwr -= 6; + } + else + ; + } +#endif // CONFIG_STA_SUPPORT // + } + else if (pAd->CommonCfg.TxPowerPercentage > 90) // 91 ~ 100% & AUTO, treat as 100% in terms of mW + ; + else if (pAd->CommonCfg.TxPowerPercentage > 60) // 61 ~ 90%, treat as 75% in terms of mW // DeltaPwr -= 1; + { + DeltaPwr -= 1; + } + else if (pAd->CommonCfg.TxPowerPercentage > 30) // 31 ~ 60%, treat as 50% in terms of mW // DeltaPwr -= 3; + { + DeltaPwr -= 3; + } + else if (pAd->CommonCfg.TxPowerPercentage > 15) // 16 ~ 30%, treat as 25% in terms of mW // DeltaPwr -= 6; + { + DeltaPwr -= 6; + } + else if (pAd->CommonCfg.TxPowerPercentage > 9) // 10 ~ 15%, treat as 12.5% in terms of mW // DeltaPwr -= 9; + { + DeltaPwr -= 9; + } + else // 0 ~ 9 %, treat as MIN(~3%) in terms of mW // DeltaPwr -= 12; + { + DeltaPwr -= 12; + } + + /* reset different new tx power for different TX rate */ + + /* Calcuate the minimum transmit power */ + for(i=0; i<MAX_TXPOWER_ARRAY_SIZE; i++) + { + if (TxPwr[i] != 0xffffffff) + { + for (j=0; j<8; j++) + { + /* After Single SKU, each data rate offset power value is saved in TotalDeltaPwr[]. + PwrChange will add DeltaPwr and TotalDeltaPwr[] for each data rate to calculate + the final adjust output power value which is saved in MAC Reg. and BBP_R1 */ + CHAR PwrChange; + + /* Value / TxPwr[] is get from eeprom 0xDEh ~ 0xEFh and increase or decrease the + 20/40 Bandwidth Delta Value in eeprom 0x50h. */ + Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F); /* 0 ~ 15 */ + /* Fix the corner case of Single SKU read eeprom offset 0xF0h ~ 0xFEh which for BBP Instruction configuration */ + if (Value == 0xF) + continue; + + /* Value_offset is current Pwr comapre with Country Regulation and need adjust delta value */ + PwrChange = (CHAR)((TotalDeltaPwr[i] >> j*4) & 0x0F); /* 0 ~ 15 */ + PwrChange -= DeltaPwr; + + Value -= PwrChange; + + if(MinValue > Value) + MinValue = Value; + } + } + } + + /* Depend on the minimum transmit power to adjust static Tx power control + Prevent the value of MAC_TX_PWR_CFG less than 0. */ + + if((MinValue < 0)&&(MinValue > -6)) + { + BbpR1 |= 0x01; + BbpR1Offset = 6; + } + else if (MinValue < -6) + { + BbpR1 |= 0x02; + BbpR1Offset = 12; + } + + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpR1); + + + for(i=0; i<MAX_TXPOWER_ARRAY_SIZE; i++) + { + if (TxPwr[i] != 0xffffffff) + { + for (j=0; j<8; j++) + { + /* After Single SKU, each data rate offset power value is saved in TotalDeltaPwr[]. + PwrChange will add DeltaPwr and TotalDeltaPwr[] for each data rate to calculate + the final adjust output power value which is saved in MAC Reg. and BBP_R1 */ + CHAR PwrChange; + + /* Value / TxPwr[] is get from eeprom 0xDEh ~ 0xEFh and increase or decrease the + 20/40 Bandwidth Delta Value in eeprom 0x50h. */ + Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F); /* 0 ~ 15 */ + + /* Value_offset is current Pwr comapre with Country Regulation and need adjust delta value */ + PwrChange = (CHAR)((TotalDeltaPwr[i] >> j*4) & 0x0F); /* 0 ~ 15 */ + PwrChange -= DeltaPwr; + + Value -= (PwrChange - BbpR1Offset); + + if (Value < 0) + Value = 0; /* min */ + + if (Value > 0xF) + Value = 0xF; /* max */ + + /* fill new value to CSR offset */ + TxPwr[i] = (TxPwr[i] & ~(0x0000000F << j*4)) | (Value << j*4); + } + + /* write tx power value to CSR */ + /* TX_PWR_CFG_0 (8 tx rate) for TX power for OFDM 12M/18M + TX power for OFDM 6M/9M + TX power for CCK5.5M/11M + TX power for CCK1M/2M */ + /* TX_PWR_CFG_1 ~ TX_PWR_CFG_4 */ + { + RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, TxPwr[i]); + } + } + } + + + +} +#endif // SINGLE_SKU // + +/* + ========================================================================== + Description: + Gives CCK TX rate 2 more dB TX power. + This routine works only in LINK UP in INFRASTRUCTURE mode. + + calculate desired Tx power in RF R3.Tx0~5, should consider - + 0. if current radio is a noisy environment (pAd->DrsCounters.fNoisyEnvironment) + 1. TxPowerPercentage + 2. auto calibration based on TSSI feedback + 3. extra 2 db for CCK + 4. -10 db upon very-short distance (AvgRSSI >= -40db) to AP + + NOTE: Since this routine requires the value of (pAd->DrsCounters.fNoisyEnvironment), + it should be called AFTER MlmeDynamicTxRatSwitching() + ========================================================================== + */ +VOID AsicAdjustTxPower( + IN PRTMP_ADAPTER pAd) +{ + INT i, j; + CHAR DeltaPwr = 0; + UCHAR BbpR1 = 0, BbpR49 = 0; + CHAR TxAgcCompensate; + ULONG TxPwr[MAX_TXPOWER_ARRAY_SIZE]; + CHAR Value; + +#ifdef CONFIG_STA_SUPPORT + CHAR Rssi = -127; +#endif // CONFIG_STA_SUPPORT // + + +#ifdef CONFIG_STA_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) || +#ifdef RTMP_MAC_PCI + (pAd->bPCIclkOff == TRUE) || + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF) || +#endif // RTMP_MAC_PCI // + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + return; + } + + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + Rssi = RTMPMaxRssi(pAd, + pAd->StaCfg.RssiSample.AvgRssi0, + pAd->StaCfg.RssiSample.AvgRssi1, + pAd->StaCfg.RssiSample.AvgRssi2); +#endif // CONFIG_STA_SUPPORT // + +#ifdef SINGLE_SKU + if (pAd->CommonCfg.bSKUMode == TRUE) + { + AsicAdjustSingleSkuTxPower(pAd); + return; + } +#endif // SINGLE_SKU // + + /* Get Tx Rate Offset Table which from eeprom 0xDEh ~ 0xEFh */ + AsicGetTxPowerOffset(pAd, (PULONG) &TxPwr); + /* Get temperature compensation Delta Power Value */ + AsicGetAutoAgcOffset(pAd, &DeltaPwr, &TxAgcCompensate, &BbpR49); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpR1); + BbpR1 &= 0xFC; + + /* calculate delta power based on the percentage specified from UI */ + // E2PROM setting is calibrated for maximum TX power (i.e. 100%) + // We lower TX power here according to the percentage specified from UI + if (pAd->CommonCfg.TxPowerPercentage == 0xffffffff) // AUTO TX POWER control + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // to patch high power issue with some APs, like Belkin N1. + if (Rssi > -35) + { + BbpR1 |= 0x02; // DeltaPwr -= 12; + } + else if (Rssi > -40) + { + BbpR1 |= 0x01; // DeltaPwr -= 6; + } + else + ; + } +#endif // CONFIG_STA_SUPPORT // + } + else if (pAd->CommonCfg.TxPowerPercentage > 90) // 91 ~ 100% & AUTO, treat as 100% in terms of mW + ; + else if (pAd->CommonCfg.TxPowerPercentage > 60) // 61 ~ 90%, treat as 75% in terms of mW // DeltaPwr -= 1; + { + DeltaPwr -= 1; + } + else if (pAd->CommonCfg.TxPowerPercentage > 30) // 31 ~ 60%, treat as 50% in terms of mW // DeltaPwr -= 3; + { + DeltaPwr -= 3; + } + else if (pAd->CommonCfg.TxPowerPercentage > 15) // 16 ~ 30%, treat as 25% in terms of mW // DeltaPwr -= 6; + { + BbpR1 |= 0x01; + } + else if (pAd->CommonCfg.TxPowerPercentage > 9) // 10 ~ 15%, treat as 12.5% in terms of mW // DeltaPwr -= 9; + { + BbpR1 |= 0x01; + DeltaPwr -= 3; + } + else // 0 ~ 9 %, treat as MIN(~3%) in terms of mW // DeltaPwr -= 12; + { + BbpR1 |= 0x02; + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpR1); + /* reset different new tx power for different TX rate */ + for(i=0; i<MAX_TXPOWER_ARRAY_SIZE; i++) + { + if (TxPwr[i] != 0xffffffff) + { + for (j=0; j<8; j++) + { + Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F); /* 0 ~ 15 */ + + if ((Value + DeltaPwr) < 0) + { + Value = 0; /* min */ + } + else if ((Value + DeltaPwr) > 0xF) + { + Value = 0xF; /* max */ + } + else + { + Value += DeltaPwr; /* temperature compensation */ + } + + /* fill new value to CSR offset */ + TxPwr[i] = (TxPwr[i] & ~(0x0000000F << j*4)) | (Value << j*4); + } + + /* write tx power value to CSR */ + /* TX_PWR_CFG_0 (8 tx rate) for TX power for OFDM 12M/18M + TX power for OFDM 6M/9M + TX power for CCK5.5M/11M + TX power for CCK1M/2M */ + /* TX_PWR_CFG_1 ~ TX_PWR_CFG_4 */ + { + RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, TxPwr[i]); + } + } + } + + + +} + + +#ifdef CONFIG_STA_SUPPORT +VOID AsicResetBBPAgent( +IN PRTMP_ADAPTER pAd) +{ + BBP_CSR_CFG_STRUC BbpCsr; + DBGPRINT(RT_DEBUG_ERROR, ("Reset BBP Agent busy bit.!! \n")); + // Still need to find why BBP agent keeps busy, but in fact, hardware still function ok. Now clear busy first. + RTMP_IO_READ32(pAd, H2M_BBP_AGENT, &BbpCsr.word); + BbpCsr.field.Busy = 0; + RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word); +} +/* + ========================================================================== + Description: + put PHY to sleep here, and set next wakeup timer. PHY doesn't not wakeup + automatically. Instead, MCU will issue a TwakeUpInterrupt to host after + the wakeup timer timeout. Driver has to issue a separate command to wake + PHY up. + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicSleepThenAutoWakeup( + IN PRTMP_ADAPTER pAd, + IN USHORT TbttNumToNextWakeUp) +{ + RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp); +} + +/* + ========================================================================== + Description: + AsicForceWakeup() is used whenever manual wakeup is required + AsicForceSleep() should only be used when not in INFRA BSS. When + in INFRA BSS, we should use AsicSleepThenAutoWakeup() instead. + ========================================================================== + */ +VOID AsicForceSleep( + IN PRTMP_ADAPTER pAd) +{ + +} + +/* + ========================================================================== + Description: + AsicForceWakeup() is used whenever Twakeup timer (set via AsicSleepThenAutoWakeup) + expired. + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + ========================================================================== + */ +VOID AsicForceWakeup( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bFromTx) +{ + DBGPRINT(RT_DEBUG_INFO, ("--> AsicForceWakeup \n")); + RTMP_STA_FORCE_WAKEUP(pAd, bFromTx); +} +#endif // CONFIG_STA_SUPPORT // + + +/* + ========================================================================== + Description: + Set My BSSID + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicSetBssid( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pBssid) +{ + ULONG Addr4; + DBGPRINT(RT_DEBUG_TRACE, ("==============> AsicSetBssid %x:%x:%x:%x:%x:%x\n", + pBssid[0],pBssid[1],pBssid[2],pBssid[3], pBssid[4],pBssid[5])); + + Addr4 = (ULONG)(pBssid[0]) | + (ULONG)(pBssid[1] << 8) | + (ULONG)(pBssid[2] << 16) | + (ULONG)(pBssid[3] << 24); + RTMP_IO_WRITE32(pAd, MAC_BSSID_DW0, Addr4); + + Addr4 = 0; + // always one BSSID in STA mode + Addr4 = (ULONG)(pBssid[4]) | (ULONG)(pBssid[5] << 8); + + RTMP_IO_WRITE32(pAd, MAC_BSSID_DW1, Addr4); +} + +VOID AsicSetMcastWC( + IN PRTMP_ADAPTER pAd) +{ + MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[MCAST_WCID]; + USHORT offset; + + pEntry->Sst = SST_ASSOC; + pEntry->Aid = MCAST_WCID; // Softap supports 1 BSSID and use WCID=0 as multicast Wcid index + pEntry->PsMode = PWR_ACTIVE; + pEntry->CurrTxRate = pAd->CommonCfg.MlmeRate; + offset = MAC_WCID_BASE + BSS0Mcast_WCID * HW_WCID_ENTRY_SIZE; +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicDelWcidTab( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid) +{ + ULONG Addr0 = 0x0, Addr1 = 0x0; + ULONG offset; + + DBGPRINT(RT_DEBUG_TRACE, ("AsicDelWcidTab==>Wcid = 0x%x\n",Wcid)); + offset = MAC_WCID_BASE + Wcid * HW_WCID_ENTRY_SIZE; + RTMP_IO_WRITE32(pAd, offset, Addr0); + offset += 4; + RTMP_IO_WRITE32(pAd, offset, Addr1); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicEnableRDG( + IN PRTMP_ADAPTER pAd) +{ + TX_LINK_CFG_STRUC TxLinkCfg; + UINT32 Data = 0; + + RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word); + TxLinkCfg.field.TxRDGEn = 1; + RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word); + + RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); + Data &= 0xFFFFFF00; + Data |= 0x80; + RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); + + //OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicDisableRDG( + IN PRTMP_ADAPTER pAd) +{ + TX_LINK_CFG_STRUC TxLinkCfg; + UINT32 Data = 0; + + + RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word); + TxLinkCfg.field.TxRDGEn = 0; + RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word); + + RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); + + Data &= 0xFFFFFF00; + //Data |= 0x20; +#ifndef WIFI_TEST + //if ( pAd->CommonCfg.bEnableTxBurst ) + // Data |= 0x60; // for performance issue not set the TXOP to 0 +#endif + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE) +#ifdef DOT11_N_SUPPORT + && (pAd->MacTab.fAnyStationMIMOPSDynamic == FALSE) +#endif // DOT11_N_SUPPORT // + ) + { + // For CWC test, change txop from 0x30 to 0x20 in TxBurst mode + if (pAd->CommonCfg.bEnableTxBurst) + Data |= 0x20; + } + RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); +} + +/* + ========================================================================== + Description: + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicDisableSync( + IN PRTMP_ADAPTER pAd) +{ + BCN_TIME_CFG_STRUC csr; + + DBGPRINT(RT_DEBUG_TRACE, ("--->Disable TSF synchronization\n")); + + // 2003-12-20 disable TSF and TBTT while NIC in power-saving have side effect + // that NIC will never wakes up because TSF stops and no more + // TBTT interrupts + pAd->TbttTickCount = 0; + RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word); + csr.field.bBeaconGen = 0; + csr.field.bTBTTEnable = 0; + csr.field.TsfSyncMode = 0; + csr.field.bTsfTicking = 0; + RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word); + +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicEnableBssSync( + IN PRTMP_ADAPTER pAd) +{ + BCN_TIME_CFG_STRUC csr; + + DBGPRINT(RT_DEBUG_TRACE, ("--->AsicEnableBssSync(INFRA mode)\n")); + + RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word); +// RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, 0x00000000); +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + csr.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; // ASIC register in units of 1/16 TU + csr.field.bTsfTicking = 1; + csr.field.TsfSyncMode = 1; // sync TSF in INFRASTRUCTURE mode + csr.field.bBeaconGen = 0; // do NOT generate BEACON + csr.field.bTBTTEnable = 1; + } +#endif // CONFIG_STA_SUPPORT // + RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word); +} + +/* + ========================================================================== + Description: + Note: + BEACON frame in shared memory should be built ok before this routine + can be called. Otherwise, a garbage frame maybe transmitted out every + Beacon period. + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicEnableIbssSync( + IN PRTMP_ADAPTER pAd) +{ + BCN_TIME_CFG_STRUC csr9; + PUCHAR ptr; + UINT i; + USHORT beaconLen = pAd->BeaconTxWI.MPDUtotalByteCount; +#ifdef RT_BIG_ENDIAN + TXWI_STRUC localTxWI; + NdisMoveMemory((PUCHAR)&localTxWI, (PUCHAR)&pAd->BeaconTxWI, TXWI_SIZE); + RTMPWIEndianChange((PUCHAR)&localTxWI, TYPE_TXWI); + beaconLen = localTxWI.MPDUtotalByteCount; + #endif // RT_BIG_ENDIAN // + + DBGPRINT(RT_DEBUG_TRACE, ("--->AsicEnableIbssSync(MPDUtotalByteCount=%d, beaconLen=%d)\n", pAd->BeaconTxWI.MPDUtotalByteCount, beaconLen)); + DBGPRINT(RT_DEBUG_TRACE, ("--->AsicEnableIbssSync(ADHOC mode. MPDUtotalByteCount = %d)\n", pAd->BeaconTxWI.MPDUtotalByteCount)); + + RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr9.word); + csr9.field.bBeaconGen = 0; + csr9.field.bTBTTEnable = 0; + csr9.field.bTsfTicking = 0; + RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word); + +#ifdef RTMP_MAC_PCI + // move BEACON TXD and frame content to on-chip memory + ptr = (PUCHAR)&pAd->BeaconTxWI; + for (i=0; i<TXWI_SIZE; i+=4) // 16-byte TXWI field + { + UINT32 longptr = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24); + RTMP_IO_WRITE32(pAd, HW_BEACON_BASE0 + i, longptr); + ptr += 4; + } + + // start right after the 16-byte TXWI field + ptr = pAd->BeaconBuf; + for (i=0; i< pAd->BeaconTxWI.MPDUtotalByteCount; i+=4) + { + UINT32 longptr = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24); + RTMP_IO_WRITE32(pAd, HW_BEACON_BASE0 + TXWI_SIZE + i, longptr); + ptr +=4; + } +#endif // RTMP_MAC_PCI // + + + // + // For Wi-Fi faily generated beacons between participating stations. + // Set TBTT phase adaptive adjustment step to 8us (default 16us) + // don't change settings 2006-5- by Jerry + //RTMP_IO_WRITE32(pAd, TBTT_SYNC_CFG, 0x00001010); + + // start sending BEACON + csr9.field.BeaconInterval = pAd->CommonCfg.BeaconPeriod << 4; // ASIC register in units of 1/16 TU + csr9.field.bTsfTicking = 1; + csr9.field.TsfSyncMode = 2; // sync TSF in IBSS mode + csr9.field.bTBTTEnable = 1; + csr9.field.bBeaconGen = 1; + RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr9.word); +} + +/* + ========================================================================== + Description: + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicSetEdcaParm( + IN PRTMP_ADAPTER pAd, + IN PEDCA_PARM pEdcaParm) +{ + EDCA_AC_CFG_STRUC Ac0Cfg, Ac1Cfg, Ac2Cfg, Ac3Cfg; + AC_TXOP_CSR0_STRUC csr0; + AC_TXOP_CSR1_STRUC csr1; + AIFSN_CSR_STRUC AifsnCsr; + CWMIN_CSR_STRUC CwminCsr; + CWMAX_CSR_STRUC CwmaxCsr; + int i; + + Ac0Cfg.word = 0; + Ac1Cfg.word = 0; + Ac2Cfg.word = 0; + Ac3Cfg.word = 0; + if ((pEdcaParm == NULL) || (pEdcaParm->bValid == FALSE)) + { + DBGPRINT(RT_DEBUG_TRACE,("AsicSetEdcaParm\n")); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WMM_INUSED); + for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) + { + if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) || IS_ENTRY_APCLI(&pAd->MacTab.Content[i])) + CLIENT_STATUS_CLEAR_FLAG(&pAd->MacTab.Content[i], fCLIENT_STATUS_WMM_CAPABLE); + } + + //======================================================== + // MAC Register has a copy . + //======================================================== +//#ifndef WIFI_TEST + if( pAd->CommonCfg.bEnableTxBurst ) + { + // For CWC test, change txop from 0x30 to 0x20 in TxBurst mode + Ac0Cfg.field.AcTxop = 0x20; // Suggest by John for TxBurst in HT Mode + } + else + Ac0Cfg.field.AcTxop = 0; // QID_AC_BE +//#else +// Ac0Cfg.field.AcTxop = 0; // QID_AC_BE +//#endif + Ac0Cfg.field.Cwmin = CW_MIN_IN_BITS; + Ac0Cfg.field.Cwmax = CW_MAX_IN_BITS; + Ac0Cfg.field.Aifsn = 2; + RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Ac0Cfg.word); + + Ac1Cfg.field.AcTxop = 0; // QID_AC_BK + Ac1Cfg.field.Cwmin = CW_MIN_IN_BITS; + Ac1Cfg.field.Cwmax = CW_MAX_IN_BITS; + Ac1Cfg.field.Aifsn = 2; + RTMP_IO_WRITE32(pAd, EDCA_AC1_CFG, Ac1Cfg.word); + + if (pAd->CommonCfg.PhyMode == PHY_11B) + { + Ac2Cfg.field.AcTxop = 192; // AC_VI: 192*32us ~= 6ms + Ac3Cfg.field.AcTxop = 96; // AC_VO: 96*32us ~= 3ms + } + else + { + Ac2Cfg.field.AcTxop = 96; // AC_VI: 96*32us ~= 3ms + Ac3Cfg.field.AcTxop = 48; // AC_VO: 48*32us ~= 1.5ms + } + Ac2Cfg.field.Cwmin = CW_MIN_IN_BITS; + Ac2Cfg.field.Cwmax = CW_MAX_IN_BITS; + Ac2Cfg.field.Aifsn = 2; + RTMP_IO_WRITE32(pAd, EDCA_AC2_CFG, Ac2Cfg.word); + Ac3Cfg.field.Cwmin = CW_MIN_IN_BITS; + Ac3Cfg.field.Cwmax = CW_MAX_IN_BITS; + Ac3Cfg.field.Aifsn = 2; + RTMP_IO_WRITE32(pAd, EDCA_AC3_CFG, Ac3Cfg.word); + + //======================================================== + // DMA Register has a copy too. + //======================================================== + csr0.field.Ac0Txop = 0; // QID_AC_BE + csr0.field.Ac1Txop = 0; // QID_AC_BK + RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word); + if (pAd->CommonCfg.PhyMode == PHY_11B) + { + csr1.field.Ac2Txop = 192; // AC_VI: 192*32us ~= 6ms + csr1.field.Ac3Txop = 96; // AC_VO: 96*32us ~= 3ms + } + else + { + csr1.field.Ac2Txop = 96; // AC_VI: 96*32us ~= 3ms + csr1.field.Ac3Txop = 48; // AC_VO: 48*32us ~= 1.5ms + } + RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr1.word); + + CwminCsr.word = 0; + CwminCsr.field.Cwmin0 = CW_MIN_IN_BITS; + CwminCsr.field.Cwmin1 = CW_MIN_IN_BITS; + CwminCsr.field.Cwmin2 = CW_MIN_IN_BITS; + CwminCsr.field.Cwmin3 = CW_MIN_IN_BITS; + RTMP_IO_WRITE32(pAd, WMM_CWMIN_CFG, CwminCsr.word); + + CwmaxCsr.word = 0; + CwmaxCsr.field.Cwmax0 = CW_MAX_IN_BITS; + CwmaxCsr.field.Cwmax1 = CW_MAX_IN_BITS; + CwmaxCsr.field.Cwmax2 = CW_MAX_IN_BITS; + CwmaxCsr.field.Cwmax3 = CW_MAX_IN_BITS; + RTMP_IO_WRITE32(pAd, WMM_CWMAX_CFG, CwmaxCsr.word); + + RTMP_IO_WRITE32(pAd, WMM_AIFSN_CFG, 0x00002222); + + NdisZeroMemory(&pAd->CommonCfg.APEdcaParm, sizeof(EDCA_PARM)); + + } + else + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_WMM_INUSED); + //======================================================== + // MAC Register has a copy. + //======================================================== + // + // Modify Cwmin/Cwmax/Txop on queue[QID_AC_VI], Recommend by Jerry 2005/07/27 + // To degrade our VIDO Queue's throughput for WiFi WMM S3T07 Issue. + // + //pEdcaParm->Txop[QID_AC_VI] = pEdcaParm->Txop[QID_AC_VI] * 7 / 10; // rt2860c need this + + Ac0Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_BE]; + Ac0Cfg.field.Cwmin= pEdcaParm->Cwmin[QID_AC_BE]; + Ac0Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_BE]; + Ac0Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BE]; //+1; + + Ac1Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_BK]; + Ac1Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_BK]; //+2; + Ac1Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_BK]; + Ac1Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BK]; //+1; + + + Ac2Cfg.field.AcTxop = (pEdcaParm->Txop[QID_AC_VI] * 6) / 10; + if(pAd->Antenna.field.TxPath == 1) + { + Ac2Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_VI] + 1; + Ac2Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_VI] + 1; + } + else + { + Ac2Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_VI]; + Ac2Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_VI]; + } + Ac2Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_VI] + 1; + +#ifdef INF_AMAZON_SE +#endif // INF_AMAZON_SE // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Tuning for Wi-Fi WMM S06 + if (pAd->CommonCfg.bWiFiTest && + pEdcaParm->Aifsn[QID_AC_VI] == 10) + Ac2Cfg.field.Aifsn -= 1; + + // Tuning for TGn Wi-Fi 5.2.32 + // STA TestBed changes in this item: conexant legacy sta ==> broadcom 11n sta + if (STA_TGN_WIFI_ON(pAd) && + pEdcaParm->Aifsn[QID_AC_VI] == 10) + { + Ac0Cfg.field.Aifsn = 3; + Ac2Cfg.field.AcTxop = 5; + } + +#ifdef RT30xx + if (pAd->RfIcType == RFIC_3020 || pAd->RfIcType == RFIC_2020) + { + // Tuning for WiFi WMM S3-T07: connexant legacy sta ==> broadcom 11n sta. + Ac2Cfg.field.Aifsn = 5; + } +#endif // RT30xx // + } +#endif // CONFIG_STA_SUPPORT // + + Ac3Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_VO]; + Ac3Cfg.field.Cwmin = pEdcaParm->Cwmin[QID_AC_VO]; + Ac3Cfg.field.Cwmax = pEdcaParm->Cwmax[QID_AC_VO]; + Ac3Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_VO]; + +//#ifdef WIFI_TEST + if (pAd->CommonCfg.bWiFiTest) + { + if (Ac3Cfg.field.AcTxop == 102) + { + Ac0Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_BE] ? pEdcaParm->Txop[QID_AC_BE] : 10; + Ac0Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BE]-1; /* AIFSN must >= 1 */ + Ac1Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_BK]; + Ac1Cfg.field.Aifsn = pEdcaParm->Aifsn[QID_AC_BK]; + Ac2Cfg.field.AcTxop = pEdcaParm->Txop[QID_AC_VI]; + } /* End of if */ + } +//#endif // WIFI_TEST // + + RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Ac0Cfg.word); + RTMP_IO_WRITE32(pAd, EDCA_AC1_CFG, Ac1Cfg.word); + RTMP_IO_WRITE32(pAd, EDCA_AC2_CFG, Ac2Cfg.word); + RTMP_IO_WRITE32(pAd, EDCA_AC3_CFG, Ac3Cfg.word); + + + //======================================================== + // DMA Register has a copy too. + //======================================================== + csr0.field.Ac0Txop = Ac0Cfg.field.AcTxop; + csr0.field.Ac1Txop = Ac1Cfg.field.AcTxop; + RTMP_IO_WRITE32(pAd, WMM_TXOP0_CFG, csr0.word); + + csr1.field.Ac2Txop = Ac2Cfg.field.AcTxop; + csr1.field.Ac3Txop = Ac3Cfg.field.AcTxop; + RTMP_IO_WRITE32(pAd, WMM_TXOP1_CFG, csr1.word); + + CwminCsr.word = 0; + CwminCsr.field.Cwmin0 = pEdcaParm->Cwmin[QID_AC_BE]; + CwminCsr.field.Cwmin1 = pEdcaParm->Cwmin[QID_AC_BK]; + CwminCsr.field.Cwmin2 = pEdcaParm->Cwmin[QID_AC_VI]; +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + CwminCsr.field.Cwmin3 = pEdcaParm->Cwmin[QID_AC_VO] - 1; //for TGn wifi test +#endif // CONFIG_STA_SUPPORT // + RTMP_IO_WRITE32(pAd, WMM_CWMIN_CFG, CwminCsr.word); + + CwmaxCsr.word = 0; + CwmaxCsr.field.Cwmax0 = pEdcaParm->Cwmax[QID_AC_BE]; + CwmaxCsr.field.Cwmax1 = pEdcaParm->Cwmax[QID_AC_BK]; + CwmaxCsr.field.Cwmax2 = pEdcaParm->Cwmax[QID_AC_VI]; + CwmaxCsr.field.Cwmax3 = pEdcaParm->Cwmax[QID_AC_VO]; + RTMP_IO_WRITE32(pAd, WMM_CWMAX_CFG, CwmaxCsr.word); + + AifsnCsr.word = 0; + AifsnCsr.field.Aifsn0 = Ac0Cfg.field.Aifsn; //pEdcaParm->Aifsn[QID_AC_BE]; + AifsnCsr.field.Aifsn1 = Ac1Cfg.field.Aifsn; //pEdcaParm->Aifsn[QID_AC_BK]; + AifsnCsr.field.Aifsn2 = Ac2Cfg.field.Aifsn; //pEdcaParm->Aifsn[QID_AC_VI]; +#ifdef INF_AMAZON_SE +#endif // INF_AMAZON_SE // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Tuning for Wi-Fi WMM S06 + if (pAd->CommonCfg.bWiFiTest && + pEdcaParm->Aifsn[QID_AC_VI] == 10) + AifsnCsr.field.Aifsn2 = Ac2Cfg.field.Aifsn - 4; + + // Tuning for TGn Wi-Fi 5.2.32 + // STA TestBed changes in this item: connexant legacy sta ==> broadcom 11n sta + if (STA_TGN_WIFI_ON(pAd) && + pEdcaParm->Aifsn[QID_AC_VI] == 10) + { + AifsnCsr.field.Aifsn0 = 3; + AifsnCsr.field.Aifsn2 = 7; + } + + if (INFRA_ON(pAd)) + CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[BSSID_WCID], fCLIENT_STATUS_WMM_CAPABLE); + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + AifsnCsr.field.Aifsn3 = Ac3Cfg.field.Aifsn - 1; //pEdcaParm->Aifsn[QID_AC_VO]; //for TGn wifi test +#ifdef RT30xx + // TODO: Shiang, this modification also suitable for RT3052/RT3050 ??? + if (pAd->RfIcType == RFIC_3020 || pAd->RfIcType == RFIC_2020) + { + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + AifsnCsr.field.Aifsn2 = 0x2; //pEdcaParm->Aifsn[QID_AC_VI]; //for WiFi WMM S4-T04. + } +#endif // RT30xx // + } +#endif // CONFIG_STA_SUPPORT // + RTMP_IO_WRITE32(pAd, WMM_AIFSN_CFG, AifsnCsr.word); + + NdisMoveMemory(&pAd->CommonCfg.APEdcaParm, pEdcaParm, sizeof(EDCA_PARM)); + if (!ADHOC_ON(pAd)) + { + DBGPRINT(RT_DEBUG_TRACE,("EDCA [#%d]: AIFSN CWmin CWmax TXOP(us) ACM\n", pEdcaParm->EdcaUpdateCount)); + DBGPRINT(RT_DEBUG_TRACE,(" AC_BE %2d %2d %2d %4d %d\n", + pEdcaParm->Aifsn[0], + pEdcaParm->Cwmin[0], + pEdcaParm->Cwmax[0], + pEdcaParm->Txop[0]<<5, + pEdcaParm->bACM[0])); + DBGPRINT(RT_DEBUG_TRACE,(" AC_BK %2d %2d %2d %4d %d\n", + pEdcaParm->Aifsn[1], + pEdcaParm->Cwmin[1], + pEdcaParm->Cwmax[1], + pEdcaParm->Txop[1]<<5, + pEdcaParm->bACM[1])); + DBGPRINT(RT_DEBUG_TRACE,(" AC_VI %2d %2d %2d %4d %d\n", + pEdcaParm->Aifsn[2], + pEdcaParm->Cwmin[2], + pEdcaParm->Cwmax[2], + pEdcaParm->Txop[2]<<5, + pEdcaParm->bACM[2])); + DBGPRINT(RT_DEBUG_TRACE,(" AC_VO %2d %2d %2d %4d %d\n", + pEdcaParm->Aifsn[3], + pEdcaParm->Cwmin[3], + pEdcaParm->Cwmax[3], + pEdcaParm->Txop[3]<<5, + pEdcaParm->bACM[3])); + } + + } +} + +/* + ========================================================================== + Description: + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicSetSlotTime( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bUseShortSlotTime) +{ + ULONG SlotTime; + UINT32 RegValue = 0; + +#ifdef CONFIG_STA_SUPPORT + if (pAd->CommonCfg.Channel > 14) + bUseShortSlotTime = TRUE; +#endif // CONFIG_STA_SUPPORT // + + if (bUseShortSlotTime && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED)) + return; + else if ((!bUseShortSlotTime) && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED))) + return; + + if (bUseShortSlotTime) + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED); + else + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED); + + SlotTime = (bUseShortSlotTime)? 9 : 20; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // force using short SLOT time for FAE to demo performance when TxBurst is ON + if (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))) +#ifdef DOT11_N_SUPPORT + || ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)) +#endif // DOT11_N_SUPPORT // + ) + { + // In this case, we will think it is doing Wi-Fi test + // And we will not set to short slot when bEnableTxBurst is TRUE. + } + else if (pAd->CommonCfg.bEnableTxBurst) + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED); + SlotTime = 9; + } + } +#endif // CONFIG_STA_SUPPORT // + + // + // For some reasons, always set it to short slot time. + // + // ToDo: Should consider capability with 11B + // +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (pAd->StaCfg.BssType == BSS_ADHOC) + { + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED); + SlotTime = 20; + } + } +#endif // CONFIG_STA_SUPPORT // + + RTMP_IO_READ32(pAd, BKOFF_SLOT_CFG, &RegValue); + RegValue = RegValue & 0xFFFFFF00; + + RegValue |= SlotTime; + + RTMP_IO_WRITE32(pAd, BKOFF_SLOT_CFG, RegValue); +} + +/* + ======================================================================== + Description: + Add Shared key information into ASIC. + Update shared key, TxMic and RxMic to Asic Shared key table + Update its cipherAlg to Asic Shared key Mode. + + Return: + ======================================================================== +*/ +VOID AsicAddSharedKeyEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIndex, + IN UCHAR KeyIdx, + IN PCIPHER_KEY pCipherKey) +{ + ULONG offset; //, csr0; + SHAREDKEY_MODE_STRUC csr1; +#ifdef RTMP_MAC_PCI + INT i; +#endif // RTMP_MAC_PCI // + + PUCHAR pKey = pCipherKey->Key; + PUCHAR pTxMic = pCipherKey->TxMic; + PUCHAR pRxMic = pCipherKey->RxMic; + UCHAR CipherAlg = pCipherKey->CipherAlg; + + DBGPRINT(RT_DEBUG_TRACE, ("AsicAddSharedKeyEntry BssIndex=%d, KeyIdx=%d\n", BssIndex,KeyIdx)); +//============================================================================================ + + DBGPRINT(RT_DEBUG_TRACE,("AsicAddSharedKeyEntry: %s key #%d\n", CipherName[CipherAlg], BssIndex*4 + KeyIdx)); + DBGPRINT_RAW(RT_DEBUG_TRACE, (" Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + pKey[0],pKey[1],pKey[2],pKey[3],pKey[4],pKey[5],pKey[6],pKey[7],pKey[8],pKey[9],pKey[10],pKey[11],pKey[12],pKey[13],pKey[14],pKey[15])); + if (pRxMic) + { + DBGPRINT_RAW(RT_DEBUG_TRACE, (" Rx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + pRxMic[0],pRxMic[1],pRxMic[2],pRxMic[3],pRxMic[4],pRxMic[5],pRxMic[6],pRxMic[7])); + } + if (pTxMic) + { + DBGPRINT_RAW(RT_DEBUG_TRACE, (" Tx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + pTxMic[0],pTxMic[1],pTxMic[2],pTxMic[3],pTxMic[4],pTxMic[5],pTxMic[6],pTxMic[7])); + } +//============================================================================================ + // + // fill key material - key + TX MIC + RX MIC + // +#ifdef RTMP_MAC_PCI + offset = SHARED_KEY_TABLE_BASE + (4*BssIndex + KeyIdx)*HW_KEY_ENTRY_SIZE; + for (i=0; i<MAX_LEN_OF_SHARE_KEY; i++) + { + RTMP_IO_WRITE8(pAd, offset + i, pKey[i]); + } + + offset += MAX_LEN_OF_SHARE_KEY; + if (pTxMic) + { + for (i=0; i<8; i++) + { + RTMP_IO_WRITE8(pAd, offset + i, pTxMic[i]); + } + } + + offset += 8; + if (pRxMic) + { + for (i=0; i<8; i++) + { + RTMP_IO_WRITE8(pAd, offset + i, pRxMic[i]); + } + } +#endif // RTMP_MAC_PCI // + + + // + // Update cipher algorithm. WSTA always use BSS0 + // + RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE+4*(BssIndex/2), &csr1.word); + DBGPRINT(RT_DEBUG_TRACE,("Read: SHARED_KEY_MODE_BASE at this Bss[%d] KeyIdx[%d]= 0x%x \n", BssIndex,KeyIdx, csr1.word)); + if ((BssIndex%2) == 0) + { + if (KeyIdx == 0) + csr1.field.Bss0Key0CipherAlg = CipherAlg; + else if (KeyIdx == 1) + csr1.field.Bss0Key1CipherAlg = CipherAlg; + else if (KeyIdx == 2) + csr1.field.Bss0Key2CipherAlg = CipherAlg; + else + csr1.field.Bss0Key3CipherAlg = CipherAlg; + } + else + { + if (KeyIdx == 0) + csr1.field.Bss1Key0CipherAlg = CipherAlg; + else if (KeyIdx == 1) + csr1.field.Bss1Key1CipherAlg = CipherAlg; + else if (KeyIdx == 2) + csr1.field.Bss1Key2CipherAlg = CipherAlg; + else + csr1.field.Bss1Key3CipherAlg = CipherAlg; + } + DBGPRINT(RT_DEBUG_TRACE,("Write: SHARED_KEY_MODE_BASE at this Bss[%d] = 0x%x \n", BssIndex, csr1.word)); + RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE+4*(BssIndex/2), csr1.word); + +} + +// IRQL = DISPATCH_LEVEL +VOID AsicRemoveSharedKeyEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIndex, + IN UCHAR KeyIdx) +{ + //ULONG SecCsr0; + SHAREDKEY_MODE_STRUC csr1; + + DBGPRINT(RT_DEBUG_TRACE,("AsicRemoveSharedKeyEntry: #%d \n", BssIndex*4 + KeyIdx)); + + RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE+4*(BssIndex/2), &csr1.word); + if ((BssIndex%2) == 0) + { + if (KeyIdx == 0) + csr1.field.Bss0Key0CipherAlg = 0; + else if (KeyIdx == 1) + csr1.field.Bss0Key1CipherAlg = 0; + else if (KeyIdx == 2) + csr1.field.Bss0Key2CipherAlg = 0; + else + csr1.field.Bss0Key3CipherAlg = 0; + } + else + { + if (KeyIdx == 0) + csr1.field.Bss1Key0CipherAlg = 0; + else if (KeyIdx == 1) + csr1.field.Bss1Key1CipherAlg = 0; + else if (KeyIdx == 2) + csr1.field.Bss1Key2CipherAlg = 0; + else + csr1.field.Bss1Key3CipherAlg = 0; + } + DBGPRINT(RT_DEBUG_TRACE,("Write: SHARED_KEY_MODE_BASE at this Bss[%d] = 0x%x \n", BssIndex, csr1.word)); + RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE+4*(BssIndex/2), csr1.word); + ASSERT(BssIndex < 4); + ASSERT(KeyIdx < 4); + +} + + + +VOID AsicUpdateWCIDIVEIV( + IN PRTMP_ADAPTER pAd, + IN USHORT WCID, + IN ULONG uIV, + IN ULONG uEIV) +{ + ULONG offset; + + offset = MAC_IVEIV_TABLE_BASE + (WCID * HW_IVEIV_ENTRY_SIZE); + + RTMP_IO_WRITE32(pAd, offset, uIV); + RTMP_IO_WRITE32(pAd, offset + 4, uEIV); + + DBGPRINT(RT_DEBUG_TRACE, ("%s: wcid(%d) 0x%08lx, 0x%08lx \n", + __FUNCTION__, WCID, uIV, uEIV)); +} + +VOID AsicUpdateRxWCIDTable( + IN PRTMP_ADAPTER pAd, + IN USHORT WCID, + IN PUCHAR pAddr) +{ + ULONG offset; + ULONG Addr; + + offset = MAC_WCID_BASE + (WCID * HW_WCID_ENTRY_SIZE); + Addr = pAddr[0] + (pAddr[1] << 8) +(pAddr[2] << 16) +(pAddr[3] << 24); + RTMP_IO_WRITE32(pAd, offset, Addr); + Addr = pAddr[4] + (pAddr[5] << 8); + RTMP_IO_WRITE32(pAd, offset + 4, Addr); +} + +/* + ======================================================================== + Description: + Add Client security information into ASIC WCID table and IVEIV table. + Return: + + Note : + The key table selection rule : + 1. Wds-links and Mesh-links always use Pair-wise key table. + 2. When the CipherAlg is TKIP, AES, SMS4 or the dynamic WEP is enabled, + it needs to set key into Pair-wise Key Table. + 3. The pair-wise key security mode is set NONE, it means as no security. + 4. In STA Adhoc mode, it always use shared key table. + 5. Otherwise, use shared key table + + ======================================================================== +*/ +VOID AsicUpdateWcidAttributeEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIdx, + IN UCHAR KeyIdx, + IN UCHAR CipherAlg, + IN UINT8 Wcid, + IN UINT8 KeyTabFlag) +{ + WCID_ATTRIBUTE_STRUC WCIDAttri; + USHORT offset; + + /* Initialize the content of WCID Attribue */ + WCIDAttri.word = 0; + + /* The limitation of HW WCID table */ + if (/*Wcid < 1 ||*/ Wcid > 254) + { + DBGPRINT(RT_DEBUG_WARN, ("%s: Wcid is invalid (%d). \n", + __FUNCTION__, Wcid)); + return; + } + + /* Update the pairwise key security mode. + Use bit10 and bit3~1 to indicate the pairwise cipher mode */ + WCIDAttri.field.PairKeyModeExt = ((CipherAlg & 0x08) >> 3); + WCIDAttri.field.PairKeyMode = (CipherAlg & 0x07); + + /* Update the MBSS index. + Use bit11 and bit6~4 to indicate the BSS index */ + WCIDAttri.field.BSSIdxExt = ((BssIdx & 0x08) >> 3); + WCIDAttri.field.BSSIdx = (BssIdx & 0x07); + + + /* Assign Key Table selection */ + WCIDAttri.field.KeyTab = KeyTabFlag; + + /* Update related information to ASIC */ + offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE); + RTMP_IO_WRITE32(pAd, offset, WCIDAttri.word); + + DBGPRINT(RT_DEBUG_TRACE, ("%s : WCID #%d, KeyIndex #%d, Alg=%s\n", __FUNCTION__, Wcid, KeyIdx, CipherName[CipherAlg])); + DBGPRINT(RT_DEBUG_TRACE, (" WCIDAttri = 0x%x \n", WCIDAttri.word)); + +} + + +/* + ======================================================================== + Description: + Add Pair-wise key material into ASIC. + Update pairwise key, TxMic and RxMic to Asic Pair-wise key table + + Return: + ======================================================================== +*/ +VOID AsicAddPairwiseKeyEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR WCID, + IN PCIPHER_KEY pCipherKey) +{ + INT i; + ULONG offset; + PUCHAR pKey = pCipherKey->Key; + PUCHAR pTxMic = pCipherKey->TxMic; + PUCHAR pRxMic = pCipherKey->RxMic; + UCHAR CipherAlg = pCipherKey->CipherAlg; + + // EKEY + offset = PAIRWISE_KEY_TABLE_BASE + (WCID * HW_KEY_ENTRY_SIZE); +#ifdef RTMP_MAC_PCI + for (i=0; i<MAX_LEN_OF_PEER_KEY; i++) + { + RTMP_IO_WRITE8(pAd, offset + i, pKey[i]); + } +#endif // RTMP_MAC_PCI // + for (i=0; i<MAX_LEN_OF_PEER_KEY; i+=4) + { + UINT32 Value; + RTMP_IO_READ32(pAd, offset + i, &Value); + } + + offset += MAX_LEN_OF_PEER_KEY; + + // MIC KEY + if (pTxMic) + { +#ifdef RTMP_MAC_PCI + for (i=0; i<8; i++) + { + RTMP_IO_WRITE8(pAd, offset+i, pTxMic[i]); + } +#endif // RTMP_MAC_PCI // + } + offset += 8; + if (pRxMic) + { +#ifdef RTMP_MAC_PCI + for (i=0; i<8; i++) + { + RTMP_IO_WRITE8(pAd, offset+i, pRxMic[i]); + } +#endif // RTMP_MAC_PCI // + } + + DBGPRINT(RT_DEBUG_TRACE,("AsicAddPairwiseKeyEntry: WCID #%d Alg=%s\n",WCID, CipherName[CipherAlg])); + DBGPRINT(RT_DEBUG_TRACE,(" Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + pKey[0],pKey[1],pKey[2],pKey[3],pKey[4],pKey[5],pKey[6],pKey[7],pKey[8],pKey[9],pKey[10],pKey[11],pKey[12],pKey[13],pKey[14],pKey[15])); + if (pRxMic) + { + DBGPRINT(RT_DEBUG_TRACE, (" Rx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + pRxMic[0],pRxMic[1],pRxMic[2],pRxMic[3],pRxMic[4],pRxMic[5],pRxMic[6],pRxMic[7])); + } + if (pTxMic) + { + DBGPRINT(RT_DEBUG_TRACE, (" Tx MIC Key = %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + pTxMic[0],pTxMic[1],pTxMic[2],pTxMic[3],pTxMic[4],pTxMic[5],pTxMic[6],pTxMic[7])); + } +} +/* + ======================================================================== + Description: + Remove Pair-wise key material from ASIC. + + Return: + ======================================================================== +*/ +VOID AsicRemovePairwiseKeyEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid) +{ + /* Set the specific WCID attribute entry as OPEN-NONE */ + AsicUpdateWcidAttributeEntry(pAd, + BSS0, + 0, + CIPHER_NONE, + Wcid, + PAIRWISEKEYTABLE); + + DBGPRINT(RT_DEBUG_TRACE, ("%s : Wcid #%d \n", __FUNCTION__, Wcid)); +} + +BOOLEAN AsicSendCommandToMcu( + IN PRTMP_ADAPTER pAd, + IN UCHAR Command, + IN UCHAR Token, + IN UCHAR Arg0, + IN UCHAR Arg1) +{ + if (pAd->chipOps.sendCommandToMcu) + return pAd->chipOps.sendCommandToMcu(pAd, Command, Token, Arg0, Arg1); + else + return FALSE; +} + + +VOID AsicSetRxAnt( + IN PRTMP_ADAPTER pAd, + IN UCHAR Ant) +{ +#ifdef RT30xx + /* RT3572 ATE need not to do this. */ + RT30xxSetRxAnt(pAd, Ant); +#endif // RT30xx // +} + + +VOID AsicTurnOffRFClk( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel) +{ + if (pAd->chipOps.AsicRfTurnOff) + { + pAd->chipOps.AsicRfTurnOff(pAd); + } + else + { +#ifdef RT28xx + // RF R2 bit 18 = 0 + UINT32 R1 = 0, R2 = 0, R3 = 0; + UCHAR index; + RTMP_RF_REGS *RFRegTable; + + RFRegTable = RF2850RegTable; +#endif // RT28xx // + + switch (pAd->RfIcType) + { +#ifdef RT28xx + case RFIC_2820: + case RFIC_2850: + case RFIC_2720: + case RFIC_2750: + for (index = 0; index < NUM_OF_2850_CHNL; index++) + { + if (Channel == RFRegTable[index].Channel) + { + R1 = RFRegTable[index].R1 & 0xffffdfff; + R2 = RFRegTable[index].R2 & 0xfffbffff; + R3 = RFRegTable[index].R3 & 0xfff3ffff; + + RTMP_RF_IO_WRITE32(pAd, R1); + RTMP_RF_IO_WRITE32(pAd, R2); + + // Program R1b13 to 1, R3/b18,19 to 0, R2b18 to 0. + // Set RF R2 bit18=0, R3 bit[18:19]=0 + //if (pAd->StaCfg.bRadio == FALSE) + if (1) + { + RTMP_RF_IO_WRITE32(pAd, R3); + + DBGPRINT(RT_DEBUG_TRACE, ("AsicTurnOffRFClk#%d(RF=%d, ) , R2=0x%08x, R3 = 0x%08x \n", + Channel, pAd->RfIcType, R2, R3)); + } + else + DBGPRINT(RT_DEBUG_TRACE, ("AsicTurnOffRFClk#%d(RF=%d, ) , R2=0x%08x \n", + Channel, pAd->RfIcType, R2)); + break; + } + } + + break; +#endif // RT28xx // + default: + DBGPRINT(RT_DEBUG_TRACE, ("AsicTurnOffRFClk#%d : Unkonwn RFIC=%d\n", + Channel, pAd->RfIcType)); + break; + } + } +} + + +VOID AsicTurnOnRFClk( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel) +{ +#ifdef RT28xx + // RF R2 bit 18 = 0 + UINT32 R1 = 0, R2 = 0, R3 = 0; + UCHAR index; + RTMP_RF_REGS *RFRegTable; + + RFRegTable = RF2850RegTable; +#endif // RT28xx // + +#ifdef RT30xx + // The RF programming sequence is difference between 3xxx and 2xxx + if (IS_RT3090(pAd) || IS_RT3572(pAd)) + { + return; + } +#endif // RT30xx // + + switch (pAd->RfIcType) + { +#ifdef RT28xx + case RFIC_2820: + case RFIC_2850: + case RFIC_2720: + case RFIC_2750: + for (index = 0; index < NUM_OF_2850_CHNL; index++) + { + if (Channel == RFRegTable[index].Channel) + { + R3 = pAd->LatchRfRegs.R3; + R3 &= 0xfff3ffff; + R3 |= 0x00080000; + RTMP_RF_IO_WRITE32(pAd, R3); + + R1 = RFRegTable[index].R1; + RTMP_RF_IO_WRITE32(pAd, R1); + + R2 = RFRegTable[index].R2; + if (pAd->Antenna.field.TxPath == 1) + { + R2 |= 0x4000; // If TXpath is 1, bit 14 = 1; + } + + if (pAd->Antenna.field.RxPath == 2) + { + R2 |= 0x40; // write 1 to off Rxpath. + } + else if (pAd->Antenna.field.RxPath == 1) + { + R2 |= 0x20040; // write 1 to off RxPath + } + RTMP_RF_IO_WRITE32(pAd, R2); + + break; + } + } + + DBGPRINT(RT_DEBUG_TRACE, ("AsicTurnOnRFClk#%d(RF=%d), R2=0x%08x\n", + Channel, + pAd->RfIcType, + R2)); + + break; +#endif // RT28xx // + default: + DBGPRINT(RT_DEBUG_TRACE, ("AsicTurnOnRFClk#%d : Unknown RFIC=%d\n", + Channel, + pAd->RfIcType)); + break; + } + +} + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_cfg.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_cfg.c new file mode 100644 index 000000000..c8a479a2d --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_cfg.c @@ -0,0 +1,434 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_cfg.c + + Abstract: + Ralink WiFi Driver configuration related subroutines + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- +*/ + + + +#include "rt_config.h" + + + +INT ComputeChecksum( + IN UINT PIN) +{ + INT digit_s; + UINT accum = 0; + + PIN *= 10; + accum += 3 * ((PIN / 10000000) % 10); + accum += 1 * ((PIN / 1000000) % 10); + accum += 3 * ((PIN / 100000) % 10); + accum += 1 * ((PIN / 10000) % 10); + accum += 3 * ((PIN / 1000) % 10); + accum += 1 * ((PIN / 100) % 10); + accum += 3 * ((PIN / 10) % 10); + + digit_s = (accum % 10); + return ((10 - digit_s) % 10); +} // ComputeChecksum + + +UINT GenerateWpsPinCode( + IN PRTMP_ADAPTER pAd, + IN UCHAR apidx) +{ + UCHAR macAddr[MAC_ADDR_LEN]; + UINT iPin; + UINT checksum; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + NdisMoveMemory(&macAddr[0], pAd->CurrentAddress, MAC_ADDR_LEN); +#endif // CONFIG_STA_SUPPORT // + + iPin = macAddr[3] * 256 * 256 + macAddr[4] * 256 + macAddr[5]; + + iPin = iPin % 10000000; + checksum = ComputeChecksum( iPin ); + iPin = iPin*10 + checksum; + + return iPin; +} + +char* GetPhyMode( + int Mode) +{ + switch(Mode) + { + case MODE_CCK: + return "CCK"; + + case MODE_OFDM: + return "OFDM"; +#ifdef DOT11_N_SUPPORT + case MODE_HTMIX: + return "HTMIX"; + + case MODE_HTGREENFIELD: + return "GREEN"; +#endif // DOT11_N_SUPPORT // + default: + return "N/A"; + } +} + + +char* GetBW( + int BW) +{ + switch(BW) + { + case BW_10: + return "10M"; + + case BW_20: + return "20M"; +#ifdef DOT11_N_SUPPORT + case BW_40: + return "40M"; +#endif // DOT11_N_SUPPORT // + default: + return "N/A"; + } +} + + +/* + ========================================================================== + Description: + Set Country Region to pAd->CommonCfg.CountryRegion. + This command will not work, if the field of CountryRegion in eeprom is programmed. + + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT RT_CfgSetCountryRegion( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg, + IN INT band) +{ + LONG region; + UCHAR *pCountryRegion; + + region = simple_strtol(arg, 0, 10); + + if (band == BAND_24G) + pCountryRegion = &pAd->CommonCfg.CountryRegion; + else + pCountryRegion = &pAd->CommonCfg.CountryRegionForABand; + + // TODO: Is it neccesay for following check??? + // Country can be set only when EEPROM not programmed + if (*pCountryRegion & 0x80) + { + DBGPRINT(RT_DEBUG_ERROR, ("CfgSetCountryRegion():CountryRegion in eeprom was programmed\n")); + return FALSE; + } + + if((region >= 0) && + (((band == BAND_24G) && ((region <= REGION_MAXIMUM_BG_BAND) || (region == REGION_31_BG_BAND))) || + ((band == BAND_5G) && (region <= REGION_MAXIMUM_A_BAND) )) + ) + { + *pCountryRegion= (UCHAR) region; + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("CfgSetCountryRegion():region(%ld) out of range!\n", region)); + return FALSE; + } + + return TRUE; + +} + + +/* + ========================================================================== + Description: + Set Wireless Mode + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT RT_CfgSetWirelessMode( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + INT MaxPhyMode = PHY_11G; + LONG WirelessMode; + +#ifdef DOT11_N_SUPPORT + MaxPhyMode = PHY_11N_5G; +#endif // DOT11_N_SUPPORT // + + WirelessMode = simple_strtol(arg, 0, 10); + if (WirelessMode <= MaxPhyMode) + { + pAd->CommonCfg.PhyMode = WirelessMode; + pAd->CommonCfg.DesiredPhyMode = WirelessMode; + return TRUE; + } + + return FALSE; + +} + + +INT RT_CfgSetShortSlot( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + LONG ShortSlot; + + ShortSlot = simple_strtol(arg, 0, 10); + + if (ShortSlot == 1) + pAd->CommonCfg.bUseShortSlotTime = TRUE; + else if (ShortSlot == 0) + pAd->CommonCfg.bUseShortSlotTime = FALSE; + else + return FALSE; //Invalid argument + + return TRUE; +} + + +/* + ========================================================================== + Description: + Set WEP KEY base on KeyIdx + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT RT_CfgSetWepKey( + IN PRTMP_ADAPTER pAd, + IN PSTRING keyString, + IN CIPHER_KEY *pSharedKey, + IN INT keyIdx) +{ + INT KeyLen; + INT i; + //UCHAR CipherAlg = CIPHER_NONE; + BOOLEAN bKeyIsHex = FALSE; + + // TODO: Shall we do memset for the original key info?? + memset(pSharedKey, 0, sizeof(CIPHER_KEY)); + KeyLen = strlen(keyString); + switch (KeyLen) + { + case 5: //wep 40 Ascii type + case 13: //wep 104 Ascii type + bKeyIsHex = FALSE; + pSharedKey->KeyLen = KeyLen; + NdisMoveMemory(pSharedKey->Key, keyString, KeyLen); + break; + + case 10: //wep 40 Hex type + case 26: //wep 104 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(keyString+i)) ) + return FALSE; //Not Hex value; + } + bKeyIsHex = TRUE; + pSharedKey->KeyLen = KeyLen/2 ; + AtoH(keyString, pSharedKey->Key, pSharedKey->KeyLen); + break; + + default: //Invalid argument + DBGPRINT(RT_DEBUG_TRACE, ("RT_CfgSetWepKey(keyIdx=%d):Invalid argument (arg=%s)\n", keyIdx, keyString)); + return FALSE; + } + + pSharedKey->CipherAlg = ((KeyLen % 5) ? CIPHER_WEP128 : CIPHER_WEP64); + DBGPRINT(RT_DEBUG_TRACE, ("RT_CfgSetWepKey:(KeyIdx=%d,type=%s, Alg=%s)\n", + keyIdx, (bKeyIsHex == FALSE ? "Ascii" : "Hex"), CipherName[pSharedKey->CipherAlg])); + + return TRUE; +} + + +/* + ========================================================================== + Description: + Set WPA PSK key + + Arguments: + pAdapter Pointer to our adapter + keyString WPA pre-shared key string + pHashStr String used for password hash function + hashStrLen Lenght of the hash string + pPMKBuf Output buffer of WPAPSK key + + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT RT_CfgSetWPAPSKKey( + IN RTMP_ADAPTER *pAd, + IN PSTRING keyString, + IN UCHAR *pHashStr, + IN INT hashStrLen, + OUT PUCHAR pPMKBuf) +{ + int keyLen; + UCHAR keyMaterial[40]; + + keyLen = strlen(keyString); + if ((keyLen < 8) || (keyLen > 64)) + { + DBGPRINT(RT_DEBUG_TRACE, ("WPAPSK Key length(%d) error, required 8 ~ 64 characters!(keyStr=%s)\n", + keyLen, keyString)); + return FALSE; + } + + memset(pPMKBuf, 0, 32); + if (keyLen == 64) + { + AtoH(keyString, pPMKBuf, 32); + } + else + { + RtmpPasswordHash(keyString, pHashStr, hashStrLen, keyMaterial); + NdisMoveMemory(pPMKBuf, keyMaterial, 32); + } + + return TRUE; +} + +INT RT_CfgSetFixedTxPhyMode( + IN PSTRING arg) +{ + INT fix_tx_mode = FIXED_TXMODE_HT; + UINT32 value; + + if (strcmp(arg, "OFDM") == 0 || strcmp(arg, "ofdm") == 0) + { + fix_tx_mode = FIXED_TXMODE_OFDM; + } + else if (strcmp(arg, "CCK") == 0 || strcmp(arg, "cck") == 0) + { + fix_tx_mode = FIXED_TXMODE_CCK; + } + else if (strcmp(arg, "HT") == 0 || strcmp(arg, "ht") == 0) + { + fix_tx_mode = FIXED_TXMODE_HT; + } + else + { + value = simple_strtol(arg, 0, 10); + // 1 : CCK + // 2 : OFDM + // otherwise : HT + if (value == FIXED_TXMODE_CCK || value == FIXED_TXMODE_OFDM) + fix_tx_mode = value; + else + fix_tx_mode = FIXED_TXMODE_HT; + } + + return fix_tx_mode; + +} + +INT RT_CfgSetMacAddress( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + INT i, mac_len; + + /* Mac address acceptable format 01:02:03:04:05:06 length 17 */ + mac_len = strlen(arg); + if(mac_len != 17) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : invalid length (%d)\n", __FUNCTION__, mac_len)); + return FALSE; + } + + if(strcmp(arg, "00:00:00:00:00:00") == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : invalid mac setting \n", __FUNCTION__)); + return FALSE; + } + + for (i = 0; i < MAC_ADDR_LEN; i++) + { + AtoH(arg, &pAd->CurrentAddress[i], 1); + arg = arg + 3; + } + + pAd->bLocalAdminMAC = TRUE; + return TRUE; +} + +INT RT_CfgSetTxMCSProc( + IN PSTRING arg, + OUT BOOLEAN *pAutoRate) +{ + INT Value = simple_strtol(arg, 0, 10); + INT TxMcs; + + if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3 + { + TxMcs = Value; + *pAutoRate = FALSE; + } + else + { + TxMcs = MCS_AUTO; + *pAutoRate = TRUE; + } + + return TxMcs; + +} + +INT RT_CfgSetAutoFallBack( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + TX_RTY_CFG_STRUC tx_rty_cfg; + UCHAR AutoFallBack = (UCHAR)simple_strtol(arg, 0, 10); + + RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); + tx_rty_cfg.field.TxautoFBEnable = (AutoFallBack) ? 1 : 0; + RTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word); + DBGPRINT(RT_DEBUG_TRACE, ("RT_CfgSetAutoFallBack::(tx_rty_cfg=0x%x)\n", tx_rty_cfg.word)); + return TRUE; +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_cmd.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_cmd.c new file mode 100644 index 000000000..a41bc1d9f --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_cmd.c @@ -0,0 +1,178 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_cmd.c + + Abstract: + All command related API. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs + Paul Lin 06-25-2004 created +*/ + +#include "rt_config.h" + + + + +/* + ======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + IRQL = + + Note: + + ======================================================================== +*/ +VOID RTInitializeCmdQ( + IN PCmdQ cmdq) +{ + cmdq->head = NULL; + cmdq->tail = NULL; + cmdq->size = 0; + cmdq->CmdQState = RTMP_TASK_STAT_INITED; +} + + +/* + ======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + IRQL = + + Note: + + ======================================================================== +*/ +VOID RTThreadDequeueCmd( + IN PCmdQ cmdq, + OUT PCmdQElmt *pcmdqelmt) +{ + *pcmdqelmt = cmdq->head; + + if (*pcmdqelmt != NULL) + { + cmdq->head = cmdq->head->next; + cmdq->size--; + if (cmdq->size == 0) + cmdq->tail = NULL; + } +} + + +/* + ======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + IRQL = + + Note: + + ======================================================================== +*/ +NDIS_STATUS RTEnqueueInternalCmd( + IN PRTMP_ADAPTER pAd, + IN NDIS_OID Oid, + IN PVOID pInformationBuffer, + IN UINT32 InformationBufferLength) +{ + NDIS_STATUS status; + PCmdQElmt cmdqelmt = NULL; + + + status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt, sizeof(CmdQElmt)); + if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt == NULL)) + return (NDIS_STATUS_RESOURCES); + NdisZeroMemory(cmdqelmt, sizeof(CmdQElmt)); + + if(InformationBufferLength > 0) + { + status = os_alloc_mem(pAd, (PUCHAR *)&cmdqelmt->buffer, InformationBufferLength); + if ((status != NDIS_STATUS_SUCCESS) || (cmdqelmt->buffer == NULL)) + { + os_free_mem(pAd, cmdqelmt); + return (NDIS_STATUS_RESOURCES); + } + else + { + NdisMoveMemory(cmdqelmt->buffer, pInformationBuffer, InformationBufferLength); + cmdqelmt->bufferlength = InformationBufferLength; + } + } + else + { + cmdqelmt->buffer = NULL; + cmdqelmt->bufferlength = 0; + } + + cmdqelmt->command = Oid; + cmdqelmt->CmdFromNdis = FALSE; + + if (cmdqelmt != NULL) + { + NdisAcquireSpinLock(&pAd->CmdQLock); + if (pAd->CmdQ.CmdQState & RTMP_TASK_CAN_DO_INSERT) + { + EnqueueCmd((&pAd->CmdQ), cmdqelmt); + status = NDIS_STATUS_SUCCESS; + } + else + { + status = NDIS_STATUS_FAILURE; + } + NdisReleaseSpinLock(&pAd->CmdQLock); + + if (status == NDIS_STATUS_FAILURE) + { + if (cmdqelmt->buffer) + os_free_mem(pAd, cmdqelmt->buffer); + os_free_mem(pAd, cmdqelmt); + } + else + RTCMDUp(pAd); + } + return(NDIS_STATUS_SUCCESS); +} diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_data.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_data.c new file mode 100644 index 000000000..567f0f8f7 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_data.c @@ -0,0 +1,2950 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_data.c + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + + +#include "rt_config.h" + + +UCHAR SNAP_802_1H[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; +UCHAR SNAP_BRIDGE_TUNNEL[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8}; +// Add Cisco Aironet SNAP heade for CCX2 support +UCHAR SNAP_AIRONET[] = {0xaa, 0xaa, 0x03, 0x00, 0x40, 0x96, 0x00, 0x00}; +UCHAR CKIP_LLC_SNAP[] = {0xaa, 0xaa, 0x03, 0x00, 0x40, 0x96, 0x00, 0x02}; +UCHAR EAPOL_LLC_SNAP[]= {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8e}; +UCHAR EAPOL[] = {0x88, 0x8e}; +UCHAR TPID[] = {0x81, 0x00}; /* VLAN related */ + +UCHAR IPX[] = {0x81, 0x37}; +UCHAR APPLE_TALK[] = {0x80, 0xf3}; +UCHAR RateIdToPlcpSignal[12] = { + 0, /* RATE_1 */ 1, /* RATE_2 */ 2, /* RATE_5_5 */ 3, /* RATE_11 */ // see BBP spec + 11, /* RATE_6 */ 15, /* RATE_9 */ 10, /* RATE_12 */ 14, /* RATE_18 */ // see IEEE802.11a-1999 p.14 + 9, /* RATE_24 */ 13, /* RATE_36 */ 8, /* RATE_48 */ 12 /* RATE_54 */ }; // see IEEE802.11a-1999 p.14 + +UCHAR OfdmSignalToRateId[16] = { + RATE_54, RATE_54, RATE_54, RATE_54, // OFDM PLCP Signal = 0, 1, 2, 3 respectively + RATE_54, RATE_54, RATE_54, RATE_54, // OFDM PLCP Signal = 4, 5, 6, 7 respectively + RATE_48, RATE_24, RATE_12, RATE_6, // OFDM PLCP Signal = 8, 9, 10, 11 respectively + RATE_54, RATE_36, RATE_18, RATE_9, // OFDM PLCP Signal = 12, 13, 14, 15 respectively +}; + +UCHAR OfdmRateToRxwiMCS[12] = { + 0, 0, 0, 0, + 0, 1, 2, 3, // OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,3 + 4, 5, 6, 7, // OFDM rate 24,36,48,54 = rxwi mcs 4,5,6,7 +}; +UCHAR RxwiMCSToOfdmRate[12] = { + RATE_6, RATE_9, RATE_12, RATE_18, + RATE_24, RATE_36, RATE_48, RATE_54, // OFDM rate 6,9,12,18 = rxwi mcs 0,1,2,3 + 4, 5, 6, 7, // OFDM rate 24,36,48,54 = rxwi mcs 4,5,6,7 +}; + +char* MCSToMbps[] = {"1Mbps","2Mbps","5.5Mbps","11Mbps","06Mbps","09Mbps","12Mbps","18Mbps","24Mbps","36Mbps","48Mbps","54Mbps","MM-0","MM-1","MM-2","MM-3","MM-4","MM-5","MM-6","MM-7","MM-8","MM-9","MM-10","MM-11","MM-12","MM-13","MM-14","MM-15","MM-32","ee1","ee2","ee3"}; + +UCHAR default_cwmin[]={CW_MIN_IN_BITS, CW_MIN_IN_BITS, CW_MIN_IN_BITS-1, CW_MIN_IN_BITS-2}; +//UCHAR default_cwmax[]={CW_MAX_IN_BITS, CW_MAX_IN_BITS, CW_MIN_IN_BITS, CW_MIN_IN_BITS-1}; +UCHAR default_sta_aifsn[]={3,7,2,2}; + +UCHAR MapUserPriorityToAccessCategory[8] = {QID_AC_BE, QID_AC_BK, QID_AC_BK, QID_AC_BE, QID_AC_VI, QID_AC_VI, QID_AC_VO, QID_AC_VO}; + + +/* + ======================================================================== + + Routine Description: + API for MLME to transmit management frame to AP (BSS Mode) + or station (IBSS Mode) + + Arguments: + pAd Pointer to our adapter + pData Pointer to the outgoing 802.11 frame + Length Size of outgoing management frame + + Return Value: + NDIS_STATUS_FAILURE + NDIS_STATUS_PENDING + NDIS_STATUS_SUCCESS + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +NDIS_STATUS MiniportMMRequest( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PUCHAR pData, + IN UINT Length) +{ + PNDIS_PACKET pPacket; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + ULONG FreeNum; + UCHAR rtmpHwHdr[TXINFO_SIZE + TXWI_SIZE]; //RTMP_HW_HDR_LEN]; +#ifdef RTMP_MAC_PCI + unsigned long IrqFlags = 0; + UCHAR IrqState; +#endif // RTMP_MAC_PCI // + BOOLEAN bUseDataQ = FALSE; + int retryCnt = 0; + + ASSERT(Length <= MGMT_DMA_BUFFER_SIZE); + + if ((QueIdx & MGMT_USE_QUEUE_FLAG) == MGMT_USE_QUEUE_FLAG) + { + bUseDataQ = TRUE; + QueIdx &= (~MGMT_USE_QUEUE_FLAG); + } + +#ifdef RTMP_MAC_PCI + // 2860C use Tx Ring + IrqState = pAd->irq_disabled; + if (pAd->MACVersion == 0x28600100) + { + QueIdx = (bUseDataQ ==TRUE ? QueIdx : 3); + bUseDataQ = TRUE; + } + if (bUseDataQ && (!IrqState)) + RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); +#endif // RTMP_MAC_PCI // + + do + { + // Reset is in progress, stop immediately + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) || + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)|| + !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) + { + Status = NDIS_STATUS_FAILURE; + break; + } + + // Check Free priority queue + // Since we use PBF Queue2 for management frame. Its corresponding DMA ring should be using TxRing. +#ifdef RTMP_MAC_PCI + if (bUseDataQ) + { + retryCnt = MAX_DATAMM_RETRY; + // free Tx(QueIdx) resources + RTMPFreeTXDUponTxDmaDone(pAd, QueIdx); + FreeNum = GET_TXRING_FREENO(pAd, QueIdx); + } + else +#endif // RTMP_MAC_PCI // + { + FreeNum = GET_MGMTRING_FREENO(pAd); + } + + if ((FreeNum > 0)) + { + // We need to reserve space for rtmp hardware header. i.e., TxWI for RT2860 and TxInfo+TxWI for RT2870 + NdisZeroMemory(&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE)); + Status = RTMPAllocateNdisPacket(pAd, &pPacket, (PUCHAR)&rtmpHwHdr, (TXINFO_SIZE + TXWI_SIZE), pData, Length); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_WARN, ("MiniportMMRequest (error:: can't allocate NDIS PACKET)\n")); + break; + } + + //pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK; + //pAd->CommonCfg.MlmeRate = RATE_2; + + +#ifdef RTMP_MAC_PCI + if (bUseDataQ) + { + Status = MlmeDataHardTransmit(pAd, QueIdx, pPacket); + retryCnt--; + } + else +#endif // RTMP_MAC_PCI // + Status = MlmeHardTransmit(pAd, QueIdx, pPacket); + if (Status == NDIS_STATUS_SUCCESS) + retryCnt = 0; + else + RTMPFreeNdisPacket(pAd, pPacket); + } + else + { + pAd->RalinkCounters.MgmtRingFullCount++; +#ifdef RTMP_MAC_PCI + if (bUseDataQ) + { + retryCnt--; + DBGPRINT(RT_DEBUG_TRACE, ("retryCnt %d\n", retryCnt)); + if (retryCnt == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("Qidx(%d), not enough space in DataRing, MgmtRingFullCount=%ld!\n", + QueIdx, pAd->RalinkCounters.MgmtRingFullCount)); + } + } +#endif // RTMP_MAC_PCI // + DBGPRINT(RT_DEBUG_ERROR, ("Qidx(%d), not enough space in MgmtRing, MgmtRingFullCount=%ld!\n", + QueIdx, pAd->RalinkCounters.MgmtRingFullCount)); + } + } while (retryCnt > 0); + + +#ifdef RTMP_MAC_PCI + if (bUseDataQ && (!IrqState)) + RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); +#endif // RTMP_MAC_PCI // + + return Status; +} + + + + +/* + ======================================================================== + + Routine Description: + Copy frame from waiting queue into relative ring buffer and set + appropriate ASIC register to kick hardware transmit function + + Arguments: + pAd Pointer to our adapter + pBuffer Pointer to memory of outgoing frame + Length Size of outgoing management frame + + Return Value: + NDIS_STATUS_FAILURE + NDIS_STATUS_PENDING + NDIS_STATUS_SUCCESS + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +NDIS_STATUS MlmeHardTransmit( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket) +{ + PACKET_INFO PacketInfo; + PUCHAR pSrcBufVA; + UINT SrcBufLen; + + + if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE) +#ifdef CARRIER_DETECTION_SUPPORT +#endif // CARRIER_DETECTION_SUPPORT // + ) + { + return NDIS_STATUS_FAILURE; + } + + RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); + if (pSrcBufVA == NULL) + return NDIS_STATUS_FAILURE; + + { +#ifdef RTMP_MAC_PCI + if ( pAd->MACVersion == 0x28600100 ) + return MlmeHardTransmitTxRing(pAd,QueIdx,pPacket); + else +#endif // RTMP_MAC_PCI // + return MlmeHardTransmitMgmtRing(pAd,QueIdx,pPacket); + } +} + + +NDIS_STATUS MlmeHardTransmitMgmtRing( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket) +{ + PACKET_INFO PacketInfo; + PUCHAR pSrcBufVA; + UINT SrcBufLen; + PHEADER_802_11 pHeader_802_11; + BOOLEAN bAckRequired, bInsertTimestamp; + UCHAR MlmeRate; + PTXWI_STRUC pFirstTxWI; + MAC_TABLE_ENTRY *pMacEntry = NULL; + UCHAR PID; + + RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); + + // Make sure MGMT ring resource won't be used by other threads + RTMP_SEM_LOCK(&pAd->MgmtRingLock); + if (pSrcBufVA == NULL) + { + // The buffer shouldn't be NULL + RTMP_SEM_UNLOCK(&pAd->MgmtRingLock); + return NDIS_STATUS_FAILURE; + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // outgoing frame always wakeup PHY to prevent frame lost + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + AsicForceWakeup(pAd, TRUE); + } +#endif // CONFIG_STA_SUPPORT // + + pFirstTxWI = (PTXWI_STRUC)(pSrcBufVA + TXINFO_SIZE); + pHeader_802_11 = (PHEADER_802_11) (pSrcBufVA + TXINFO_SIZE + TXWI_SIZE); //TXWI_SIZE); + + if (pHeader_802_11->Addr1[0] & 0x01) + { + MlmeRate = pAd->CommonCfg.BasicMlmeRate; + } + else + { + MlmeRate = pAd->CommonCfg.MlmeRate; + } + + // Verify Mlme rate for a / g bands. + if ((pAd->LatchRfRegs.Channel > 14) && (MlmeRate < RATE_6)) // 11A band + MlmeRate = RATE_6; + + if ((pHeader_802_11->FC.Type == BTYPE_DATA) && + (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL)) + { + pMacEntry = MacTableLookup(pAd, pHeader_802_11->Addr1); + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Fixed W52 with Activity scan issue in ABG_MIXED and ABGN_MIXED mode. + if (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED +#ifdef DOT11_N_SUPPORT + || pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED +#endif // DOT11_N_SUPPORT // + ) + { + if (pAd->LatchRfRegs.Channel > 14) + pAd->CommonCfg.MlmeTransmit.field.MODE = 1; + else + pAd->CommonCfg.MlmeTransmit.field.MODE = 0; + } + } +#endif // CONFIG_STA_SUPPORT // + + // + // Should not be hard code to set PwrMgmt to 0 (PWR_ACTIVE) + // Snice it's been set to 0 while on MgtMacHeaderInit + // By the way this will cause frame to be send on PWR_SAVE failed. + // +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + // We are in scan progress, just let the PwrMgmt bit keep as it orginally should be. + } + else +#endif // CONFIG_STA_SUPPORT // + pHeader_802_11->FC.PwrMgmt = PWR_ACTIVE; // (pAd->StaCfg.Psm == PWR_SAVE); +#ifdef CONFIG_STA_SUPPORT + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + // + // In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame + // Data-Null packets alse pass through MMRequest in RT2860, however, we hope control the psm bit to pass APSD +// if ((pHeader_802_11->FC.Type != BTYPE_DATA) && (pHeader_802_11->FC.Type != BTYPE_CNTL)) + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if ((pHeader_802_11->FC.SubType == SUBTYPE_ACTION) || + ((pHeader_802_11->FC.Type == BTYPE_DATA) && + ((pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL) || + (pHeader_802_11->FC.SubType == SUBTYPE_NULL_FUNC)))) + { + if (pAd->StaCfg.Psm == PWR_SAVE) + pHeader_802_11->FC.PwrMgmt = PWR_SAVE; + else if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && + INFRA_ON(pAd) && + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + // We are in scan progress, just let the PwrMgmt bit keep as it orginally should be. + } + else + { + pHeader_802_11->FC.PwrMgmt = pAd->CommonCfg.bAPSDForcePowerSave; + } + } + } +#endif // CONFIG_STA_SUPPORT // + + + + + + bInsertTimestamp = FALSE; + if (pHeader_802_11->FC.Type == BTYPE_CNTL) // must be PS-POLL + { +#ifdef CONFIG_STA_SUPPORT + //Set PM bit in ps-poll, to fix WLK 1.2 PowerSaveMode_ext failure issue. + if ((pAd->OpMode == OPMODE_STA) && (pHeader_802_11->FC.SubType == SUBTYPE_PS_POLL)) + { + pHeader_802_11->FC.PwrMgmt = PWR_SAVE; + } +#endif // CONFIG_STA_SUPPORT // + bAckRequired = FALSE; + } + else // BTYPE_MGMT or BTYPE_DATA(must be NULL frame) + { + if (pHeader_802_11->Addr1[0] & 0x01) // MULTICAST, BROADCAST + { + bAckRequired = FALSE; + pHeader_802_11->Duration = 0; + } + else + { + bAckRequired = TRUE; + pHeader_802_11->Duration = RTMPCalcDuration(pAd, MlmeRate, 14); + if ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) && (pHeader_802_11->FC.Type == BTYPE_MGMT)) + { + bInsertTimestamp = TRUE; + bAckRequired = FALSE; // Disable ACK to prevent retry 0x1f for Probe Response + } + else if ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_REQ) && (pHeader_802_11->FC.Type == BTYPE_MGMT)) + { + bAckRequired = FALSE; // Disable ACK to prevent retry 0x1f for Probe Request + } + } + } + + pHeader_802_11->Sequence = pAd->Sequence++; + if (pAd->Sequence >0xfff) + pAd->Sequence = 0; + + // Before radar detection done, mgmt frame can not be sent but probe req + // Because we need to use probe req to trigger driver to send probe req in passive scan + if ((pHeader_802_11->FC.SubType != SUBTYPE_PROBE_REQ) + && (pAd->CommonCfg.bIEEE80211H == 1) + && (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)) + { + DBGPRINT(RT_DEBUG_ERROR,("MlmeHardTransmit --> radar detect not in normal mode !!!\n")); +// if (!IrqState) + RTMP_SEM_UNLOCK(&pAd->MgmtRingLock); + return (NDIS_STATUS_FAILURE); + } + + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHeader_802_11, DIR_WRITE, FALSE); +#endif + + // + // fill scatter-and-gather buffer list into TXD. Internally created NDIS PACKET + // should always has only one physical buffer, and the whole frame size equals + // to the first scatter buffer size + // + + // Initialize TX Descriptor + // For inter-frame gap, the number is for this frame and next frame + // For MLME rate, we will fix as 2Mb to match other vendor's implement +// pAd->CommonCfg.MlmeTransmit.field.MODE = 1; + +// management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not. + PID = PID_MGMT; + + + if (pMacEntry == NULL) + { + RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp, FALSE, bAckRequired, FALSE, + 0, RESERVED_WCID, (SrcBufLen - TXINFO_SIZE - TXWI_SIZE), PID, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit); + } + else + { + /* dont use low rate to send QoS Null data frame */ + RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, + bInsertTimestamp, FALSE, bAckRequired, FALSE, + 0, pMacEntry->Aid, (SrcBufLen - TXINFO_SIZE - TXWI_SIZE), + pMacEntry->MaxHTPhyMode.field.MCS, 0, + (UCHAR)pMacEntry->MaxHTPhyMode.field.MCS, + IFS_BACKOFF, FALSE, &pMacEntry->MaxHTPhyMode); + } + +#ifdef RT_BIG_ENDIAN + RTMPWIEndianChange((PUCHAR)pFirstTxWI, TYPE_TXWI); +#endif + + // Now do hardware-depened kick out. + HAL_KickOutMgmtTx(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen); + + // Make sure to release MGMT ring resource +// if (!IrqState) + RTMP_SEM_UNLOCK(&pAd->MgmtRingLock); + return NDIS_STATUS_SUCCESS; +} + + +/******************************************************************************** + + New DeQueue Procedures. + + ********************************************************************************/ + +#define DEQUEUE_LOCK(lock, bIntContext, IrqFlags) \ + do{ \ + if (bIntContext == FALSE) \ + RTMP_IRQ_LOCK((lock), IrqFlags); \ + }while(0) + +#define DEQUEUE_UNLOCK(lock, bIntContext, IrqFlags) \ + do{ \ + if (bIntContext == FALSE) \ + RTMP_IRQ_UNLOCK((lock), IrqFlags); \ + }while(0) + + + + +/* + ======================================================================== + Tx Path design algorithm: + Basically, we divide the packets into four types, Broadcast/Multicast, 11N Rate(AMPDU, AMSDU, Normal), B/G Rate(ARALINK, Normal), + Specific Packet Type. Following show the classification rule and policy for each kinds of packets. + Classification Rule=> + Multicast: (*addr1 & 0x01) == 0x01 + Specific : bDHCPFrame, bARPFrame, bEAPOLFrame, etc. + 11N Rate : If peer support HT + (1).AMPDU -- If TXBA is negotiated. + (2).AMSDU -- If AMSDU is capable for both peer and ourself. + *). AMSDU can embedded in a AMPDU, but now we didn't support it. + (3).Normal -- Other packets which send as 11n rate. + + B/G Rate : If peer is b/g only. + (1).ARALINK-- If both of peer/us supprot Ralink proprietary Aggregation and the TxRate is large than RATE_6 + (2).Normal -- Other packets which send as b/g rate. + Fragment: + The packet must be unicast, NOT A-RALINK, NOT A-MSDU, NOT 11n, then can consider about fragment. + + Classified Packet Handle Rule=> + Multicast: + No ACK, //pTxBlk->bAckRequired = FALSE; + No WMM, //pTxBlk->bWMM = FALSE; + No piggyback, //pTxBlk->bPiggyBack = FALSE; + Force LowRate, //pTxBlk->bForceLowRate = TRUE; + Specific : Basically, for specific packet, we should handle it specifically, but now all specific packets are use + the same policy to handle it. + Force LowRate, //pTxBlk->bForceLowRate = TRUE; + + 11N Rate : + No piggyback, //pTxBlk->bPiggyBack = FALSE; + + (1).AMSDU + pTxBlk->bWMM = TRUE; + (2).AMPDU + pTxBlk->bWMM = TRUE; + (3).Normal + + B/G Rate : + (1).ARALINK + + (2).Normal + ======================================================================== +*/ +static UCHAR TxPktClassification( + IN RTMP_ADAPTER *pAd, + IN PNDIS_PACKET pPacket) +{ + UCHAR TxFrameType = TX_UNKOWN_FRAME; + UCHAR Wcid; + MAC_TABLE_ENTRY *pMacEntry = NULL; +#ifdef DOT11_N_SUPPORT + BOOLEAN bHTRate = FALSE; +#endif // DOT11_N_SUPPORT // + + Wcid = RTMP_GET_PACKET_WCID(pPacket); + if (Wcid == MCAST_WCID) + { // Handle for RA is Broadcast/Multicast Address. + return TX_MCAST_FRAME; + } + + // Handle for unicast packets + pMacEntry = &pAd->MacTab.Content[Wcid]; + if (RTMP_GET_PACKET_LOWRATE(pPacket)) + { // It's a specific packet need to force low rate, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame + TxFrameType = TX_LEGACY_FRAME; + } +#ifdef DOT11_N_SUPPORT + else if (IS_HT_RATE(pMacEntry)) + { // it's a 11n capable packet + + // Depends on HTPhyMode to check if the peer support the HTRate transmission. + // Currently didn't support A-MSDU embedded in A-MPDU + bHTRate = TRUE; + if (RTMP_GET_PACKET_MOREDATA(pPacket) || (pMacEntry->PsMode == PWR_SAVE)) + TxFrameType = TX_LEGACY_FRAME; +#ifdef UAPSD_AP_SUPPORT + else if (RTMP_GET_PACKET_EOSP(pPacket)) + TxFrameType = TX_LEGACY_FRAME; +#endif // UAPSD_AP_SUPPORT // + else if((pMacEntry->TXBAbitmap & (1<<(RTMP_GET_PACKET_UP(pPacket)))) != 0) + return TX_AMPDU_FRAME; + else if(CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AMSDU_INUSED)) + return TX_AMSDU_FRAME; + else + TxFrameType = TX_LEGACY_FRAME; + } +#endif // DOT11_N_SUPPORT // + else + { // it's a legacy b/g packet. + if ((CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE) && pAd->CommonCfg.bAggregationCapable) && + (RTMP_GET_PACKET_TXRATE(pPacket) >= RATE_6) && + (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE)))) + { // if peer support Ralink Aggregation, we use it. + TxFrameType = TX_RALINK_FRAME; + } + else + { + TxFrameType = TX_LEGACY_FRAME; + } + } + + // Currently, our fragment only support when a unicast packet send as NOT-ARALINK, NOT-AMSDU and NOT-AMPDU. + if ((RTMP_GET_PACKET_FRAGMENTS(pPacket) > 1) + && (TxFrameType == TX_LEGACY_FRAME) +#ifdef DOT11_N_SUPPORT + && ((pMacEntry->TXBAbitmap & (1<<(RTMP_GET_PACKET_UP(pPacket)))) == 0) +#endif // DOT11_N_SUPPORT // + ) + TxFrameType = TX_FRAG_FRAME; + + return TxFrameType; +} + + +BOOLEAN RTMP_FillTxBlkInfo( + IN RTMP_ADAPTER *pAd, + IN TX_BLK *pTxBlk) +{ + PACKET_INFO PacketInfo; + PNDIS_PACKET pPacket; + PMAC_TABLE_ENTRY pMacEntry = NULL; + + pPacket = pTxBlk->pPacket; + RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen); + + pTxBlk->Wcid = RTMP_GET_PACKET_WCID(pPacket); + pTxBlk->apidx = RTMP_GET_PACKET_IF(pPacket); + pTxBlk->UserPriority = RTMP_GET_PACKET_UP(pPacket); + pTxBlk->FrameGap = IFS_HTTXOP; // ASIC determine Frame Gap + + if (RTMP_GET_PACKET_CLEAR_EAP_FRAME(pTxBlk->pPacket)) + TX_BLK_SET_FLAG(pTxBlk, fTX_bClearEAPFrame); + else + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bClearEAPFrame); + + // Default to clear this flag + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bForceNonQoS); + + + if (pTxBlk->Wcid == MCAST_WCID) + { + pTxBlk->pMacEntry = NULL; + { +#ifdef MCAST_RATE_SPECIFIC + PUCHAR pDA = GET_OS_PKT_DATAPTR(pPacket); + if (((*pDA & 0x01) == 0x01) && (*pDA != 0xff)) + pTxBlk->pTransmit = &pAd->CommonCfg.MCastPhyMode; + else +#endif // MCAST_RATE_SPECIFIC // + pTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode; + } + + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); // AckRequired = FALSE, when broadcast packet in Adhoc mode. + //TX_BLK_SET_FLAG(pTxBlk, fTX_bForceLowRate); + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAllowFrag); + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM); + if (RTMP_GET_PACKET_MOREDATA(pPacket)) + { + TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData); + } + } + else + { + pTxBlk->pMacEntry = &pAd->MacTab.Content[pTxBlk->Wcid]; + pTxBlk->pTransmit = &pTxBlk->pMacEntry->HTPhyMode; + + pMacEntry = pTxBlk->pMacEntry; + + // For all unicast packets, need Ack unless the Ack Policy is not set as NORMAL_ACK. + if (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx] != NORMAL_ACK) + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); + else + TX_BLK_SET_FLAG(pTxBlk, fTX_bAckRequired); + +#ifdef CONFIG_STA_SUPPORT +#ifdef XLINK_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && + (ADHOC_ON(pAd)) /*&& + (RX_FILTER_TEST_FLAG(pAd, fRX_FILTER_ACCEPT_PROMISCUOUS))*/) + { + if(pAd->StaCfg.PSPXlink) + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bAckRequired); + } +#endif // XLINK_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + + + // If support WMM, enable it. + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && + CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE)) + TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM); + +// if (pAd->StaCfg.bAutoTxRateSwitch) +// TX_BLK_SET_FLAG(pTxBlk, fTX_AutoRateSwitch); + } +#endif // CONFIG_STA_SUPPORT // + } + + if (pTxBlk->TxFrameType == TX_LEGACY_FRAME) + { + if ( (RTMP_GET_PACKET_LOWRATE(pPacket)) || + ((pAd->OpMode == OPMODE_AP) && (pMacEntry->MaxHTPhyMode.field.MODE == MODE_CCK) && (pMacEntry->MaxHTPhyMode.field.MCS == RATE_1))) + { // Specific packet, i.e., bDHCPFrame, bEAPOLFrame, bWAIFrame, need force low rate. + pTxBlk->pTransmit = &pAd->MacTab.Content[MCAST_WCID].HTPhyMode; +#ifdef DOT11_N_SUPPORT + // Modify the WMM bit for ICV issue. If we have a packet with EOSP field need to set as 1, how to handle it??? + if (IS_HT_STA(pTxBlk->pMacEntry) && + (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_RALINK_CHIPSET)) && + ((pAd->CommonCfg.bRdg == TRUE) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_RDG_CAPABLE))) + { + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bWMM); + TX_BLK_SET_FLAG(pTxBlk, fTX_bForceNonQoS); + } +#endif // DOT11_N_SUPPORT // + } + +#ifdef DOT11_N_SUPPORT + if ( (IS_HT_RATE(pMacEntry) == FALSE) && + (CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE))) + { // Currently piggy-back only support when peer is operate in b/g mode. + TX_BLK_SET_FLAG(pTxBlk, fTX_bPiggyBack); + } +#endif // DOT11_N_SUPPORT // + + if (RTMP_GET_PACKET_MOREDATA(pPacket)) + { + TX_BLK_SET_FLAG(pTxBlk, fTX_bMoreData); + } +#ifdef UAPSD_AP_SUPPORT + if (RTMP_GET_PACKET_EOSP(pPacket)) + { + TX_BLK_SET_FLAG(pTxBlk, fTX_bWMM_UAPSD_EOSP); + } +#endif // UAPSD_AP_SUPPORT // + } + else if (pTxBlk->TxFrameType == TX_FRAG_FRAME) + { + TX_BLK_SET_FLAG(pTxBlk, fTX_bAllowFrag); + } + + pMacEntry->DebugTxCount++; + } + +#ifdef CONFIG_STA_SUPPORT + pAd->LastTxRate = (USHORT)pTxBlk->pTransmit->word; +#endif // CONFIG_STA_SUPPORT // + + return TRUE; +} + + +BOOLEAN CanDoAggregateTransmit( + IN RTMP_ADAPTER *pAd, + IN NDIS_PACKET *pPacket, + IN TX_BLK *pTxBlk) +{ + + //DBGPRINT(RT_DEBUG_TRACE, ("Check if can do aggregation! TxFrameType=%d!\n", pTxBlk->TxFrameType)); + + if (RTMP_GET_PACKET_WCID(pPacket) == MCAST_WCID) + return FALSE; + + if (RTMP_GET_PACKET_DHCP(pPacket) || + RTMP_GET_PACKET_EAPOL(pPacket) || + RTMP_GET_PACKET_WAI(pPacket)) + return FALSE; + + if ((pTxBlk->TxFrameType == TX_AMSDU_FRAME) && + ((pTxBlk->TotalFrameLen + GET_OS_PKT_LEN(pPacket))> (RX_BUFFER_AGGRESIZE - 100))) + { // For AMSDU, allow the packets with total length < max-amsdu size + return FALSE; + } + + if ((pTxBlk->TxFrameType == TX_RALINK_FRAME) && + (pTxBlk->TxPacketList.Number == 2)) + { // For RALINK-Aggregation, allow two frames in one batch. + return FALSE; + } + +#ifdef CONFIG_STA_SUPPORT + if ((INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) // must be unicast to AP + return TRUE; + else +#endif // CONFIG_STA_SUPPORT // + return FALSE; + +} + + +/* + ======================================================================== + + Routine Description: + To do the enqueue operation and extract the first item of waiting + list. If a number of available shared memory segments could meet + the request of extracted item, the extracted item will be fragmented + into shared memory segments. + + Arguments: + pAd Pointer to our adapter + pQueue Pointer to Waiting Queue + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPDeQueuePacket( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bIntContext, + IN UCHAR QIdx, /* BulkOutPipeId */ + IN UCHAR Max_Tx_Packets) +{ + PQUEUE_ENTRY pEntry = NULL; + PNDIS_PACKET pPacket; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + UCHAR Count=0; + PQUEUE_HEADER pQueue; + ULONG FreeNumber[NUM_OF_TX_RING]; + UCHAR QueIdx, sQIdx, eQIdx; + unsigned long IrqFlags = 0; + BOOLEAN hasTxDesc = FALSE; + TX_BLK TxBlk; + TX_BLK *pTxBlk; + +#ifdef DBG_DIAGNOSE + BOOLEAN firstRound; + RtmpDiagStruct *pDiagStruct = &pAd->DiagStruct; +#endif + + + if (QIdx == NUM_OF_TX_RING) + { + sQIdx = 0; + eQIdx = 3; // 4 ACs, start from 0. + } + else + { + sQIdx = eQIdx = QIdx; + } + + for (QueIdx=sQIdx; QueIdx <= eQIdx; QueIdx++) + { + Count=0; + + RTMP_START_DEQUEUE(pAd, QueIdx, IrqFlags); + +#ifdef DBG_DIAGNOSE + firstRound = ((QueIdx == 0) ? TRUE : FALSE); +#endif // DBG_DIAGNOSE // + + while (1) + { + if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS | + fRTMP_ADAPTER_RADIO_OFF | + fRTMP_ADAPTER_RESET_IN_PROGRESS | + fRTMP_ADAPTER_HALT_IN_PROGRESS | + fRTMP_ADAPTER_NIC_NOT_EXIST)))) + { + RTMP_STOP_DEQUEUE(pAd, QueIdx, IrqFlags); + return; + } + + if (Count >= Max_Tx_Packets) + break; + + DEQUEUE_LOCK(&pAd->irq_lock, bIntContext, IrqFlags); + if (&pAd->TxSwQueue[QueIdx] == NULL) + { +#ifdef DBG_DIAGNOSE + if (firstRound == TRUE) + pDiagStruct->TxSWQueCnt[pDiagStruct->ArrayCurIdx][0]++; +#endif // DBG_DIAGNOSE // + DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags); + break; + } + +#ifdef RTMP_MAC_PCI + FreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx); + +#ifdef DBG_DIAGNOSE + if (firstRound == TRUE) + { + UCHAR txDescNumLevel, txSwQNumLevel; + + txDescNumLevel = (TX_RING_SIZE - FreeNumber[QueIdx]); // Number of occupied hw desc. + txDescNumLevel = ((txDescNumLevel <=15) ? txDescNumLevel : 15); + pDiagStruct->TxDescCnt[pDiagStruct->ArrayCurIdx][txDescNumLevel]++; + + txSwQNumLevel = ((pAd->TxSwQueue[QueIdx].Number <=7) ? pAd->TxSwQueue[QueIdx].Number : 8); + pDiagStruct->TxSWQueCnt[pDiagStruct->ArrayCurIdx][txSwQNumLevel]++; + + firstRound = FALSE; + } +#endif // DBG_DIAGNOSE // + + if (FreeNumber[QueIdx] <= 5) + { + // free Tx(QueIdx) resources + RTMPFreeTXDUponTxDmaDone(pAd, QueIdx); + FreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx); + } +#endif // RTMP_MAC_PCI // + + // probe the Queue Head + pQueue = &pAd->TxSwQueue[QueIdx]; + if ((pEntry = pQueue->Head) == NULL) + { + DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags); + break; + } + + pTxBlk = &TxBlk; + NdisZeroMemory((PUCHAR)pTxBlk, sizeof(TX_BLK)); + //InitializeQueueHeader(&pTxBlk->TxPacketList); // Didn't need it because we already memzero it. + pTxBlk->QueIdx = QueIdx; + +#ifdef VENDOR_FEATURE1_SUPPORT + pTxBlk->HeaderBuf = pTxBlk->HeaderBuffer; +#endif // VENDOR_FEATURE1_SUPPORT // + + pPacket = QUEUE_ENTRY_TO_PACKET(pEntry); + + + // Early check to make sure we have enoguh Tx Resource. + hasTxDesc = RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, FreeNumber[QueIdx], pPacket); + if (!hasTxDesc) + { + pAd->PrivateInfo.TxRingFullCnt++; + + DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags); + + break; + } + + pTxBlk->TxFrameType = TxPktClassification(pAd, pPacket); + pEntry = RemoveHeadQueue(pQueue); + pTxBlk->TotalFrameNum++; + pTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket); // The real fragment number maybe vary + pTxBlk->TotalFrameLen += GET_OS_PKT_LEN(pPacket); + pTxBlk->pPacket = pPacket; + InsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket)); + + if (pTxBlk->TxFrameType == TX_RALINK_FRAME || pTxBlk->TxFrameType == TX_AMSDU_FRAME) + { + // Enhance SW Aggregation Mechanism + if (NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, FreeNumber[QueIdx], pTxBlk->TxFrameType)) + { + InsertHeadQueue(pQueue, PACKET_TO_QUEUE_ENTRY(pPacket)); + DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags); + break; + } + + do{ + if((pEntry = pQueue->Head) == NULL) + break; + + // For TX_AMSDU_FRAME/TX_RALINK_FRAME, Need to check if next pakcet can do aggregation. + pPacket = QUEUE_ENTRY_TO_PACKET(pEntry); + FreeNumber[QueIdx] = GET_TXRING_FREENO(pAd, QueIdx); + hasTxDesc = RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, FreeNumber[QueIdx], pPacket); + if ((hasTxDesc == FALSE) || (CanDoAggregateTransmit(pAd, pPacket, pTxBlk) == FALSE)) + break; + + //Remove the packet from the TxSwQueue and insert into pTxBlk + pEntry = RemoveHeadQueue(pQueue); + ASSERT(pEntry); + pPacket = QUEUE_ENTRY_TO_PACKET(pEntry); + pTxBlk->TotalFrameNum++; + pTxBlk->TotalFragNum += RTMP_GET_PACKET_FRAGMENTS(pPacket); // The real fragment number maybe vary + pTxBlk->TotalFrameLen += GET_OS_PKT_LEN(pPacket); + InsertTailQueue(&pTxBlk->TxPacketList, PACKET_TO_QUEUE_ENTRY(pPacket)); + }while(1); + + if (pTxBlk->TxPacketList.Number == 1) + pTxBlk->TxFrameType = TX_LEGACY_FRAME; + } + + + Count += pTxBlk->TxPacketList.Number; + + + // Do HardTransmit now. +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + Status = STAHardTransmit(pAd, pTxBlk, QueIdx); +#endif // CONFIG_STA_SUPPORT // + +#ifdef RTMP_MAC_PCI + DEQUEUE_UNLOCK(&pAd->irq_lock, bIntContext, IrqFlags); + // static rate also need NICUpdateFifoStaCounters() function. + //if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) + NICUpdateFifoStaCounters(pAd); +#endif // RTMP_MAC_PCI // + + } + + RTMP_STOP_DEQUEUE(pAd, QueIdx, IrqFlags); + + +#ifdef BLOCK_NET_IF + if ((pAd->blockQueueTab[QueIdx].SwTxQueueBlockFlag == TRUE) + && (pAd->TxSwQueue[QueIdx].Number < 1)) + { + releaseNetIf(&pAd->blockQueueTab[QueIdx]); + } +#endif // BLOCK_NET_IF // + + } + +} + + +/* + ======================================================================== + + Routine Description: + Calculates the duration which is required to transmit out frames + with given size and specified rate. + + Arguments: + pAd Pointer to our adapter + Rate Transmit rate + Size Frame size in units of byte + + Return Value: + Duration number in units of usec + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +USHORT RTMPCalcDuration( + IN PRTMP_ADAPTER pAd, + IN UCHAR Rate, + IN ULONG Size) +{ + ULONG Duration = 0; + + if (Rate < RATE_FIRST_OFDM_RATE) // CCK + { + if ((Rate > RATE_1) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED)) + Duration = 96; // 72+24 preamble+plcp + else + Duration = 192; // 144+48 preamble+plcp + + Duration += (USHORT)((Size << 4) / RateIdTo500Kbps[Rate]); + if ((Size << 4) % RateIdTo500Kbps[Rate]) + Duration ++; + } + else if (Rate <= RATE_LAST_OFDM_RATE)// OFDM rates + { + Duration = 20 + 6; // 16+4 preamble+plcp + Signal Extension + Duration += 4 * (USHORT)((11 + Size * 4) / RateIdTo500Kbps[Rate]); + if ((11 + Size * 4) % RateIdTo500Kbps[Rate]) + Duration += 4; + } + else //mimo rate + { + Duration = 20 + 6; // 16+4 preamble+plcp + Signal Extension + } + + return (USHORT)Duration; +} + + +/* + ======================================================================== + + Routine Description: + Calculates the duration which is required to transmit out frames + with given size and specified rate. + + Arguments: + pTxWI Pointer to head of each MPDU to HW. + Ack Setting for Ack requirement bit + Fragment Setting for Fragment bit + RetryMode Setting for retry mode + Ifs Setting for IFS gap + Rate Setting for transmit rate + Service Setting for service + Length Frame length + TxPreamble Short or Long preamble when using CCK rates + QueIdx - 0-3, according to 802.11e/d4.4 June/2003 + + Return Value: + None + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + See also : BASmartHardTransmit() !!! + + ======================================================================== +*/ +VOID RTMPWriteTxWI( + IN PRTMP_ADAPTER pAd, + IN PTXWI_STRUC pOutTxWI, + IN BOOLEAN FRAG, + IN BOOLEAN CFACK, + IN BOOLEAN InsTimestamp, + IN BOOLEAN AMPDU, + IN BOOLEAN Ack, + IN BOOLEAN NSeq, // HW new a sequence. + IN UCHAR BASize, + IN UCHAR WCID, + IN ULONG Length, + IN UCHAR PID, + IN UCHAR TID, + IN UCHAR TxRate, + IN UCHAR Txopmode, + IN BOOLEAN CfAck, + IN HTTRANSMIT_SETTING *pTransmit) +{ + PMAC_TABLE_ENTRY pMac = NULL; + TXWI_STRUC TxWI; + PTXWI_STRUC pTxWI; + + if (WCID < MAX_LEN_OF_MAC_TABLE) + pMac = &pAd->MacTab.Content[WCID]; + + // + // Always use Long preamble before verifiation short preamble functionality works well. + // Todo: remove the following line if short preamble functionality works + // + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); + NdisZeroMemory(&TxWI, TXWI_SIZE); + pTxWI = &TxWI; + + pTxWI->FRAG= FRAG; + + pTxWI->CFACK = CFACK; + pTxWI->TS= InsTimestamp; + pTxWI->AMPDU = AMPDU; + pTxWI->ACK = Ack; + pTxWI->txop= Txopmode; + + pTxWI->NSEQ = NSeq; + // John tune the performace with Intel Client in 20 MHz performance +#ifdef DOT11_N_SUPPORT + BASize = pAd->CommonCfg.TxBASize; + if (pAd->MACVersion == 0x28720200) + { + if( BASize >13 ) + BASize =13; + } + else + { + if( BASize >7 ) + BASize =7; + } + pTxWI->BAWinSize = BASize; + pTxWI->ShortGI = pTransmit->field.ShortGI; + pTxWI->STBC = pTransmit->field.STBC; +#endif // DOT11_N_SUPPORT // + + pTxWI->WirelessCliID = WCID; + pTxWI->MPDUtotalByteCount = Length; + pTxWI->PacketId = PID; + + // If CCK or OFDM, BW must be 20 + pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + if (pTxWI->BW) + pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW); +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + + pTxWI->MCS = pTransmit->field.MCS; + pTxWI->PHYMODE = pTransmit->field.MODE; + pTxWI->CFACK = CfAck; + +#ifdef DOT11_N_SUPPORT + if (pMac) + { + if (pAd->CommonCfg.bMIMOPSEnable) + { + if ((pMac->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7)) + { + // Dynamic MIMO Power Save Mode + pTxWI->MIMOps = 1; + } + else if (pMac->MmpsMode == MMPS_STATIC) + { + // Static MIMO Power Save Mode + if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7) + { + pTxWI->MCS = 7; + pTxWI->MIMOps = 0; + } + } + } + //pTxWI->MIMOps = (pMac->PsMode == PWR_MMPS)? 1:0; + if (pMac->bIAmBadAtheros && (pMac->WepStatus != Ndis802_11WEPDisabled)) + { + pTxWI->MpduDensity = 7; + } + else + { + pTxWI->MpduDensity = pMac->MpduDensity; + } + } +#endif // DOT11_N_SUPPORT // + + + pTxWI->PacketId = pTxWI->MCS; + NdisMoveMemory(pOutTxWI, &TxWI, sizeof(TXWI_STRUC)); +} + + +VOID RTMPWriteTxWI_Data( + IN PRTMP_ADAPTER pAd, + IN OUT PTXWI_STRUC pTxWI, + IN TX_BLK *pTxBlk) +{ + HTTRANSMIT_SETTING *pTransmit; + PMAC_TABLE_ENTRY pMacEntry; +#ifdef DOT11_N_SUPPORT + UCHAR BASize; +#endif // DOT11_N_SUPPORT // + + + ASSERT(pTxWI); + + pTransmit = pTxBlk->pTransmit; + pMacEntry = pTxBlk->pMacEntry; + + + // + // Always use Long preamble before verifiation short preamble functionality works well. + // Todo: remove the following line if short preamble functionality works + // + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); + NdisZeroMemory(pTxWI, TXWI_SIZE); + + pTxWI->FRAG = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag); + pTxWI->ACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired); + pTxWI->txop = pTxBlk->FrameGap; + +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT + if (pMacEntry && + (pAd->StaCfg.BssType == BSS_INFRA) && + IS_ENTRY_DLS(pMacEntry)) + pTxWI->WirelessCliID = BSSID_WCID; + else +#endif // QOS_DLS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + pTxWI->WirelessCliID = pTxBlk->Wcid; + + pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; + pTxWI->CFACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack); + + // If CCK or OFDM, BW must be 20 + pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + if (pTxWI->BW) + pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW); +#endif // DOT11N_DRAFT3 // + pTxWI->AMPDU = ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE); + + // John tune the performace with Intel Client in 20 MHz performance + BASize = pAd->CommonCfg.TxBASize; + if((pTxBlk->TxFrameType == TX_AMPDU_FRAME) && (pMacEntry)) + { + UCHAR RABAOriIdx = 0; //The RA's BA Originator table index. + + RABAOriIdx = pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority]; + BASize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize; + } + + +#ifdef RT2883_TEMP_PATCH + if (pTxBlk->TxSndgPkt == SNDG_TYPE_SOUNGING) + { + pTxWI->Sounding = 1; + DBGPRINT(RT_DEBUG_TRACE, ("ETxBF in RTMPWriteTxWI_Data(): sending normal sounding, eTxBF=%d\n", pTxWI->eTxBF)); + } + else if (pTxBlk->TxSndgPkt == SNDG_TYPE_NDP) + { + pTxWI->NDPSndBW = pTxBlk->TxNDPSndgBW; + if (pTxBlk->TxNDPSndgMcs>=16) + pTxWI->NDPSndRate = 2; + else if (pTxBlk->TxNDPSndgMcs>=8) + pTxWI->NDPSndRate = 1; + else + pTxWI->NDPSndRate = 0; + DBGPRINT(RT_DEBUG_TRACE, ("ETxBF in RTMPWriteTxWI_Data(): sending ndp sounding, NDPSndBW=%d, NDPSndRate=%d, eTxBF=%d\n", pTxWI->NDPSndBW, pTxWI->NDPSndRate, pTxWI->eTxBF)); + } + else + { + +// if (pMacEntry->) +// #if defined(ETXBF_EN_COND) && ((ETXBF_EN_COND == 1) || (ETXBF_EN_COND == 2)) +// pTxWI->eTxBF = 1; +// #else + if (pMacEntry && (pMacEntry->mrqCnt >0) && (pMacEntry->toTxMrq == TRUE)){ + pTxWI->eTxBF = ~(pTransmit->field.TxBF); +// DBGPRINT_RAW(RT_DEBUG_TRACE,("ETxBF in AP_AMPDU_Frame_Tx(): pTxBlk->pTransmit->field.TxBF = %d, pMacEntry->HTPhyMode=%d\n", pTxBlk->pTransmit->field.TxBF, pMacEntry->HTPhyMode.Txbf)); + } else + pTxWI->eTxBF = pTransmit->field.TxBF; +// #endif +// DBGPRINT(RT_DEBUG_TRACE, ("ETxBF in RTMPWriteTxWI_Data(): pTransmit->field.TxBF=%d, pTxWI->eTxBF =%d\n", pTransmit->field.TxBF, pTxWI->eTxBF)); + } +#endif // RT2883_TEMP_PATCH // + + + pTxWI->BAWinSize = BASize; + pTxWI->ShortGI = pTransmit->field.ShortGI; + pTxWI->STBC = pTransmit->field.STBC; +#endif // DOT11_N_SUPPORT // + + pTxWI->MCS = pTransmit->field.MCS; + pTxWI->PHYMODE = pTransmit->field.MODE; + + +#ifdef DOT11_N_SUPPORT + if (pMacEntry) + { + if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7)) + { + // Dynamic MIMO Power Save Mode + pTxWI->MIMOps = 1; + } + else if (pMacEntry->MmpsMode == MMPS_STATIC) + { + // Static MIMO Power Save Mode + if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7) + { + pTxWI->MCS = 7; + pTxWI->MIMOps = 0; + } + } + + if (pMacEntry->bIAmBadAtheros && (pMacEntry->WepStatus != Ndis802_11WEPDisabled)) + { + pTxWI->MpduDensity = 7; + } + else + { + pTxWI->MpduDensity = pMacEntry->MpduDensity; + } + } +#endif // DOT11_N_SUPPORT // + +#ifdef DBG_DIAGNOSE + if (pTxBlk->QueIdx== 0) + { + pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++; + pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++; + } +#endif // DBG_DIAGNOSE // + + // for rate adapation + pTxWI->PacketId = pTxWI->MCS; +#ifdef INF_AMAZON_SE +/*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */ + if( RTMP_GET_PACKET_NOBULKOUT(pTxBlk->pPacket)) + { + if(pTxWI->PHYMODE == MODE_CCK) + { + pTxWI->PacketId = 6; + } + } +#endif // INF_AMAZON_SE // + +} + + +VOID RTMPWriteTxWI_Cache( + IN PRTMP_ADAPTER pAd, + IN OUT PTXWI_STRUC pTxWI, + IN TX_BLK *pTxBlk) +{ + PHTTRANSMIT_SETTING /*pTxHTPhyMode,*/ pTransmit; + PMAC_TABLE_ENTRY pMacEntry; + + // + // update TXWI + // + pMacEntry = pTxBlk->pMacEntry; + pTransmit = pTxBlk->pTransmit; + + //if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) + //if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pMacEntry)) + //if (TX_BLK_TEST_FLAG(pTxBlk, fTX_AutoRateSwitch)) + if (pMacEntry->bAutoTxRateSwitch) + { + pTxWI->txop = IFS_HTTXOP; + + // If CCK or OFDM, BW must be 20 + pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); + pTxWI->ShortGI = pTransmit->field.ShortGI; + pTxWI->STBC = pTransmit->field.STBC; + + pTxWI->MCS = pTransmit->field.MCS; + pTxWI->PHYMODE = pTransmit->field.MODE; + + // set PID for TxRateSwitching + pTxWI->PacketId = pTransmit->field.MCS; + } + +#ifdef DOT11_N_SUPPORT + pTxWI->AMPDU = ((pMacEntry->NoBADataCountDown == 0) ? TRUE: FALSE); + pTxWI->MIMOps = 0; + +#ifdef DOT11N_DRAFT3 + if (pTxWI->BW) + pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW); +#endif // DOT11N_DRAFT3 // + + if (pAd->CommonCfg.bMIMOPSEnable) + { + // MIMO Power Save Mode + if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7)) + { + // Dynamic MIMO Power Save Mode + pTxWI->MIMOps = 1; + } + else if (pMacEntry->MmpsMode == MMPS_STATIC) + { + // Static MIMO Power Save Mode + if ((pTransmit->field.MODE >= MODE_HTMIX) && (pTransmit->field.MCS > 7)) + { + pTxWI->MCS = 7; + pTxWI->MIMOps = 0; + } + } + } +#endif // DOT11_N_SUPPORT // + +#ifdef DBG_DIAGNOSE + if (pTxBlk->QueIdx== 0) + { + pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++; + pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++; + } +#endif // DBG_DIAGNOSE // + +#ifdef RT2883_TEMP_PATCH + if (pTxBlk->TxSndgPkt == SNDG_TYPE_SOUNGING) + { + pTxWI->Sounding = 1; + pTxWI->eTxBF = 0; + pTxWI->iTxBF = 0; + DBGPRINT(RT_DEBUG_TRACE, ("ETxBF in RTMPWriteTxWI_Cache(): sending normal sounding, eTxBF=%d\n", pTxWI->eTxBF)); + } + else if (pTxBlk->TxSndgPkt == SNDG_TYPE_NDP) + { + pTxWI->NDPSndBW = pTxBlk->TxNDPSndgBW; + if (pTxBlk->TxNDPSndgMcs>=16) + pTxWI->NDPSndRate = 2; + else if (pTxBlk->TxNDPSndgMcs>=8) + pTxWI->NDPSndRate = 1; + else + pTxWI->NDPSndRate = 0; + pTxWI->Sounding = 0; + pTxWI->eTxBF = 0; + pTxWI->iTxBF = 0; + DBGPRINT(RT_DEBUG_TRACE, ("ETxBF in RTMPWriteTxWI_Cache(): sending ndp sounding, NDPSndBW=%d, NDPSndRate=%d, eTxBF=%d\n", pTxWI->NDPSndBW, pTxWI->NDPSndRate, pTxWI->eTxBF)); + } + else + { + pTxWI->Sounding = 0; +// #if defined(ETXBF_EN_COND) && ((ETXBF_EN_COND == 1) || (ETXBF_EN_COND == 2)) +// pTxWI->eTxBF = 1; +// #else +// DBGPRINT(RT_DEBUG_TRACE, ("ETxBF in RTMPWriteTxWI_Cache(): pMacEntry->mrqCnt=%d, pMacEntry->toTxMrq=%d\n", pMacEntry->mrqCnt, pMacEntry->toTxMrq)); + if (pMacEntry && pMacEntry->mrqCnt >0 && pMacEntry->toTxMrq == 1){ + pTxWI->eTxBF = ~(pTransmit->field.TxBF); + DBGPRINT_RAW(RT_DEBUG_TRACE,("ETxBF in AP_AMPDU_Frame_Tx(): invert eTxBF\n")); + } else + pTxWI->eTxBF = pTransmit->field.TxBF; +// #endif + +// DBGPRINT(RT_DEBUG_TRACE, ("ETxBF in RTMPWriteTxWI_Cache(): pMacEntry->mrqCnt=%d, pMacEntry->toTxMrq=%d, pTransmit->field.TxBF=%d, pTxWI->eTxBF=%d\n", pMacEntry->mrqCnt, pMacEntry->toTxMrq, pTransmit->field.TxBF,pTxWI->eTxBF)); + pTxWI->iTxBF = 0; + } +#endif // RT2883_TEMP_PATCH // + + pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; + + +} + + +// should be called only when - +// 1. MEADIA_CONNECTED +// 2. AGGREGATION_IN_USED +// 3. Fragmentation not in used +// 4. either no previous frame (pPrevAddr1=NULL) .OR. previoud frame is aggregatible +BOOLEAN TxFrameIsAggregatible( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pPrevAddr1, + IN PUCHAR p8023hdr) +{ + + // can't aggregate EAPOL (802.1x) frame + if ((p8023hdr[12] == 0x88) && (p8023hdr[13] == 0x8e)) + return FALSE; + + // can't aggregate multicast/broadcast frame + if (p8023hdr[0] & 0x01) + return FALSE; + + if (INFRA_ON(pAd)) // must be unicast to AP + return TRUE; + else if ((pPrevAddr1 == NULL) || MAC_ADDR_EQUAL(pPrevAddr1, p8023hdr)) // unicast to same STA + return TRUE; + else + return FALSE; +} + + +/* + ======================================================================== + + Routine Description: + Check the MSDU Aggregation policy + 1.HT aggregation is A-MSDU + 2.legaacy rate aggregation is software aggregation by Ralink. + + Arguments: + + Return Value: + + Note: + + ======================================================================== +*/ +BOOLEAN PeerIsAggreOn( + IN PRTMP_ADAPTER pAd, + IN ULONG TxRate, + IN PMAC_TABLE_ENTRY pMacEntry) +{ + ULONG AFlags = (fCLIENT_STATUS_AMSDU_INUSED | fCLIENT_STATUS_AGGREGATION_CAPABLE); + + if (pMacEntry != NULL && CLIENT_STATUS_TEST_FLAG(pMacEntry, AFlags)) + { +#ifdef DOT11_N_SUPPORT + if (pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX) + { + return TRUE; + } +#endif // DOT11_N_SUPPORT // + +#ifdef AGGREGATION_SUPPORT + if (TxRate >= RATE_6 && pAd->CommonCfg.bAggregationCapable && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE)))) + { // legacy Ralink Aggregation support + return TRUE; + } +#endif // AGGREGATION_SUPPORT // + } + + return FALSE; + +} + + +/* + ======================================================================== + + Routine Description: + Check and fine the packet waiting in SW queue with highest priority + + Arguments: + pAd Pointer to our adapter + + Return Value: + pQueue Pointer to Waiting Queue + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +PQUEUE_HEADER RTMPCheckTxSwQueue( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pQueIdx) +{ + + ULONG Number; + // 2004-11-15 to be removed. test aggregation only +// if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)) && (*pNumber < 2)) +// return NULL; + + Number = pAd->TxSwQueue[QID_AC_BK].Number + + pAd->TxSwQueue[QID_AC_BE].Number + + pAd->TxSwQueue[QID_AC_VI].Number + + pAd->TxSwQueue[QID_AC_VO].Number + + pAd->TxSwQueue[QID_HCCA].Number; + + if (pAd->TxSwQueue[QID_AC_VO].Head != NULL) + { + *pQueIdx = QID_AC_VO; + return (&pAd->TxSwQueue[QID_AC_VO]); + } + else if (pAd->TxSwQueue[QID_AC_VI].Head != NULL) + { + *pQueIdx = QID_AC_VI; + return (&pAd->TxSwQueue[QID_AC_VI]); + } + else if (pAd->TxSwQueue[QID_AC_BE].Head != NULL) + { + *pQueIdx = QID_AC_BE; + return (&pAd->TxSwQueue[QID_AC_BE]); + } + else if (pAd->TxSwQueue[QID_AC_BK].Head != NULL) + { + *pQueIdx = QID_AC_BK; + return (&pAd->TxSwQueue[QID_AC_BK]); + } + else if (pAd->TxSwQueue[QID_HCCA].Head != NULL) + { + *pQueIdx = QID_HCCA; + return (&pAd->TxSwQueue[QID_HCCA]); + } + + // No packet pending in Tx Sw queue + *pQueIdx = QID_AC_BK; + + return (NULL); +} + + +/* + ======================================================================== + + Routine Description: + Suspend MSDU transmission + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID RTMPSuspendMsduTransmission( + IN PRTMP_ADAPTER pAd) +{ + DBGPRINT(RT_DEBUG_TRACE,("SCANNING, suspend MSDU transmission ...\n")); + + + // + // Before BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and + // use Lowbound as R66 value on ScanNextChannel(...) + // + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue); + + // set BBP_R66 to 0x30/0x40 when scanning (AsicSwitchChannel will set R66 according to channel when scanning) + //RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x26 + GET_LNA_GAIN(pAd))); + RTMPSetAGCInitValue(pAd, BW_20); + + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); + //RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x000f0000); // abort all TX rings +} + + +/* + ======================================================================== + + Routine Description: + Resume MSDU transmission + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPResumeMsduTransmission( + IN PRTMP_ADAPTER pAd) +{ +// UCHAR IrqState; + + DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n")); + + + // After finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value + // R66 should not be 0 + if (pAd->BbpTuning.R66CurrentValue == 0) + { + pAd->BbpTuning.R66CurrentValue = 0x38; + DBGPRINT_ERR(("RTMPResumeMsduTransmission, R66CurrentValue=0...\n")); + } + +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, pAd->BbpTuning.R66CurrentValue); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue); + + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); +// sample, for IRQ LOCK to SEM LOCK +// IrqState = pAd->irq_disabled; +// if (IrqState) +// RTMPDeQueuePacket(pAd, TRUE, NUM_OF_TX_RING, MAX_TX_PROCESS); +// else + RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); +} + + +UINT deaggregate_AMSDU_announce( + IN PRTMP_ADAPTER pAd, + PNDIS_PACKET pPacket, + IN PUCHAR pData, + IN ULONG DataSize) +{ + USHORT PayloadSize; + USHORT SubFrameSize; + PHEADER_802_3 pAMSDUsubheader; + UINT nMSDU; + UCHAR Header802_3[14]; + + PUCHAR pPayload, pDA, pSA, pRemovedLLCSNAP; + PNDIS_PACKET pClonePacket; + + + + nMSDU = 0; + + while (DataSize > LENGTH_802_3) + { + + nMSDU++; + + //hex_dump("subheader", pData, 64); + pAMSDUsubheader = (PHEADER_802_3)pData; + //pData += LENGTH_802_3; + PayloadSize = pAMSDUsubheader->Octet[1] + (pAMSDUsubheader->Octet[0]<<8); + SubFrameSize = PayloadSize + LENGTH_802_3; + + + if ((DataSize < SubFrameSize) || (PayloadSize > 1518 )) + { + break; + } + + //DBGPRINT(RT_DEBUG_TRACE,("%d subframe: Size = %d\n", nMSDU, PayloadSize)); + + pPayload = pData + LENGTH_802_3; + pDA = pData; + pSA = pData + MAC_ADDR_LEN; + + // convert to 802.3 header + CONVERT_TO_802_3(Header802_3, pDA, pSA, pPayload, PayloadSize, pRemovedLLCSNAP); + +#ifdef CONFIG_STA_SUPPORT + if ((Header802_3[12] == 0x88) && (Header802_3[13] == 0x8E) ) + { + /* avoid local heap overflow, use dyanamic allocation */ + MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); + if (Elem != NULL) + { + memmove(Elem->Msg+(LENGTH_802_11 + LENGTH_802_1_H), pPayload, PayloadSize); + Elem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + PayloadSize; + //WpaEAPOLKeyAction(pAd, Elem); + REPORT_MGMT_FRAME_TO_MLME(pAd, BSSID_WCID, Elem->Msg, Elem->MsgLen, 0, 0, 0, 0); + kfree(Elem); + } + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (pRemovedLLCSNAP) + { + pPayload -= LENGTH_802_3; + PayloadSize += LENGTH_802_3; + NdisMoveMemory(pPayload, &Header802_3[0], LENGTH_802_3); + } + } +#endif // CONFIG_STA_SUPPORT // + + pClonePacket = ClonePacket(pAd, pPacket, pPayload, PayloadSize); + if (pClonePacket) + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket)); +#endif // CONFIG_STA_SUPPORT // + } + + + // A-MSDU has padding to multiple of 4 including subframe header. + // align SubFrameSize up to multiple of 4 + SubFrameSize = (SubFrameSize+3)&(~0x3); + + + if (SubFrameSize > 1528 || SubFrameSize < 32) + { + break; + } + + if (DataSize > SubFrameSize) + { + pData += SubFrameSize; + DataSize -= SubFrameSize; + } + else + { + // end of A-MSDU + DataSize = 0; + } + } + + // finally release original rx packet + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + + return nMSDU; +} + + +UINT BA_Reorder_AMSDU_Annnounce( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket) +{ + PUCHAR pData; + USHORT DataSize; + UINT nMSDU = 0; + + pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket); + DataSize = (USHORT) GET_OS_PKT_LEN(pPacket); + + nMSDU = deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize); + + return nMSDU; +} + + +/* + ========================================================================== + Description: + Look up the MAC address in the MAC table. Return NULL if not found. + Return: + pEntry - pointer to the MAC entry; NULL is not found + ========================================================================== +*/ +MAC_TABLE_ENTRY *MacTableLookup( + IN PRTMP_ADAPTER pAd, + PUCHAR pAddr) +{ + ULONG HashIdx; + MAC_TABLE_ENTRY *pEntry = NULL; + + HashIdx = MAC_ADDR_HASH_INDEX(pAddr); + pEntry = pAd->MacTab.Hash[HashIdx]; + + while (pEntry && !IS_ENTRY_NONE(pEntry)) + { + if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) + { + break; + } + else + pEntry = pEntry->pNext; + } + + return pEntry; +} + +MAC_TABLE_ENTRY *MacTableInsertEntry( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN UCHAR apidx, + IN BOOLEAN CleanAll) +{ + UCHAR HashIdx; + int i, FirstWcid; + MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry; +// USHORT offset; +// ULONG addr; + + // if FULL, return + if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) + return NULL; + + FirstWcid = 1; +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + if (pAd->StaCfg.BssType == BSS_INFRA) + FirstWcid = 2; +#endif // CONFIG_STA_SUPPORT // + + // allocate one MAC entry + NdisAcquireSpinLock(&pAd->MacTabLock); + for (i = FirstWcid; i< MAX_LEN_OF_MAC_TABLE; i++) // skip entry#0 so that "entry index == AID" for fast lookup + { + // pick up the first available vacancy + if (IS_ENTRY_NONE(&pAd->MacTab.Content[i])) + { + pEntry = &pAd->MacTab.Content[i]; + if (CleanAll == TRUE) + { + pEntry->MaxSupportedRate = RATE_11; + pEntry->CurrTxRate = RATE_11; + NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); + pEntry->PairwiseKey.KeyLen = 0; + pEntry->PairwiseKey.CipherAlg = CIPHER_NONE; + } +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT + if (apidx >= MIN_NET_DEVICE_FOR_DLS) + { + SET_ENTRY_DLS(pEntry); + pEntry->isCached = FALSE; + } + else +#endif // QOS_DLS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + SET_ENTRY_CLIENT(pEntry); + } +#endif // CONFIG_STA_SUPPORT // + } + + pEntry->bIAmBadAtheros = FALSE; + pEntry->pAd = pAd; + pEntry->CMTimerRunning = FALSE; + pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE; + pEntry->RSNIE_Len = 0; + NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter)); + pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR; + + if (IS_ENTRY_MESH(pEntry)) + pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_MESH); + else if (IS_ENTRY_APCLI(pEntry)) + pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_APCLI); + else if (IS_ENTRY_WDS(pEntry)) + pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_WDS); +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT + else if (IS_ENTRY_DLS(pEntry)) + pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_DLS); +#endif // QOS_DLS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + else + pEntry->apidx = apidx; + + + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pEntry->AuthMode = pAd->StaCfg.AuthMode; + pEntry->WepStatus = pAd->StaCfg.WepStatus; + pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; + } +#endif // CONFIG_STA_SUPPORT // + } + + pEntry->GTKState = REKEY_NEGOTIATING; + pEntry->PairwiseKey.KeyLen = 0; + pEntry->PairwiseKey.CipherAlg = CIPHER_NONE; +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT + if (IS_ENTRY_DLS(pEntry)) + pEntry->PortSecured = WPA_802_1X_PORT_SECURED; + else +#endif //QOS_DLS_SUPPORT +#endif // CONFIG_STA_SUPPORT // + pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; + + pEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND; + COPY_MAC_ADDR(pEntry->Addr, pAddr); + pEntry->Sst = SST_NOT_AUTH; + pEntry->AuthState = AS_NOT_AUTH; + pEntry->Aid = (USHORT)i; //0; + pEntry->CapabilityInfo = 0; + pEntry->PsMode = PWR_ACTIVE; + pEntry->PsQIdleCount = 0; + pEntry->NoDataIdleCount = 0; + pEntry->AssocDeadLine = MAC_TABLE_ASSOC_TIMEOUT; + pEntry->ContinueTxFailCnt = 0; +#ifdef WDS_SUPPORT + pEntry->LockEntryTx = FALSE; + pEntry->TimeStamp_toTxRing = 0; +#endif // WDS_SUPPORT // + InitializeQueueHeader(&pEntry->PsQueue); + + + pAd->MacTab.Size ++; + + /* Set the security mode of this entry as OPEN-NONE in ASIC */ + RTMP_REMOVE_PAIRWISE_KEY_ENTRY(pAd, (UCHAR)i); + + /* Add this entry into ASIC RX WCID search table */ + RTMP_STA_ENTRY_ADD(pAd, pEntry); + + + +#ifdef RT2883_TEMP_PATCH + NdisAllocateSpinLock(&pEntry->TxSndgLock); +#endif // RT2883_TEMP_PATCH // + + DBGPRINT(RT_DEBUG_TRACE, ("MacTableInsertEntry - allocate entry #%d, Total= %d\n",i, pAd->MacTab.Size)); + break; + } + } + + // add this MAC entry into HASH table + if (pEntry) + { + HashIdx = MAC_ADDR_HASH_INDEX(pAddr); + if (pAd->MacTab.Hash[HashIdx] == NULL) + { + pAd->MacTab.Hash[HashIdx] = pEntry; + } + else + { + pCurrEntry = pAd->MacTab.Hash[HashIdx]; + while (pCurrEntry->pNext != NULL) + pCurrEntry = pCurrEntry->pNext; + pCurrEntry->pNext = pEntry; + } + } + + NdisReleaseSpinLock(&pAd->MacTabLock); + return pEntry; +} + +/* + ========================================================================== + Description: + Delete a specified client from MAC table + ========================================================================== + */ +BOOLEAN MacTableDeleteEntry( + IN PRTMP_ADAPTER pAd, + IN USHORT wcid, + IN PUCHAR pAddr) +{ + USHORT HashIdx; + MAC_TABLE_ENTRY *pEntry, *pPrevEntry, *pProbeEntry; + BOOLEAN Cancelled; + //USHORT offset; // unused variable + //UCHAR j; // unused variable + + if (wcid >= MAX_LEN_OF_MAC_TABLE) + return FALSE; + + NdisAcquireSpinLock(&pAd->MacTabLock); + + HashIdx = MAC_ADDR_HASH_INDEX(pAddr); + //pEntry = pAd->MacTab.Hash[HashIdx]; + pEntry = &pAd->MacTab.Content[wcid]; + + if (pEntry && !IS_ENTRY_NONE(pEntry)) + { + if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) + { + + // Delete this entry from ASIC on-chip WCID Table + RTMP_STA_ENTRY_MAC_RESET(pAd, wcid); + +#ifdef DOT11_N_SUPPORT + // free resources of BA + BASessionTearDownALL(pAd, pEntry->Aid); +#endif // DOT11_N_SUPPORT // + + + pPrevEntry = NULL; + pProbeEntry = pAd->MacTab.Hash[HashIdx]; + ASSERT(pProbeEntry); + + // update Hash list + do + { + if (pProbeEntry == pEntry) + { + if (pPrevEntry == NULL) + { + pAd->MacTab.Hash[HashIdx] = pEntry->pNext; + } + else + { + pPrevEntry->pNext = pEntry->pNext; + } + break; + } + + pPrevEntry = pProbeEntry; + pProbeEntry = pProbeEntry->pNext; + } while (pProbeEntry); + + // not found !!! + ASSERT(pProbeEntry != NULL); + + //RTMP_REMOVE_PAIRWISE_KEY_ENTRY(pAd, wcid); + + + if (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE) + { + RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled); + pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE; + } + + NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); + pAd->MacTab.Size --; +#ifdef RT2883_TEMP_PATCH + NdisFreeSpinLock(&pEntry->TxSndgLock); +#endif // RT2883_TEMP_PATCH // + DBGPRINT(RT_DEBUG_TRACE, ("MacTableDeleteEntry1 - Total= %d\n", pAd->MacTab.Size)); + } + else + { + DBGPRINT(RT_DEBUG_OFF, ("\n%s: Impossible Wcid = %d !!!!!\n", __FUNCTION__, wcid)); + } + } + + NdisReleaseSpinLock(&pAd->MacTabLock); + + //Reset operating mode when no Sta. + if (pAd->MacTab.Size == 0) + { +#ifdef DOT11_N_SUPPORT + pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode = 0; +#endif // DOT11_N_SUPPORT // + //AsicUpdateProtect(pAd, 0 /*pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode*/, (ALLN_SETPROTECT), TRUE, 0 /*pAd->MacTab.fAnyStationNonGF*/); + RTMP_UPDATE_PROTECT(pAd); // edit by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet + } + + return TRUE; +} + + +/* + ========================================================================== + Description: + This routine reset the entire MAC table. All packets pending in + the power-saving queues are freed here. + ========================================================================== + */ +VOID MacTableReset( + IN PRTMP_ADAPTER pAd) +{ + int i; + + DBGPRINT(RT_DEBUG_TRACE, ("MacTableReset\n")); + //NdisAcquireSpinLock(&pAd->MacTabLock); + + + for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++) + { + if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i])) + { + /* Delete a entry via WCID */ + MacTableDeleteEntry(pAd, i, pAd->MacTab.Content[i].Addr); + + } + } + + return; +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID AssocParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq, + IN PUCHAR pAddr, + IN USHORT CapabilityInfo, + IN ULONG Timeout, + IN USHORT ListenIntv) +{ + COPY_MAC_ADDR(AssocReq->Addr, pAddr); + // Add mask to support 802.11b mode only + AssocReq->CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; // not cf-pollable, not cf-poll-request + AssocReq->Timeout = Timeout; + AssocReq->ListenIntv = ListenIntv; +} + + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID DisassocParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq, + IN PUCHAR pAddr, + IN USHORT Reason) +{ + COPY_MAC_ADDR(DisassocReq->Addr, pAddr); + DisassocReq->Reason = Reason; +} + + +/* + ======================================================================== + + Routine Description: + Check the out going frame, if this is an DHCP or ARP datagram + will be duplicate another frame at low data rate transmit. + + Arguments: + pAd Pointer to our adapter + pPacket Pointer to outgoing Ndis frame + + Return Value: + TRUE To be duplicate at Low data rate transmit. (1mb) + FALSE Do nothing. + + IRQL = DISPATCH_LEVEL + + Note: + + MAC header + IP Header + UDP Header + 14 Bytes 20 Bytes + + UDP Header + 00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15| + Source Port + 16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31| + Destination Port + + port 0x43 means Bootstrap Protocol, server. + Port 0x44 means Bootstrap Protocol, client. + + ======================================================================== +*/ + +BOOLEAN RTMPCheckDHCPFrame( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket) +{ + PACKET_INFO PacketInfo; + ULONG NumberOfBytesRead = 0; + ULONG CurrentOffset = 0; + PVOID pVirtualAddress = NULL; + UINT NdisBufferLength; + PUCHAR pSrc; + USHORT Protocol; + UCHAR ByteOffset36 = 0; + UCHAR ByteOffset38 = 0; + BOOLEAN ReadFirstParm = TRUE; + + RTMP_QueryPacketInfo(pPacket, &PacketInfo, (PUCHAR *)&pVirtualAddress, &NdisBufferLength); + + NumberOfBytesRead += NdisBufferLength; + pSrc = (PUCHAR) pVirtualAddress; + Protocol = *(pSrc + 12) * 256 + *(pSrc + 13); + + // + // Check DHCP & BOOTP protocol + // + while (NumberOfBytesRead <= PacketInfo.TotalPacketLength) + { + if ((NumberOfBytesRead >= 35) && (ReadFirstParm == TRUE)) + { + CurrentOffset = 35 - (NumberOfBytesRead - NdisBufferLength); + ByteOffset36 = *(pSrc + CurrentOffset); + ReadFirstParm = FALSE; + } + + if (NumberOfBytesRead >= 37) + { + CurrentOffset = 37 - (NumberOfBytesRead - NdisBufferLength); + ByteOffset38 = *(pSrc + CurrentOffset); + //End of Read + break; + } + return FALSE; + } + + // Check for DHCP & BOOTP protocol + if ((ByteOffset36 != 0x44) || (ByteOffset38 != 0x43)) + { + // + // 2054 (hex 0806) for ARP datagrams + // if this packet is not ARP datagrams, then do nothing + // ARP datagrams will also be duplicate at 1mb broadcast frames + // + if (Protocol != 0x0806 ) + return FALSE; + } + + return TRUE; +} + + +BOOLEAN RTMPCheckEtherType( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PMAC_TABLE_ENTRY pMacEntry, + OUT PUCHAR pUserPriority, + OUT PUCHAR pQueIdx) +{ + USHORT TypeLen; + UCHAR Byte0, Byte1; + PUCHAR pSrcBuf; + UINT32 pktLen; + UINT16 srcPort, dstPort; + BOOLEAN bWmmReq; + + + bWmmReq = ( + OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)) + && ((pMacEntry) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE)); + + pSrcBuf = GET_OS_PKT_DATAPTR(pPacket); + pktLen = GET_OS_PKT_LEN(pPacket); + + ASSERT(pSrcBuf); + + RTMP_SET_PACKET_SPECIFIC(pPacket, 0); + + // get Ethernet protocol field + TypeLen = (pSrcBuf[12] << 8) | pSrcBuf[13]; + + pSrcBuf += LENGTH_802_3; // Skip the Ethernet Header. + + if (TypeLen <= 1500) + { // 802.3, 802.3 LLC + /* + DestMAC(6) + SrcMAC(6) + Lenght(2) + + DSAP(1) + SSAP(1) + Control(1) + + if the DSAP = 0xAA, SSAP=0xAA, Contorl = 0x03, it has a 5-bytes SNAP header. + => + SNAP (5, OriginationID(3) + etherType(2)) + */ + if (pSrcBuf[0] == 0xAA && pSrcBuf[1] == 0xAA && pSrcBuf[2] == 0x03) + { + Sniff2BytesFromNdisBuffer((PNDIS_BUFFER)pSrcBuf, 6, &Byte0, &Byte1); + RTMP_SET_PACKET_LLCSNAP(pPacket, 1); + TypeLen = (USHORT)((Byte0 << 8) + Byte1); + pSrcBuf += 8; // Skip this LLC/SNAP header + } + else + { + //It just has 3-byte LLC header, maybe a legacy ether type frame. we didn't handle it. + } + } + + // If it's a VLAN packet, get the real Type/Length field. + if (TypeLen == 0x8100) + { + /* 0x8100 means VLAN packets */ + + /* Dest. MAC Address (6-bytes) + + Source MAC Address (6-bytes) + + Length/Type = 802.1Q Tag Type (2-byte) + + Tag Control Information (2-bytes) + + Length / Type (2-bytes) + + data payload (0-n bytes) + + Pad (0-p bytes) + + Frame Check Sequence (4-bytes) */ + + + RTMP_SET_PACKET_VLAN(pPacket, 1); + Sniff2BytesFromNdisBuffer((PNDIS_BUFFER)pSrcBuf, 2, &Byte0, &Byte1); + TypeLen = (USHORT)((Byte0 << 8) + Byte1); + + /* only use VLAN tag */ + if (bWmmReq) + { + *pUserPriority = (*(pSrcBuf + 1) & 0xe0) >> 5; + *pQueIdx = MapUserPriorityToAccessCategory[*pUserPriority]; + } + + pSrcBuf += 4; // Skip the VLAN Header. + } + else if (TypeLen == 0x0800) + { + if (bWmmReq) + { + *pUserPriority = (*(pSrcBuf + 1) & 0xe0) >> 5; + *pQueIdx = MapUserPriorityToAccessCategory[*pUserPriority]; + } + } + + switch (TypeLen) + { + case 0x0800: + { + // return AC_BE if packet is not IPv4 + if (bWmmReq && (*pSrcBuf & 0xf0) != 0x40) + { + *pUserPriority = 0; + *pQueIdx = QID_AC_BE; + } + else + RTMP_SET_PACKET_IPV4(pPacket, 1); + + ASSERT((pktLen > 34)); + if (*(pSrcBuf + 9) == 0x11) + { // udp packet + ASSERT((pktLen > 34)); // 14 for ethernet header, 20 for IP header + + pSrcBuf += 20; // Skip the IP header + srcPort = OS_NTOHS(get_unaligned((PUINT16)(pSrcBuf))); + dstPort = OS_NTOHS(get_unaligned((PUINT16)(pSrcBuf+2))); + + if ((srcPort==0x44 && dstPort==0x43) || (srcPort==0x43 && dstPort==0x44)) + { //It's a BOOTP/DHCP packet + RTMP_SET_PACKET_DHCP(pPacket, 1); + } + } + } + break; + case 0x0806: + { + //ARP Packet. + RTMP_SET_PACKET_DHCP(pPacket, 1); + } + break; + case 0x888e: + { + // EAPOL Packet. + RTMP_SET_PACKET_EAPOL(pPacket, 1); + } + break; + default: + break; + } + +#ifdef VENDOR_FEATURE1_SUPPORT + RTMP_SET_PACKET_PROTOCOL(pPacket, TypeLen); +#endif // VENDOR_FEATURE1_SUPPORT // + + // have to check ACM bit. downgrade UP & QueIdx before passing ACM + // NOTE: AP doesn't have to negotiate TSPEC. ACM is controlled purely via user setup, not protocol handshaking + /* + Under WMM ACM control, we dont need to check the bit; + Or when a TSPEC is built for VO but we will change priority to + BE here and when we issue a BA session, the BA session will + be BE session, not VO session. + */ + if (pAd->CommonCfg.APEdcaParm.bACM[*pQueIdx]) + { + *pUserPriority = 0; + *pQueIdx = QID_AC_BE; + } + + return TRUE; + +} + + + +VOID Update_Rssi_Sample( + IN PRTMP_ADAPTER pAd, + IN RSSI_SAMPLE *pRssi, + IN PRXWI_STRUC pRxWI) + { + CHAR rssi0 = pRxWI->RSSI0; + CHAR rssi1 = pRxWI->RSSI1; + CHAR rssi2 = pRxWI->RSSI2; + + if (rssi0 != 0) + { + pRssi->LastRssi0 = ConvertToRssi(pAd, (CHAR)rssi0, RSSI_0); + pRssi->AvgRssi0X8 = (pRssi->AvgRssi0X8 - pRssi->AvgRssi0) + pRssi->LastRssi0; + pRssi->AvgRssi0 = pRssi->AvgRssi0X8 >> 3; + } + + if (rssi1 != 0) + { + pRssi->LastRssi1 = ConvertToRssi(pAd, (CHAR)rssi1, RSSI_1); + pRssi->AvgRssi1X8 = (pRssi->AvgRssi1X8 - pRssi->AvgRssi1) + pRssi->LastRssi1; + pRssi->AvgRssi1 = pRssi->AvgRssi1X8 >> 3; + } + + if (rssi2 != 0) + { + pRssi->LastRssi2 = ConvertToRssi(pAd, (CHAR)rssi2, RSSI_2); + pRssi->AvgRssi2X8 = (pRssi->AvgRssi2X8 - pRssi->AvgRssi2) + pRssi->LastRssi2; + pRssi->AvgRssi2 = pRssi->AvgRssi2X8 >> 3; + } +} + + + +// Normal legacy Rx packet indication +VOID Indicate_Legacy_Packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; + UCHAR Header802_3[LENGTH_802_3]; + + // 1. get 802.3 Header + // 2. remove LLC + // a. pointer pRxBlk->pData to payload + // b. modify pRxBlk->DataSize +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3); +#endif // CONFIG_STA_SUPPORT // + + if (pRxBlk->DataSize > MAX_RX_PKT_LEN) + { + + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + + STATS_INC_RX_PACKETS(pAd, FromWhichBSSID); + + + wlan_802_11_to_802_3_packet(pAd, pRxBlk, Header802_3, FromWhichBSSID, TPID); + + // + // pass this 802.3 packet to upper layer or forward this packet to WM directly + // +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxPacket, FromWhichBSSID); +#endif // CONFIG_STA_SUPPORT // + +} + + +// Normal, AMPDU or AMSDU +VOID CmmRxnonRalinkFrameIndicate( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ +#ifdef DOT11_N_SUPPORT + if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0)) + { + Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID); + } + else +#endif // DOT11_N_SUPPORT // + { +#ifdef DOT11_N_SUPPORT + if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU)) + { + // handle A-MSDU + Indicate_AMSDU_Packet(pAd, pRxBlk, FromWhichBSSID); + } + else +#endif // DOT11_N_SUPPORT // + { + Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID); + } + } +} + + +VOID CmmRxRalinkFrameIndicate( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + UCHAR Header802_3[LENGTH_802_3]; + UINT16 Msdu2Size; + UINT16 Payload1Size, Payload2Size; + PUCHAR pData2; + PNDIS_PACKET pPacket2 = NULL; + + + + Msdu2Size = *(pRxBlk->pData) + (*(pRxBlk->pData+1) << 8); + + if ((Msdu2Size <= 1536) && (Msdu2Size < pRxBlk->DataSize)) + { + /* skip two byte MSDU2 len */ + pRxBlk->pData += 2; + pRxBlk->DataSize -= 2; + } + else + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + // get 802.3 Header and remove LLC +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(pRxBlk, Header802_3); +#endif // CONFIG_STA_SUPPORT // + + + ASSERT(pRxBlk->pRxPacket); + + // Ralink Aggregation frame + pAd->RalinkCounters.OneSecRxAggregationCount ++; + Payload1Size = pRxBlk->DataSize - Msdu2Size; + Payload2Size = Msdu2Size - LENGTH_802_3; + + pData2 = pRxBlk->pData + Payload1Size + LENGTH_802_3; +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + pPacket2 = duplicate_pkt(pAd, (pData2-LENGTH_802_3), LENGTH_802_3, pData2, Payload2Size, FromWhichBSSID); +#endif // CONFIG_STA_SUPPORT // + + if (!pPacket2) + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + // update payload size of 1st packet + pRxBlk->DataSize = Payload1Size; + wlan_802_11_to_802_3_packet(pAd, pRxBlk, Header802_3, FromWhichBSSID, TPID); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pRxBlk->pRxPacket, FromWhichBSSID); +#endif // CONFIG_STA_SUPPORT // + + if (pPacket2) + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pPacket2, FromWhichBSSID); +#endif // CONFIG_STA_SUPPORT // + } +} + + +#define RESET_FRAGFRAME(_fragFrame) \ + { \ + _fragFrame.RxSize = 0; \ + _fragFrame.Sequence = 0; \ + _fragFrame.LastFrag = 0; \ + _fragFrame.Flags = 0; \ + } + + +PNDIS_PACKET RTMPDeFragmentDataFrame( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk) +{ + PHEADER_802_11 pHeader = pRxBlk->pHeader; + PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; + UCHAR *pData = pRxBlk->pData; + USHORT DataSize = pRxBlk->DataSize; + PNDIS_PACKET pRetPacket = NULL; + UCHAR *pFragBuffer = NULL; + BOOLEAN bReassDone = FALSE; + UCHAR HeaderRoom = 0; + + + ASSERT(pHeader); + + HeaderRoom = pData - (UCHAR *)pHeader; + + // Re-assemble the fragmented packets + if (pHeader->Frag == 0) // Frag. Number is 0 : First frag or only one pkt + { + // the first pkt of fragment, record it. + if (pHeader->FC.MoreFrag) + { + ASSERT(pAd->FragFrame.pFragPacket); + pFragBuffer = GET_OS_PKT_DATAPTR(pAd->FragFrame.pFragPacket); + pAd->FragFrame.RxSize = DataSize + HeaderRoom; + NdisMoveMemory(pFragBuffer, pHeader, pAd->FragFrame.RxSize); + pAd->FragFrame.Sequence = pHeader->Sequence; + pAd->FragFrame.LastFrag = pHeader->Frag; // Should be 0 + ASSERT(pAd->FragFrame.LastFrag == 0); + goto done; // end of processing this frame + } + } + else //Middle & End of fragment + { + if ((pHeader->Sequence != pAd->FragFrame.Sequence) || + (pHeader->Frag != (pAd->FragFrame.LastFrag + 1))) + { + // Fragment is not the same sequence or out of fragment number order + // Reset Fragment control blk + RESET_FRAGFRAME(pAd->FragFrame); + DBGPRINT(RT_DEBUG_ERROR, ("Fragment is not the same sequence or out of fragment number order.\n")); + goto done; // give up this frame + } + else if ((pAd->FragFrame.RxSize + DataSize) > MAX_FRAME_SIZE) + { + // Fragment frame is too large, it exeeds the maximum frame size. + // Reset Fragment control blk + RESET_FRAGFRAME(pAd->FragFrame); + DBGPRINT(RT_DEBUG_ERROR, ("Fragment frame is too large, it exeeds the maximum frame size.\n")); + goto done; // give up this frame + } + + // + // Broadcom AP(BCM94704AGR) will send out LLC in fragment's packet, LLC only can accpet at first fragment. + // In this case, we will dropt it. + // + if (NdisEqualMemory(pData, SNAP_802_1H, sizeof(SNAP_802_1H))) + { + DBGPRINT(RT_DEBUG_ERROR, ("Find another LLC at Middle or End fragment(SN=%d, Frag=%d)\n", pHeader->Sequence, pHeader->Frag)); + goto done; // give up this frame + } + + pFragBuffer = GET_OS_PKT_DATAPTR(pAd->FragFrame.pFragPacket); + + // concatenate this fragment into the re-assembly buffer + NdisMoveMemory((pFragBuffer + pAd->FragFrame.RxSize), pData, DataSize); + pAd->FragFrame.RxSize += DataSize; + pAd->FragFrame.LastFrag = pHeader->Frag; // Update fragment number + + // Last fragment + if (pHeader->FC.MoreFrag == FALSE) + { + bReassDone = TRUE; + } + } + +done: + // always release rx fragmented packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + + // return defragmented packet if packet is reassembled completely + // otherwise return NULL + if (bReassDone) + { + PNDIS_PACKET pNewFragPacket; + + // allocate a new packet buffer for fragment + pNewFragPacket = RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE); + if (pNewFragPacket) + { + // update RxBlk + pRetPacket = pAd->FragFrame.pFragPacket; + pAd->FragFrame.pFragPacket = pNewFragPacket; + pRxBlk->pHeader = (PHEADER_802_11) GET_OS_PKT_DATAPTR(pRetPacket); + pRxBlk->pData = (UCHAR *)pRxBlk->pHeader + HeaderRoom; + pRxBlk->DataSize = pAd->FragFrame.RxSize - HeaderRoom; + pRxBlk->pRxPacket = pRetPacket; + } + else + { + RESET_FRAGFRAME(pAd->FragFrame); + } + } + + return pRetPacket; +} + + +VOID Indicate_AMSDU_Packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + UINT nMSDU; + + update_os_packet_info(pAd, pRxBlk, FromWhichBSSID); + RTMP_SET_PACKET_IF(pRxBlk->pRxPacket, FromWhichBSSID); + nMSDU = deaggregate_AMSDU_announce(pAd, pRxBlk->pRxPacket, pRxBlk->pData, pRxBlk->DataSize); +} + +VOID Indicate_EAPOL_Packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + MAC_TABLE_ENTRY *pEntry = NULL; + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pEntry = &pAd->MacTab.Content[BSSID_WCID]; + STARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID); + return; + } +#endif // CONFIG_STA_SUPPORT // + + if (pEntry == NULL) + { + DBGPRINT(RT_DEBUG_WARN, ("Indicate_EAPOL_Packet: drop and release the invalid packet.\n")); + // release packet + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + } +} + +#define BCN_TBTT_OFFSET 64 //defer 64 us +VOID ReSyncBeaconTime( + IN PRTMP_ADAPTER pAd) +{ + + UINT32 Offset; + + + Offset = (pAd->TbttTickCount) % (BCN_TBTT_OFFSET); + + pAd->TbttTickCount++; + + // + // The updated BeaconInterval Value will affect Beacon Interval after two TBTT + // beacasue the original BeaconInterval had been loaded into next TBTT_TIMER + // + if (Offset == (BCN_TBTT_OFFSET-2)) + { + BCN_TIME_CFG_STRUC csr; + RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word); + csr.field.BeaconInterval = (pAd->CommonCfg.BeaconPeriod << 4) - 1 ; // ASIC register in units of 1/16 TU = 64us + RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word); + } + else + { + if (Offset == (BCN_TBTT_OFFSET-1)) + { + BCN_TIME_CFG_STRUC csr; + + RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word); + csr.field.BeaconInterval = (pAd->CommonCfg.BeaconPeriod) << 4; // ASIC register in units of 1/16 TU + RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word); + } + } +} + +#ifdef SOFT_ENCRYPT +BOOLEAN RTMPExpandPacketForSwEncrypt( + IN PRTMP_ADAPTER pAd, + IN PTX_BLK pTxBlk) +{ + PACKET_INFO PacketInfo; + UINT32 ex_head = 0, ex_tail = 0; + UCHAR NumberOfFrag = RTMP_GET_PACKET_FRAGMENTS(pTxBlk->pPacket); + + if (pTxBlk->CipherAlg == CIPHER_AES) + ex_tail = LEN_CCMP_MIC; + + ex_tail = (NumberOfFrag * ex_tail); + + pTxBlk->pPacket = ExpandPacket(pAd, pTxBlk->pPacket, ex_head, ex_tail); + if (pTxBlk->pPacket == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: out of resource.\n", __FUNCTION__)); + return FALSE; + } + RTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen); + + return TRUE; +} + +VOID RTMPUpdateSwCacheCipherInfo( + IN PRTMP_ADAPTER pAd, + IN PTX_BLK pTxBlk, + IN PUCHAR pHdr) +{ + PHEADER_802_11 pHeader_802_11; + PMAC_TABLE_ENTRY pMacEntry; + + pHeader_802_11 = (HEADER_802_11 *) pHdr; + pMacEntry = pTxBlk->pMacEntry; + + if (pMacEntry && pHeader_802_11->FC.Wep && + CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT)) + { + PCIPHER_KEY pKey = &pMacEntry->PairwiseKey; + + TX_BLK_SET_FLAG(pTxBlk, fTX_bSwEncrypt); + + pTxBlk->CipherAlg = pKey->CipherAlg; + pTxBlk->pKey = pKey; + if ((pKey->CipherAlg == CIPHER_WEP64) || (pKey->CipherAlg == CIPHER_WEP128)) + inc_iv_byte(pKey->TxTsc, LEN_WEP_TSC, 1); + else if ((pKey->CipherAlg == CIPHER_TKIP) || (pKey->CipherAlg == CIPHER_AES)) + inc_iv_byte(pKey->TxTsc, LEN_WPA_TSC, 1); + + } + +} + +#endif // SOFT_ENCRYPT // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_data_pci.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_data_pci.c new file mode 100644 index 000000000..3233d6546 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_data_pci.c @@ -0,0 +1,1616 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_data_pci.c + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + +/* + All functions in this file must be PCI-depended, or you should out your function + in other files. + +*/ +#include "rt_config.h" + + +USHORT RtmpPCI_WriteTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN BOOLEAN bIsLast, + OUT USHORT *FreeNumber) +{ + + UCHAR *pDMAHeaderBufVA; + USHORT TxIdx, RetTxIdx; + PTXD_STRUC pTxD; + UINT32 BufBasePaLow; + PRTMP_TX_RING pTxRing; + USHORT hwHeaderLen; + + // + // get Tx Ring Resource + // + pTxRing = &pAd->TxRing[pTxBlk->QueIdx]; + TxIdx = pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx; + pDMAHeaderBufVA = (PUCHAR) pTxRing->Cell[TxIdx].DmaBuf.AllocVa; + BufBasePaLow = RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa); + + // copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer + if (pTxBlk->TxFrameType == TX_AMSDU_FRAME) + { + //hwHeaderLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_AMSDU_SUBFRAMEHEAD, 4)+LENGTH_AMSDU_SUBFRAMEHEAD; + hwHeaderLen = pTxBlk->MpduHeaderLen - LENGTH_AMSDU_SUBFRAMEHEAD + pTxBlk->HdrPadLen + LENGTH_AMSDU_SUBFRAMEHEAD; + } + else + { + //hwHeaderLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); + hwHeaderLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen; + } + NdisMoveMemory(pDMAHeaderBufVA, pTxBlk->HeaderBuf, TXINFO_SIZE + TXWI_SIZE + hwHeaderLen); + + pTxRing->Cell[TxIdx].pNdisPacket = pTxBlk->pPacket; + pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; + + // + // build Tx Descriptor + // + + pTxD = (PTXD_STRUC) pTxRing->Cell[TxIdx].AllocVa; + NdisZeroMemory(pTxD, TXD_SIZE); + + pTxD->SDPtr0 = BufBasePaLow; + pTxD->SDLen0 = TXINFO_SIZE + TXWI_SIZE + hwHeaderLen; // include padding + pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE); + pTxD->SDLen1 = pTxBlk->SrcBufLen; + pTxD->LastSec0 = 0; + pTxD->LastSec1 = (bIsLast) ? 1 : 0; + + RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA); + + RetTxIdx = TxIdx; + // + // Update Tx index + // + INC_RING_INDEX(TxIdx, TX_RING_SIZE); + pTxRing->TxCpuIdx = TxIdx; + + *FreeNumber -= 1; + + return RetTxIdx; +} + + +USHORT RtmpPCI_WriteSingleTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN BOOLEAN bIsLast, + OUT USHORT *FreeNumber) +{ + + UCHAR *pDMAHeaderBufVA; + USHORT TxIdx, RetTxIdx; + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; + TXD_STRUC TxD; +#endif + UINT32 BufBasePaLow; + PRTMP_TX_RING pTxRing; + USHORT hwHeaderLen; + + // + // get Tx Ring Resource + // + pTxRing = &pAd->TxRing[pTxBlk->QueIdx]; + TxIdx = pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx; + pDMAHeaderBufVA = (PUCHAR) pTxRing->Cell[TxIdx].DmaBuf.AllocVa; + BufBasePaLow = RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa); + + // copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer + //hwHeaderLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); + hwHeaderLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen; + + NdisMoveMemory(pDMAHeaderBufVA, pTxBlk->HeaderBuf, TXINFO_SIZE + TXWI_SIZE + hwHeaderLen); + + pTxRing->Cell[TxIdx].pNdisPacket = pTxBlk->pPacket; + pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; + + // + // build Tx Descriptor + // +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) pTxRing->Cell[TxIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC) pTxRing->Cell[TxIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; +#endif + NdisZeroMemory(pTxD, TXD_SIZE); + + pTxD->SDPtr0 = BufBasePaLow; + pTxD->SDLen0 = TXINFO_SIZE + TXWI_SIZE + hwHeaderLen; // include padding + pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE);; + pTxD->SDLen1 = pTxBlk->SrcBufLen; + pTxD->LastSec0 = 0; + pTxD->LastSec1 = (bIsLast) ? 1 : 0; + + RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA); +#ifdef RT_BIG_ENDIAN + RTMPWIEndianChange((PUCHAR)(pDMAHeaderBufVA + TXINFO_SIZE), TYPE_TXWI); + RTMPFrameEndianChange(pAd, (PUCHAR)(pDMAHeaderBufVA + TXINFO_SIZE + TXWI_SIZE), DIR_WRITE, FALSE); + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + + RetTxIdx = TxIdx; + // + // Update Tx index + // + INC_RING_INDEX(TxIdx, TX_RING_SIZE); + pTxRing->TxCpuIdx = TxIdx; + + *FreeNumber -= 1; + + return RetTxIdx; +} + + +USHORT RtmpPCI_WriteMultiTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN UCHAR frameNum, + OUT USHORT *FreeNumber) +{ + BOOLEAN bIsLast; + UCHAR *pDMAHeaderBufVA; + USHORT TxIdx, RetTxIdx; + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; + TXD_STRUC TxD; +#endif + UINT32 BufBasePaLow; + PRTMP_TX_RING pTxRing; + USHORT hwHdrLen; + UINT32 firstDMALen; + + bIsLast = ((frameNum == (pTxBlk->TotalFrameNum - 1)) ? 1 : 0); + + // + // get Tx Ring Resource + // + pTxRing = &pAd->TxRing[pTxBlk->QueIdx]; + TxIdx = pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx; + pDMAHeaderBufVA = (PUCHAR) pTxRing->Cell[TxIdx].DmaBuf.AllocVa; + BufBasePaLow = RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa); + + if (frameNum == 0) + { + // copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer + if (pTxBlk->TxFrameType == TX_AMSDU_FRAME) + //hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_AMSDU_SUBFRAMEHEAD, 4)+LENGTH_AMSDU_SUBFRAMEHEAD; + hwHdrLen = pTxBlk->MpduHeaderLen - LENGTH_AMSDU_SUBFRAMEHEAD + pTxBlk->HdrPadLen + LENGTH_AMSDU_SUBFRAMEHEAD; + else if (pTxBlk->TxFrameType == TX_RALINK_FRAME) + //hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen-LENGTH_ARALINK_HEADER_FIELD, 4)+LENGTH_ARALINK_HEADER_FIELD; + hwHdrLen = pTxBlk->MpduHeaderLen - LENGTH_ARALINK_HEADER_FIELD + pTxBlk->HdrPadLen + LENGTH_ARALINK_HEADER_FIELD; + else + //hwHdrLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); + hwHdrLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen; + + firstDMALen = TXINFO_SIZE + TXWI_SIZE + hwHdrLen; + } + else + { + firstDMALen = pTxBlk->MpduHeaderLen; + } + + NdisMoveMemory(pDMAHeaderBufVA, pTxBlk->HeaderBuf, firstDMALen); + + pTxRing->Cell[TxIdx].pNdisPacket = pTxBlk->pPacket; + pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; + + // + // build Tx Descriptor + // +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) pTxRing->Cell[TxIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC) pTxRing->Cell[TxIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; +#endif + NdisZeroMemory(pTxD, TXD_SIZE); + + pTxD->SDPtr0 = BufBasePaLow; + pTxD->SDLen0 = firstDMALen; // include padding + pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE);; + pTxD->SDLen1 = pTxBlk->SrcBufLen; + pTxD->LastSec0 = 0; + pTxD->LastSec1 = (bIsLast) ? 1 : 0; + + RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA); + +#ifdef RT_BIG_ENDIAN + if (frameNum == 0) + RTMPFrameEndianChange(pAd, (PUCHAR)(pDMAHeaderBufVA+ TXINFO_SIZE + TXWI_SIZE), DIR_WRITE, FALSE); + + if (frameNum != 0) + RTMPWIEndianChange((PUCHAR)(pDMAHeaderBufVA + TXINFO_SIZE), TYPE_TXWI); + + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + + RetTxIdx = TxIdx; + // + // Update Tx index + // + INC_RING_INDEX(TxIdx, TX_RING_SIZE); + pTxRing->TxCpuIdx = TxIdx; + + *FreeNumber -= 1; + + return RetTxIdx; + +} + + +VOID RtmpPCI_FinalWriteTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN USHORT totalMPDUSize, + IN USHORT FirstTxIdx) +{ + + PTXWI_STRUC pTxWI; + PRTMP_TX_RING pTxRing; + + // + // get Tx Ring Resource + // + pTxRing = &pAd->TxRing[pTxBlk->QueIdx]; + pTxWI = (PTXWI_STRUC) pTxRing->Cell[FirstTxIdx].DmaBuf.AllocVa; + pTxWI->MPDUtotalByteCount = totalMPDUSize; +#ifdef RT_BIG_ENDIAN + RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI); +#endif // RT_BIG_ENDIAN // + +} + + +VOID RtmpPCIDataLastTxIdx( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN USHORT LastTxIdx) +{ + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; + TXD_STRUC TxD; +#endif + PRTMP_TX_RING pTxRing; + + // + // get Tx Ring Resource + // + pTxRing = &pAd->TxRing[QueIdx]; + + // + // build Tx Descriptor + // +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) pTxRing->Cell[LastTxIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC) pTxRing->Cell[LastTxIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; +#endif + + pTxD->LastSec1 = 1; + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + +} + + +USHORT RtmpPCI_WriteFragTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN UCHAR fragNum, + OUT USHORT *FreeNumber) +{ + UCHAR *pDMAHeaderBufVA; + USHORT TxIdx, RetTxIdx; + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; + TXD_STRUC TxD; +#endif + UINT32 BufBasePaLow; + PRTMP_TX_RING pTxRing; + USHORT hwHeaderLen; + UINT32 firstDMALen; + + // + // Get Tx Ring Resource + // + pTxRing = &pAd->TxRing[pTxBlk->QueIdx]; + TxIdx = pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx; + pDMAHeaderBufVA = (PUCHAR) pTxRing->Cell[TxIdx].DmaBuf.AllocVa; + BufBasePaLow = RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa); + + // + // Copy TXINFO + TXWI + WLAN Header + LLC into DMA Header Buffer + // + //hwHeaderLen = ROUND_UP(pTxBlk->MpduHeaderLen, 4); + hwHeaderLen = pTxBlk->MpduHeaderLen + pTxBlk->HdrPadLen; + + firstDMALen = TXINFO_SIZE + TXWI_SIZE + hwHeaderLen; + NdisMoveMemory(pDMAHeaderBufVA, pTxBlk->HeaderBuf, firstDMALen); + + + // + // Build Tx Descriptor + // +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) pTxRing->Cell[TxIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC) pTxRing->Cell[TxIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; +#endif + NdisZeroMemory(pTxD, TXD_SIZE); + + if (fragNum == pTxBlk->TotalFragNum) + { + pTxRing->Cell[TxIdx].pNdisPacket = pTxBlk->pPacket; + pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; + } + + pTxD->SDPtr0 = BufBasePaLow; + pTxD->SDLen0 = firstDMALen; // include padding + pTxD->SDPtr1 = PCI_MAP_SINGLE(pAd, pTxBlk, 0, 1, PCI_DMA_TODEVICE); + pTxD->SDLen1 = pTxBlk->SrcBufLen; + pTxD->LastSec0 = 0; + pTxD->LastSec1 = 1; + + RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA); + +#ifdef RT_BIG_ENDIAN + RTMPWIEndianChange((PUCHAR)(pDMAHeaderBufVA + TXINFO_SIZE), TYPE_TXWI); + RTMPFrameEndianChange(pAd, (PUCHAR)(pDMAHeaderBufVA + TXINFO_SIZE + TXWI_SIZE), DIR_WRITE, FALSE); + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + + RetTxIdx = TxIdx; + pTxBlk->Priv += pTxBlk->SrcBufLen; + + // + // Update Tx index + // + INC_RING_INDEX(TxIdx, TX_RING_SIZE); + pTxRing->TxCpuIdx = TxIdx; + + *FreeNumber -= 1; + + return RetTxIdx; + +} + + +/* + Must be run in Interrupt context + This function handle PCI specific TxDesc and cpu index update and kick the packet out. + */ +int RtmpPCIMgmtKickOut( + IN RTMP_ADAPTER *pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket, + IN PUCHAR pSrcBufVA, + IN UINT SrcBufLen) +{ + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; + TXD_STRUC TxD; +#endif + ULONG SwIdx = pAd->MgmtRing.TxCpuIdx; + +#ifdef RT_BIG_ENDIAN + pDestTxD = (PTXD_STRUC)pAd->MgmtRing.Cell[SwIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#else + pTxD = (PTXD_STRUC) pAd->MgmtRing.Cell[SwIdx].AllocVa; +#endif + + pAd->MgmtRing.Cell[SwIdx].pNdisPacket = pPacket; + pAd->MgmtRing.Cell[SwIdx].pNextNdisPacket = NULL; + + RTMPWriteTxDescriptor(pAd, pTxD, TRUE, FIFO_MGMT); + pTxD->LastSec0 = 1; + pTxD->LastSec1 = 1; + pTxD->DMADONE = 0; + pTxD->SDLen1 = 0; + pTxD->SDPtr0 = PCI_MAP_SINGLE(pAd, pSrcBufVA, SrcBufLen, 0, PCI_DMA_TODEVICE); + pTxD->SDLen0 = SrcBufLen; + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif + +//================================================================== +/* DBGPRINT_RAW(RT_DEBUG_TRACE, ("MLMEHardTransmit\n")); + for (i = 0; i < (TXWI_SIZE+24); i++) + { + + DBGPRINT_RAW(RT_DEBUG_TRACE, ("%x:", *(pSrcBufVA+i))); + if ( i%4 == 3) + DBGPRINT_RAW(RT_DEBUG_TRACE, (" :: ")); + if ( i%16 == 15) + DBGPRINT_RAW(RT_DEBUG_TRACE, ("\n ")); + } + DBGPRINT_RAW(RT_DEBUG_TRACE, ("\n "));*/ +//======================================================================= + + pAd->RalinkCounters.KickTxCount++; + pAd->RalinkCounters.OneSecTxDoneCount++; + + // Increase TX_CTX_IDX, but write to register later. + INC_RING_INDEX(pAd->MgmtRing.TxCpuIdx, MGMT_RING_SIZE); + + RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx); + + return 0; +} + + +#ifdef CONFIG_STA_SUPPORT +/* + ======================================================================== + + Routine Description: + Check Rx descriptor, return NDIS_STATUS_FAILURE if any error dound + + Arguments: + pRxD Pointer to the Rx descriptor + + Return Value: + NDIS_STATUS_SUCCESS No err + NDIS_STATUS_FAILURE Error + + Note: + + ======================================================================== +*/ +NDIS_STATUS RTMPCheckRxError( + IN PRTMP_ADAPTER pAd, + IN PHEADER_802_11 pHeader, + IN PRXWI_STRUC pRxWI, + IN PRT28XX_RXD_STRUC pRxD) +{ + PCIPHER_KEY pWpaKey; + INT dBm; + + // Phy errors & CRC errors + if (/*(pRxD->PhyErr) ||*/ (pRxD->Crc)) + { + // Check RSSI for Noise Hist statistic collection. + dBm = (INT) (pRxWI->RSSI0) - pAd->BbpRssiToDbmDelta; + if (dBm <= -87) + pAd->StaCfg.RPIDensity[0] += 1; + else if (dBm <= -82) + pAd->StaCfg.RPIDensity[1] += 1; + else if (dBm <= -77) + pAd->StaCfg.RPIDensity[2] += 1; + else if (dBm <= -72) + pAd->StaCfg.RPIDensity[3] += 1; + else if (dBm <= -67) + pAd->StaCfg.RPIDensity[4] += 1; + else if (dBm <= -62) + pAd->StaCfg.RPIDensity[5] += 1; + else if (dBm <= -57) + pAd->StaCfg.RPIDensity[6] += 1; + else if (dBm > -57) + pAd->StaCfg.RPIDensity[7] += 1; + + return(NDIS_STATUS_FAILURE); + } + + // Add Rx size to channel load counter, we should ignore error counts + pAd->StaCfg.CLBusyBytes += (pRxD->SDL0 + 14); + + // Drop ToDs promiscous frame, it is opened due to CCX 2 channel load statistics + if (pHeader != NULL) + { +#ifndef CLIENT_WDS + if (pHeader->FC.ToDs + ) + { + return(NDIS_STATUS_FAILURE); + } +#endif // CLIENT_WDS // + } + + // Drop not U2M frames, cant's drop here because we will drop beacon in this case + // I am kind of doubting the U2M bit operation + // if (pRxD->U2M == 0) + // return(NDIS_STATUS_FAILURE); + + // drop decyption fail frame + if (pRxD->CipherErr) + { + if (pRxD->CipherErr == 2) + {DBGPRINT_RAW(RT_DEBUG_TRACE,("pRxD ERROR: ICV ok but MICErr "));} + else if (pRxD->CipherErr == 1) + {DBGPRINT_RAW(RT_DEBUG_TRACE,("pRxD ERROR: ICV Err "));} + else if (pRxD->CipherErr == 3) + DBGPRINT_RAW(RT_DEBUG_TRACE,("pRxD ERROR: Key not valid ")); + + if (((pRxD->CipherErr & 1) == 1) && INFRA_ON(pAd)) + RTMPSendWirelessEvent(pAd, IW_ICV_ERROR_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); + + DBGPRINT_RAW(RT_DEBUG_TRACE,(" %d (len=%d, Mcast=%d, MyBss=%d, Wcid=%d, KeyId=%d)\n", + pRxD->CipherErr, + pRxD->SDL0, + pRxD->Mcast | pRxD->Bcast, + pRxD->MyBss, + pRxWI->WirelessCliID, +// CipherName[pRxD->CipherAlg], + pRxWI->KeyIndex)); + + // + // MIC Error + // + if (pRxD->CipherErr == 2) + { + pWpaKey = &pAd->SharedKey[BSS0][pRxWI->KeyIndex]; +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP) + WpaSendMicFailureToWpaSupplicant(pAd, + (pWpaKey->Type == PAIRWISEKEY) ? TRUE:FALSE); + else +#endif // WPA_SUPPLICANT_SUPPORT // + RTMPReportMicError(pAd, pWpaKey); + + if (((pRxD->CipherErr & 2) == 2) && INFRA_ON(pAd)) + RTMPSendWirelessEvent(pAd, IW_MIC_ERROR_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); + + DBGPRINT_RAW(RT_DEBUG_ERROR,("Rx MIC Value error\n")); + } + + if (pHeader == NULL) + return(NDIS_STATUS_SUCCESS); + /*if ((pRxD->CipherAlg == CIPHER_AES) && + (pHeader->Sequence == pAd->FragFrame.Sequence)) + { + // + // Acceptable since the First FragFrame no CipherErr problem. + // + return(NDIS_STATUS_SUCCESS); + }*/ + + return(NDIS_STATUS_FAILURE); + } + + return(NDIS_STATUS_SUCCESS); +} +#endif // CONFIG_STA_SUPPORT // + + +BOOLEAN RTMPFreeTXDUponTxDmaDone( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx) +{ + PRTMP_TX_RING pTxRing; + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; +#endif + PNDIS_PACKET pPacket; + UCHAR FREE = 0; + TXD_STRUC TxD, *pOriTxD; + //ULONG IrqFlags; + BOOLEAN bReschedule = FALSE; + + + ASSERT(QueIdx < NUM_OF_TX_RING); + pTxRing = &pAd->TxRing[QueIdx]; + + RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QueIdx * RINGREG_DIFF, &pTxRing->TxDmaIdx); + while (pTxRing->TxSwFreeIdx != pTxRing->TxDmaIdx) + { +// RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); +#ifdef RALINK_ATE +#ifdef RALINK_28xx_QA + PHEADER_802_11 pHeader80211; + + if ((ATE_ON(pAd)) && (pAd->ate.bQATxStart == TRUE)) + { + if (pAd->ate.QID == QueIdx) + { + pAd->ate.TxDoneCount++; + pAd->RalinkCounters.KickTxCount++; + + /* always use QID_AC_BE and FIFO_EDCA */ + ASSERT(pAd->ate.QID == 0); + pAd->ate.TxAc0++; + + FREE++; +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) (pTxRing->Cell[pTxRing->TxSwFreeIdx].AllocVa); + pOriTxD = pTxD; + NdisMoveMemory(&TxD, pTxD, sizeof(TXD_STRUC)); + pTxD = &TxD; +#else + pDestTxD = (PTXD_STRUC) (pTxRing->Cell[pTxRing->TxSwFreeIdx].AllocVa); + pOriTxD = pDestTxD ; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif + pTxD->DMADONE = 0; + + pHeader80211 = pTxRing->Cell[pTxRing->TxSwFreeIdx].DmaBuf.AllocVa + sizeof(TXWI_STRUC); +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHeader80211, DIR_READ, FALSE); +#endif + pHeader80211->Sequence = ++pAd->ate.seq; +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHeader80211, DIR_WRITE, FALSE); +#endif + + if ((pAd->ate.bQATxStart == TRUE) && (pAd->ate.Mode & ATE_TXFRAME) && (pAd->ate.TxDoneCount < pAd->ate.TxCount)) + { + pAd->RalinkCounters.TransmittedByteCount += (pTxD->SDLen1 + pTxD->SDLen0); + pAd->RalinkCounters.OneSecTransmittedByteCount += (pTxD->SDLen1 + pTxD->SDLen0); + pAd->RalinkCounters.OneSecDmaDoneCount[QueIdx] ++; + INC_RING_INDEX(pTxRing->TxSwFreeIdx, TX_RING_SIZE); + + /* get TX_DTX_IDX again */ + RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QueIdx * RINGREG_DIFF , &pTxRing->TxDmaIdx); + goto kick_out; + } + else if ((pAd->ate.TxStatus == 1)/* or (pAd->ate.bQATxStart == TRUE) ??? */ && (pAd->ate.TxDoneCount == pAd->ate.TxCount)) + { + DBGPRINT(RT_DEBUG_TRACE,("all Tx is done\n")); + + // Tx status enters idle mode. + pAd->ate.TxStatus = 0; + } + else if (!(pAd->ate.Mode & ATE_TXFRAME)) + { + /* not complete sending yet, but someone press the Stop TX botton */ + DBGPRINT(RT_DEBUG_ERROR,("not complete sending yet, but someone pressed the Stop TX bottom\n")); + DBGPRINT(RT_DEBUG_ERROR,("pAd->ate.Mode = 0x%02x\n", pAd->ate.Mode)); + } + else + { + DBGPRINT(RT_DEBUG_OFF,("pTxRing->TxSwFreeIdx = %d\n", pTxRing->TxSwFreeIdx)); + } + +#ifndef RT_BIG_ENDIAN + NdisMoveMemory(pOriTxD, pTxD, sizeof(TXD_STRUC)); +#else + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + *pDestTxD = TxD; +#endif // RT_BIG_ENDIAN // + + INC_RING_INDEX(pTxRing->TxSwFreeIdx, TX_RING_SIZE); + continue; + } + } +#endif // RALINK_28xx_QA // +#endif // RALINK_ATE // + + // static rate also need NICUpdateFifoStaCounters() function. + //if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) +#ifdef VENDOR_FEATURE1_SUPPORT + /* + Note: + + Can not take off the NICUpdateFifoStaCounters(); Or the + FIFO overflow rate will be high, i.e. > 3% + (see the rate by "iwpriv ra0 show stainfo") + + Based on different platform, try to find the best value to + replace '4' here (overflow rate target is about 0%). + */ + if (++pAd->FifoUpdateRx >= 4) + { + NICUpdateFifoStaCounters(pAd); + pAd->FifoUpdateRx = 0; + } +#else + NICUpdateFifoStaCounters(pAd); +#endif // VENDOR_FEATURE1_SUPPORT // + + /* Note : If (pAd->ate.bQATxStart == TRUE), we will never reach here. */ + FREE++; +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) (pTxRing->Cell[pTxRing->TxSwFreeIdx].AllocVa); + pOriTxD = pTxD; + NdisMoveMemory(&TxD, pTxD, sizeof(TXD_STRUC)); + pTxD = &TxD; +#else + pDestTxD = (PTXD_STRUC) (pTxRing->Cell[pTxRing->TxSwFreeIdx].AllocVa); + pOriTxD = pDestTxD ; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif + + pTxD->DMADONE = 0; + + +#ifdef RALINK_ATE + /* Execution of this block is not allowed when ATE is running. */ + if (!(ATE_ON(pAd))) +#endif // RALINK_ATE // + { + pPacket = pTxRing->Cell[pTxRing->TxSwFreeIdx].pNdisPacket; + if (pPacket) + { +#ifdef CONFIG_5VT_ENHANCE + if (RTMP_GET_PACKET_5VT(pPacket)) + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, 16, PCI_DMA_TODEVICE); + else +#endif // CONFIG_5VT_ENHANCE // + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + //Always assign pNdisPacket as NULL after clear + pTxRing->Cell[pTxRing->TxSwFreeIdx].pNdisPacket = NULL; + + pPacket = pTxRing->Cell[pTxRing->TxSwFreeIdx].pNextNdisPacket; + if (pPacket) + { +#ifdef CONFIG_5VT_ENHANCE + if (RTMP_GET_PACKET_5VT(pPacket)) + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, 16, PCI_DMA_TODEVICE); + else +#endif // CONFIG_5VT_ENHANCE // + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + //Always assign pNextNdisPacket as NULL after clear + pTxRing->Cell[pTxRing->TxSwFreeIdx].pNextNdisPacket = NULL; + } + + pAd->RalinkCounters.TransmittedByteCount += (pTxD->SDLen1 + pTxD->SDLen0); + pAd->RalinkCounters.OneSecDmaDoneCount[QueIdx] ++; + INC_RING_INDEX(pTxRing->TxSwFreeIdx, TX_RING_SIZE); + /* get tx_tdx_idx again */ + RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QueIdx * RINGREG_DIFF , &pTxRing->TxDmaIdx); +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + *pDestTxD = TxD; +#else + NdisMoveMemory(pOriTxD, pTxD, sizeof(TXD_STRUC)); +#endif + +#ifdef RALINK_ATE +#ifdef RALINK_28xx_QA +kick_out: +#endif // RALINK_28xx_QA // + + /* + ATE_TXCONT mode also need to send some normal frames, so let it in. + ATE_STOP must be changed not to be 0xff + to prevent it from running into this block. + */ + if ((pAd->ate.Mode & ATE_TXFRAME) && (pAd->ate.QID == QueIdx)) + { + // TxDoneCount++ has been done if QA is used. + if (pAd->ate.bQATxStart == FALSE) + { + pAd->ate.TxDoneCount++; + } + if (((pAd->ate.TxCount - pAd->ate.TxDoneCount + 1) >= TX_RING_SIZE)) + { + /* Note : We increase TxCpuIdx here, not TxSwFreeIdx ! */ + INC_RING_INDEX(pAd->TxRing[QueIdx].TxCpuIdx, TX_RING_SIZE); +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) (pTxRing->Cell[pAd->TxRing[QueIdx].TxCpuIdx].AllocVa); + pOriTxD = pTxD; + NdisMoveMemory(&TxD, pTxD, sizeof(TXD_STRUC)); + pTxD = &TxD; +#else + pDestTxD = (PTXD_STRUC) (pTxRing->Cell[pAd->TxRing[QueIdx].TxCpuIdx].AllocVa); + pOriTxD = pDestTxD ; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif + pTxD->DMADONE = 0; +#ifndef RT_BIG_ENDIAN + NdisMoveMemory(pOriTxD, pTxD, sizeof(TXD_STRUC)); +#else + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + *pDestTxD = TxD; +#endif + // kick Tx-Ring + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QueIdx * RINGREG_DIFF, pAd->TxRing[QueIdx].TxCpuIdx); + pAd->RalinkCounters.KickTxCount++; + } + } +#endif // RALINK_ATE // +// RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); + } + + + return bReschedule; + +} + + +/* + ======================================================================== + + Routine Description: + Process TX Rings DMA Done interrupt, running in DPC level + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + ======================================================================== +*/ +BOOLEAN RTMPHandleTxRingDmaDoneInterrupt( + IN PRTMP_ADAPTER pAd, + IN INT_SOURCE_CSR_STRUC TxRingBitmap) +{ +// UCHAR Count = 0; + unsigned long IrqFlags; + BOOLEAN bReschedule = FALSE; + + // Make sure Tx ring resource won't be used by other threads + //NdisAcquireSpinLock(&pAd->TxRingLock); + + RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); + + if (TxRingBitmap.field.Ac0DmaDone) + bReschedule = RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_BE); + + if (TxRingBitmap.field.HccaDmaDone) + bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_HCCA); + + if (TxRingBitmap.field.Ac3DmaDone) + bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_VO); + + if (TxRingBitmap.field.Ac2DmaDone) + bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_VI); + + if (TxRingBitmap.field.Ac1DmaDone) + bReschedule |= RTMPFreeTXDUponTxDmaDone(pAd, QID_AC_BK); + + // Make sure to release Tx ring resource + //NdisReleaseSpinLock(&pAd->TxRingLock); + RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); + + // Dequeue outgoing frames from TxSwQueue[] and process it + RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); + + return bReschedule; +} + + +/* + ======================================================================== + + Routine Description: + Process MGMT ring DMA done interrupt, running in DPC level + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPHandleMgmtRingDmaDoneInterrupt( + IN PRTMP_ADAPTER pAd) +{ + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; + TXD_STRUC TxD; +#endif + PNDIS_PACKET pPacket; +// int i; + UCHAR FREE = 0; + PRTMP_MGMT_RING pMgmtRing = &pAd->MgmtRing; + + NdisAcquireSpinLock(&pAd->MgmtRingLock); + + RTMP_IO_READ32(pAd, TX_MGMTDTX_IDX, &pMgmtRing->TxDmaIdx); + while (pMgmtRing->TxSwFreeIdx!= pMgmtRing->TxDmaIdx) + { + FREE++; +#ifdef RT_BIG_ENDIAN + pDestTxD = (PTXD_STRUC) (pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].AllocVa); + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#else + pTxD = (PTXD_STRUC) (pMgmtRing->Cell[pAd->MgmtRing.TxSwFreeIdx].AllocVa); +#endif + pTxD->DMADONE = 0; + pPacket = pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNdisPacket; + + if (pPacket == NULL) + continue; + + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNdisPacket = NULL; + + pPacket = pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNextNdisPacket; + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + pMgmtRing->Cell[pMgmtRing->TxSwFreeIdx].pNextNdisPacket = NULL; + INC_RING_INDEX(pMgmtRing->TxSwFreeIdx, MGMT_RING_SIZE); + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, TRUE, TYPE_TXD); +#endif + } + NdisReleaseSpinLock(&pAd->MgmtRingLock); + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // +} + + +/* + ======================================================================== + + Routine Description: + Arguments: + Adapter Pointer to our adapter. Dequeue all power safe delayed braodcast frames after beacon. + + IRQL = DISPATCH_LEVEL + + ======================================================================== +*/ +VOID RTMPHandleTBTTInterrupt( + IN PRTMP_ADAPTER pAd) +{ + { + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { + } + } +} + + +/* + ======================================================================== + + Routine Description: + Arguments: + pAd Pointer to our adapter. Rewrite beacon content before next send-out. + + IRQL = DISPATCH_LEVEL + + ======================================================================== +*/ +VOID RTMPHandlePreTBTTInterrupt( + IN PRTMP_ADAPTER pAd) +{ + { + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("RTMPHandlePreTBTTInterrupt...\n")); + } + } + + +} + +VOID RTMPHandleRxCoherentInterrupt( + IN PRTMP_ADAPTER pAd) +{ + WPDMA_GLO_CFG_STRUC GloCfg; + + if (pAd == NULL) + { + DBGPRINT(RT_DEBUG_TRACE, ("====> pAd is NULL, return.\n")); + return; + } + + DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPHandleRxCoherentInterrupt \n")); + + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG , &GloCfg.word); + + GloCfg.field.EnTXWriteBackDDONE = 0; + GloCfg.field.EnableRxDMA = 0; + GloCfg.field.EnableTxDMA = 0; + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); + + RTMPRingCleanUp(pAd, QID_AC_BE); + RTMPRingCleanUp(pAd, QID_AC_BK); + RTMPRingCleanUp(pAd, QID_AC_VI); + RTMPRingCleanUp(pAd, QID_AC_VO); + RTMPRingCleanUp(pAd, QID_HCCA); + RTMPRingCleanUp(pAd, QID_MGMT); + RTMPRingCleanUp(pAd, QID_RX); + + RTMPEnableRxTx(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPHandleRxCoherentInterrupt \n")); +} + + + + +VOID DBGPRINT_TX_RING( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx) +{ + UINT32 Ac0Base; + UINT32 Ac0HwIdx = 0, Ac0SwIdx = 0, AC0freeIdx; + int i; +// PULONG pTxD; + PULONG ptemp; + + DBGPRINT_RAW(RT_DEBUG_TRACE, ("=====================================================\n " )); + switch (QueIdx) + { + case QID_AC_BE: + RTMP_IO_READ32(pAd, TX_BASE_PTR0, &Ac0Base); + RTMP_IO_READ32(pAd, TX_CTX_IDX0, &Ac0SwIdx); + RTMP_IO_READ32(pAd, TX_DTX_IDX0, &Ac0HwIdx); + DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_BE DESCRIPTOR \n " )); + for (i=0;i<TX_RING_SIZE;i++) + { + ptemp= (PULONG)pAd->TxRing[QID_AC_BE].Cell[i].AllocVa; + DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); + } + DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); + break; + case QID_AC_BK: + RTMP_IO_READ32(pAd, TX_BASE_PTR1, &Ac0Base); + RTMP_IO_READ32(pAd, TX_CTX_IDX1, &Ac0SwIdx); + RTMP_IO_READ32(pAd, TX_DTX_IDX1, &Ac0HwIdx); + DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_BK DESCRIPTOR \n " )); + for (i=0;i<TX_RING_SIZE;i++) + { + ptemp= (PULONG)pAd->TxRing[QID_AC_BK].Cell[i].AllocVa; + DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); + } + DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); + break; + case QID_AC_VI: + RTMP_IO_READ32(pAd, TX_BASE_PTR2, &Ac0Base); + RTMP_IO_READ32(pAd, TX_CTX_IDX2, &Ac0SwIdx); + RTMP_IO_READ32(pAd, TX_DTX_IDX2, &Ac0HwIdx); + DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_VI DESCRIPTOR \n " )); + for (i=0;i<TX_RING_SIZE;i++) + { + ptemp= (PULONG)pAd->TxRing[QID_AC_VI].Cell[i].AllocVa; + DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); + } + DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); + break; + case QID_AC_VO: + RTMP_IO_READ32(pAd, TX_BASE_PTR3, &Ac0Base); + RTMP_IO_READ32(pAd, TX_CTX_IDX3, &Ac0SwIdx); + RTMP_IO_READ32(pAd, TX_DTX_IDX3, &Ac0HwIdx); + DBGPRINT_RAW(RT_DEBUG_TRACE, ("All QID_AC_VO DESCRIPTOR \n " )); + for (i=0;i<TX_RING_SIZE;i++) + { + ptemp= (PULONG)pAd->TxRing[QID_AC_VO].Cell[i].AllocVa; + DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); + } + DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); + break; + case QID_MGMT: + RTMP_IO_READ32(pAd, TX_BASE_PTR5, &Ac0Base); + RTMP_IO_READ32(pAd, TX_CTX_IDX5, &Ac0SwIdx); + RTMP_IO_READ32(pAd, TX_DTX_IDX5, &Ac0HwIdx); + DBGPRINT_RAW(RT_DEBUG_TRACE, (" All QID_MGMT DESCRIPTOR \n " )); + for (i=0;i<MGMT_RING_SIZE;i++) + { + ptemp= (PULONG)pAd->MgmtRing.Cell[i].AllocVa; + DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08lx: %08lx: %08lx: %08lx\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); + } + DBGPRINT_RAW(RT_DEBUG_TRACE, (" \n " )); + break; + + default: + DBGPRINT_ERR(("DBGPRINT_TX_RING(Ring %d) not supported\n", QueIdx)); + break; + } + + if (QueIdx < NUM_OF_TX_RING) { + AC0freeIdx = pAd->TxRing[QueIdx].TxSwFreeIdx; + + DBGPRINT(RT_DEBUG_TRACE,("TxRing%d, TX_DTX_IDX=%d, TX_CTX_IDX=%d\n", QueIdx, Ac0HwIdx, Ac0SwIdx)); + DBGPRINT_RAW(RT_DEBUG_TRACE,(" TxSwFreeIdx[%d]", AC0freeIdx)); + DBGPRINT_RAW(RT_DEBUG_TRACE,(" pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount)); + } else if (QueIdx == QID_MGMT) { + AC0freeIdx = pAd->MgmtRing.TxSwFreeIdx; + + DBGPRINT(RT_DEBUG_TRACE,("TxRing%d, TX_DTX_IDX=%d, TX_CTX_IDX=%d\n", QueIdx, Ac0HwIdx, Ac0SwIdx)); + DBGPRINT_RAW(RT_DEBUG_TRACE,(" TxSwFreeIdx[%d]", AC0freeIdx)); + DBGPRINT_RAW(RT_DEBUG_TRACE,(" pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount)); + } + +} + + +VOID DBGPRINT_RX_RING( + IN PRTMP_ADAPTER pAd) +{ + UINT32 Ac0Base; + UINT32 Ac0HwIdx = 0, Ac0SwIdx = 0, AC0freeIdx; +// PULONG pTxD; + int i; + UINT32 *ptemp; +// PRXD_STRUC pRxD; + + DBGPRINT_RAW(RT_DEBUG_TRACE, ("=====================================================\n " )); + RTMP_IO_READ32(pAd, RX_BASE_PTR, &Ac0Base); + RTMP_IO_READ32(pAd, RX_CRX_IDX, &Ac0SwIdx); + RTMP_IO_READ32(pAd, RX_DRX_IDX, &Ac0HwIdx); + AC0freeIdx = pAd->RxRing.RxSwReadIdx; + + DBGPRINT_RAW(RT_DEBUG_TRACE, ("All RX DSP \n " )); + for (i=0;i<RX_RING_SIZE;i++) + { + ptemp = (UINT32 *)pAd->RxRing.Cell[i].AllocVa; + DBGPRINT_RAW(RT_DEBUG_TRACE, ("[%02d] %08x: %08x: %08x: %08x\n " , i, *ptemp,*(ptemp+1),*(ptemp+2),*(ptemp+3))); + } + DBGPRINT(RT_DEBUG_TRACE,("RxRing, RX_DRX_IDX=%d, RX_CRX_IDX=%d \n", Ac0HwIdx, Ac0SwIdx)); + DBGPRINT_RAW(RT_DEBUG_TRACE,(" RxSwReadIdx [%d]=", AC0freeIdx)); + DBGPRINT_RAW(RT_DEBUG_TRACE,(" pending-NDIS=%ld\n", pAd->RalinkCounters.PendingNdisPacketCount)); +} + + +PNDIS_PACKET GetPacketFromRxRing( + IN PRTMP_ADAPTER pAd, + OUT PRT28XX_RXD_STRUC pSaveRxD, + OUT BOOLEAN *pbReschedule, + IN OUT UINT32 *pRxPending) +{ + PRXD_STRUC pRxD; +#ifdef RT_BIG_ENDIAN + PRXD_STRUC pDestRxD; + RXD_STRUC RxD; +#endif + PNDIS_PACKET pRxPacket = NULL; + PNDIS_PACKET pNewPacket; + PVOID AllocVa; + NDIS_PHYSICAL_ADDRESS AllocPa; + BOOLEAN bReschedule = FALSE; + RTMP_DMACB *pRxCell; + + RTMP_SEM_LOCK(&pAd->RxRingLock); + + if (*pRxPending == 0) + { + // Get how may packets had been received + RTMP_IO_READ32(pAd, RX_DRX_IDX , &pAd->RxRing.RxDmaIdx); + + if (pAd->RxRing.RxSwReadIdx == pAd->RxRing.RxDmaIdx) + { + // no more rx packets + bReschedule = FALSE; + goto done; + } + + // get rx pending count + if (pAd->RxRing.RxDmaIdx > pAd->RxRing.RxSwReadIdx) + *pRxPending = pAd->RxRing.RxDmaIdx - pAd->RxRing.RxSwReadIdx; + else + *pRxPending = pAd->RxRing.RxDmaIdx + RX_RING_SIZE - pAd->RxRing.RxSwReadIdx; + + } + + pRxCell = &pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx]; + +#ifdef RT_BIG_ENDIAN + pDestRxD = (PRXD_STRUC) pRxCell->AllocVa; + RxD = *pDestRxD; + pRxD = &RxD; + RTMPDescriptorEndianChange((PUCHAR)pRxD, TYPE_RXD); +#else + // Point to Rx indexed rx ring descriptor + pRxD = (PRXD_STRUC) pRxCell->AllocVa; +#endif + + if (pRxD->DDONE == 0) + { + *pRxPending = 0; + // DMAIndx had done but DDONE bit not ready + bReschedule = TRUE; + goto done; + } + + + // return rx descriptor + NdisMoveMemory(pSaveRxD, pRxD, RXD_SIZE); + + pNewPacket = RTMP_AllocateRxPacketBuffer(pAd, RX_BUFFER_AGGRESIZE, FALSE, &AllocVa, &AllocPa); + + if (pNewPacket) + { + // unmap the rx buffer + PCI_UNMAP_SINGLE(pAd, pRxCell->DmaBuf.AllocPa, + pRxCell->DmaBuf.AllocSize, PCI_DMA_FROMDEVICE); + pRxPacket = pRxCell->pNdisPacket; + + pRxCell->DmaBuf.AllocSize = RX_BUFFER_AGGRESIZE; + pRxCell->pNdisPacket = (PNDIS_PACKET) pNewPacket; + pRxCell->DmaBuf.AllocVa = AllocVa; + pRxCell->DmaBuf.AllocPa = AllocPa; + /* update SDP0 to new buffer of rx packet */ + pRxD->SDP0 = AllocPa; + } + else + { + //DBGPRINT(RT_DEBUG_TRACE,("No Rx Buffer\n")); + pRxPacket = NULL; + bReschedule = TRUE; + } + + pRxD->DDONE = 0; + + // had handled one rx packet + *pRxPending = *pRxPending - 1; + + // update rx descriptor and kick rx +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pRxD, TYPE_RXD); + WriteBackToDescriptor((PUCHAR)pDestRxD, (PUCHAR)pRxD, FALSE, TYPE_RXD); +#endif + INC_RING_INDEX(pAd->RxRing.RxSwReadIdx, RX_RING_SIZE); + + pAd->RxRing.RxCpuIdx = (pAd->RxRing.RxSwReadIdx == 0) ? (RX_RING_SIZE-1) : (pAd->RxRing.RxSwReadIdx-1); + RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx); + +done: + RTMP_SEM_UNLOCK(&pAd->RxRingLock); + *pbReschedule = bReschedule; + return pRxPacket; +} + + +NDIS_STATUS MlmeHardTransmitTxRing( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket) +{ + PACKET_INFO PacketInfo; + PUCHAR pSrcBufVA; + UINT SrcBufLen; + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; + TXD_STRUC TxD; +#endif + PHEADER_802_11 pHeader_802_11; + BOOLEAN bAckRequired, bInsertTimestamp; + ULONG SrcBufPA; + //UCHAR TxBufIdx; + UCHAR MlmeRate; + ULONG SwIdx = pAd->TxRing[QueIdx].TxCpuIdx; + PTXWI_STRUC pFirstTxWI; + //ULONG i; + //HTTRANSMIT_SETTING MlmeTransmit; //Rate for this MGMT frame. + ULONG FreeNum; + MAC_TABLE_ENTRY *pMacEntry = NULL; + + + RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); + + + if (pSrcBufVA == NULL) + { + // The buffer shouldn't be NULL + return NDIS_STATUS_FAILURE; + } + + // Make sure MGMT ring resource won't be used by other threads + //NdisAcquireSpinLock(&pAd->TxRingLock); + + FreeNum = GET_TXRING_FREENO(pAd, QueIdx); + + if (FreeNum == 0) + { + //NdisReleaseSpinLock(&pAd->TxRingLock); + return NDIS_STATUS_FAILURE; + } + + SwIdx = pAd->TxRing[QueIdx].TxCpuIdx; + +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) pAd->TxRing[QueIdx].Cell[SwIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC)pAd->TxRing[QueIdx].Cell[SwIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif + + if (pAd->TxRing[QueIdx].Cell[SwIdx].pNdisPacket) + { + DBGPRINT(RT_DEBUG_OFF, ("MlmeHardTransmit Error\n")); + //NdisReleaseSpinLock(&pAd->TxRingLock); + return NDIS_STATUS_FAILURE; + } + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // outgoing frame always wakeup PHY to prevent frame lost + // if (pAd->StaCfg.Psm == PWR_SAVE) + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + AsicForceWakeup(pAd, TRUE); + } +#endif // CONFIG_STA_SUPPORT // + pFirstTxWI =(PTXWI_STRUC)pSrcBufVA; + + pHeader_802_11 = (PHEADER_802_11) (pSrcBufVA + TXWI_SIZE); + if (pHeader_802_11->Addr1[0] & 0x01) + { + MlmeRate = pAd->CommonCfg.BasicMlmeRate; + } + else + { + MlmeRate = pAd->CommonCfg.MlmeRate; + } + + if ((pHeader_802_11->FC.Type == BTYPE_DATA) && + (pHeader_802_11->FC.SubType == SUBTYPE_QOS_NULL)) + { + pMacEntry = MacTableLookup(pAd, pHeader_802_11->Addr1); + } + + // Verify Mlme rate for a / g bands. + if ((pAd->LatchRfRegs.Channel > 14) && (MlmeRate < RATE_6)) // 11A band + MlmeRate = RATE_6; + + // + // Should not be hard code to set PwrMgmt to 0 (PWR_ACTIVE) + // Snice it's been set to 0 while on MgtMacHeaderInit + // By the way this will cause frame to be send on PWR_SAVE failed. + // + // + // In WMM-UAPSD, mlme frame should be set psm as power saving but probe request frame +#ifdef CONFIG_STA_SUPPORT + // Data-Null packets alse pass through MMRequest in RT2860, however, we hope control the psm bit to pass APSD + if (pHeader_802_11->FC.Type != BTYPE_DATA) + { + if ((pHeader_802_11->FC.SubType == SUBTYPE_PROBE_REQ) || !(pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable)) + { + pHeader_802_11->FC.PwrMgmt = PWR_ACTIVE; + } + else + { + pHeader_802_11->FC.PwrMgmt = pAd->CommonCfg.bAPSDForcePowerSave; + } + } +#endif // CONFIG_STA_SUPPORT // + + bInsertTimestamp = FALSE; + if (pHeader_802_11->FC.Type == BTYPE_CNTL) // must be PS-POLL + { + bAckRequired = FALSE; + } + else // BTYPE_MGMT or BTYPE_DATA(must be NULL frame) + { + if (pHeader_802_11->Addr1[0] & 0x01) // MULTICAST, BROADCAST + { + bAckRequired = FALSE; + pHeader_802_11->Duration = 0; + } + else + { + bAckRequired = TRUE; + pHeader_802_11->Duration = RTMPCalcDuration(pAd, MlmeRate, 14); + if (pHeader_802_11->FC.SubType == SUBTYPE_PROBE_RSP) + { + bInsertTimestamp = TRUE; + } + } + } + pHeader_802_11->Sequence = pAd->Sequence++; + if (pAd->Sequence > 0xfff) + pAd->Sequence = 0; + // Before radar detection done, mgmt frame can not be sent but probe req + // Because we need to use probe req to trigger driver to send probe req in passive scan + if ((pHeader_802_11->FC.SubType != SUBTYPE_PROBE_REQ) + && (pAd->CommonCfg.bIEEE80211H == 1) + && (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE)) + { + DBGPRINT(RT_DEBUG_ERROR,("MlmeHardTransmit --> radar detect not in normal mode !!!\n")); + //NdisReleaseSpinLock(&pAd->TxRingLock); + return (NDIS_STATUS_FAILURE); + } + + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHeader_802_11, DIR_WRITE, FALSE); +#endif + // + // fill scatter-and-gather buffer list into TXD. Internally created NDIS PACKET + // should always has only one ohysical buffer, and the whole frame size equals + // to the first scatter buffer size + // + + // Initialize TX Descriptor + // For inter-frame gap, the number is for this frame and next frame + // For MLME rate, we will fix as 2Mb to match other vendor's implement +// pAd->CommonCfg.MlmeTransmit.field.MODE = 1; + +// management frame doesn't need encryption. so use RESERVED_WCID no matter u are sending to specific wcid or not. + // Only beacon use Nseq=TRUE. So here we use Nseq=FALSE. + if (pMacEntry == NULL) + { + RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, bInsertTimestamp, FALSE, bAckRequired, FALSE, + 0, RESERVED_WCID, (SrcBufLen - TXWI_SIZE), PID_MGMT, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_BACKOFF, FALSE, &pAd->CommonCfg.MlmeTransmit); + } + else + { + RTMPWriteTxWI(pAd, pFirstTxWI, FALSE, FALSE, + bInsertTimestamp, FALSE, bAckRequired, FALSE, + 0, pMacEntry->Aid, (SrcBufLen - TXWI_SIZE), + pMacEntry->MaxHTPhyMode.field.MCS, 0, + (UCHAR)pMacEntry->MaxHTPhyMode.field.MCS, + IFS_BACKOFF, FALSE, &pMacEntry->MaxHTPhyMode); + } + + pAd->TxRing[QueIdx].Cell[SwIdx].pNdisPacket = pPacket; + pAd->TxRing[QueIdx].Cell[SwIdx].pNextNdisPacket = NULL; +// pFirstTxWI->MPDUtotalByteCount = SrcBufLen - TXWI_SIZE; +#ifdef RT_BIG_ENDIAN + RTMPWIEndianChange((PUCHAR)pFirstTxWI, TYPE_TXWI); +#endif + SrcBufPA = PCI_MAP_SINGLE(pAd, pSrcBufVA, SrcBufLen, 0, PCI_DMA_TODEVICE); + + + RTMPWriteTxDescriptor(pAd, pTxD, TRUE, FIFO_EDCA); + pTxD->LastSec0 = 1; + pTxD->LastSec1 = 1; + pTxD->SDLen0 = SrcBufLen; + pTxD->SDLen1 = 0; + pTxD->SDPtr0 = SrcBufPA; + pTxD->DMADONE = 0; + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif + + pAd->RalinkCounters.KickTxCount++; + pAd->RalinkCounters.OneSecTxDoneCount++; + + // Increase TX_CTX_IDX, but write to register later. + INC_RING_INDEX(pAd->TxRing[QueIdx].TxCpuIdx, TX_RING_SIZE); + + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QueIdx*0x10, pAd->TxRing[QueIdx].TxCpuIdx); + + // Make sure to release MGMT ring resource +// NdisReleaseSpinLock(&pAd->TxRingLock); + + return NDIS_STATUS_SUCCESS; +} + + +NDIS_STATUS MlmeDataHardTransmit( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket) +{ + if ((pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE) + ) + { + return NDIS_STATUS_FAILURE; + } + + return MlmeHardTransmitTxRing(pAd,QueIdx,pPacket); +} + + +/* + ======================================================================== + + Routine Description: + Calculates the duration which is required to transmit out frames + with given size and specified rate. + + Arguments: + pTxD Pointer to transmit descriptor + Ack Setting for Ack requirement bit + Fragment Setting for Fragment bit + RetryMode Setting for retry mode + Ifs Setting for IFS gap + Rate Setting for transmit rate + Service Setting for service + Length Frame length + TxPreamble Short or Long preamble when using CCK rates + QueIdx - 0-3, according to 802.11e/d4.4 June/2003 + + Return Value: + None + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ======================================================================== +*/ +VOID RTMPWriteTxDescriptor( + IN PRTMP_ADAPTER pAd, + IN PTXD_STRUC pTxD, + IN BOOLEAN bWIV, + IN UCHAR QueueSEL) +{ + // + // Always use Long preamble before verifiation short preamble functionality works well. + // Todo: remove the following line if short preamble functionality works + // + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); + + pTxD->WIV = (bWIV) ? 1: 0; + pTxD->QSEL= (QueueSEL); + //RT2860c?? fixed using EDCA queue for test... We doubt Queue1 has problem. 2006-09-26 Jan + //pTxD->QSEL= FIFO_EDCA; + if (pAd->bGenOneHCCA == TRUE) + pTxD->QSEL= FIFO_HCCA; + pTxD->DMADONE = 0; +} diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_info.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_info.c new file mode 100644 index 000000000..803f7b5f4 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_info.c @@ -0,0 +1,3995 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_info.c + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + +#include "rt_config.h" + + +INT Show_SSID_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_WirelessMode_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_TxBurst_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_TxPreamble_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_TxPower_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_Channel_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_BGProtection_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_RTSThreshold_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_FragThreshold_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +#ifdef DOT11_N_SUPPORT +INT Show_HtBw_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtMcs_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtGi_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtOpMode_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtExtcha_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtMpduDensity_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtBaWinSize_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtRdg_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtAmsdu_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_HtAutoBa_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); +#endif // DOT11_N_SUPPORT // + +INT Show_CountryRegion_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_CountryRegionABand_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_CountryCode_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +#ifdef AGGREGATION_SUPPORT +INT Show_PktAggregate_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); +#endif // AGGREGATION_SUPPORT // + +#ifdef WMM_SUPPORT +INT Show_WmmCapable_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); +#endif // WMM_SUPPORT // + +INT Show_IEEE80211H_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +#ifdef CONFIG_STA_SUPPORT +INT Show_NetworkType_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + + +INT Show_WPAPSK_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + + +INT Show_AutoReconnect_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); +#endif // CONFIG_STA_SUPPORT // + +INT Show_AuthMode_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_EncrypType_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_DefaultKeyID_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_Key1_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_Key2_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_Key3_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_Key4_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +INT Show_PMK_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf); + +extern INT Set_AP_WscConfStatus_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +extern INT Set_AP_AuthMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +extern INT Set_AP_EncrypType_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +extern INT Set_AP_SSID_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +extern INT Set_AP_WPAPSK_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +static struct { + PSTRING name; + INT (*show_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg); +} *PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC, RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC[] = { + {"SSID", Show_SSID_Proc}, + {"WirelessMode", Show_WirelessMode_Proc}, + {"TxBurst", Show_TxBurst_Proc}, + {"TxPreamble", Show_TxPreamble_Proc}, + {"TxPower", Show_TxPower_Proc}, + {"Channel", Show_Channel_Proc}, + {"BGProtection", Show_BGProtection_Proc}, + {"RTSThreshold", Show_RTSThreshold_Proc}, + {"FragThreshold", Show_FragThreshold_Proc}, +#ifdef DOT11_N_SUPPORT + {"HtBw", Show_HtBw_Proc}, + {"HtMcs", Show_HtMcs_Proc}, + {"HtGi", Show_HtGi_Proc}, + {"HtOpMode", Show_HtOpMode_Proc}, + {"HtExtcha", Show_HtExtcha_Proc}, + {"HtMpduDensity", Show_HtMpduDensity_Proc}, + {"HtBaWinSize", Show_HtBaWinSize_Proc}, + {"HtRdg", Show_HtRdg_Proc}, + {"HtAmsdu", Show_HtAmsdu_Proc}, + {"HtAutoBa", Show_HtAutoBa_Proc}, +#endif // DOT11_N_SUPPORT // + {"CountryRegion", Show_CountryRegion_Proc}, + {"CountryRegionABand", Show_CountryRegionABand_Proc}, + {"CountryCode", Show_CountryCode_Proc}, +#ifdef AGGREGATION_SUPPORT + {"PktAggregate", Show_PktAggregate_Proc}, +#endif + +#ifdef WMM_SUPPORT + {"WmmCapable", Show_WmmCapable_Proc}, +#endif + {"IEEE80211H", Show_IEEE80211H_Proc}, +#ifdef CONFIG_STA_SUPPORT + {"NetworkType", Show_NetworkType_Proc}, + {"WPAPSK", Show_WPAPSK_Proc}, + {"AutoReconnect", Show_AutoReconnect_Proc}, +#endif // CONFIG_STA_SUPPORT // + {"AuthMode", Show_AuthMode_Proc}, + {"EncrypType", Show_EncrypType_Proc}, + {"DefaultKeyID", Show_DefaultKeyID_Proc}, + {"Key1", Show_Key1_Proc}, + {"Key2", Show_Key2_Proc}, + {"Key3", Show_Key3_Proc}, + {"Key4", Show_Key4_Proc}, + {"PMK", Show_PMK_Proc}, + {NULL, NULL} +}; + +/* + ========================================================================== + Description: + Get Driver version. + + Return: + ========================================================================== +*/ +INT Set_DriverVersion_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + DBGPRINT(RT_DEBUG_TRACE, ("Driver version-%s\n", STA_DRIVER_VERSION)); +#endif // CONFIG_STA_SUPPORT // + + return TRUE; +} + +/* + ========================================================================== + Description: + Set Country Region. + This command will not work, if the field of CountryRegion in eeprom is programmed. + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_CountryRegion_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + int retval; + +#ifdef EXT_BUILD_CHANNEL_LIST + return -EOPNOTSUPP; +#endif // EXT_BUILD_CHANNEL_LIST // + + retval = RT_CfgSetCountryRegion(pAd, arg, BAND_24G); + if (retval == FALSE) + return FALSE; + + // if set country region, driver needs to be reset + BuildChannelList(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryRegion_Proc::(CountryRegion=%d)\n", pAd->CommonCfg.CountryRegion)); + + return TRUE; +} + + +/* + ========================================================================== + Description: + Set Country Region for A band. + This command will not work, if the field of CountryRegion in eeprom is programmed. + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_CountryRegionABand_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + int retval; + +#ifdef EXT_BUILD_CHANNEL_LIST + return -EOPNOTSUPP; +#endif // EXT_BUILD_CHANNEL_LIST // + + retval = RT_CfgSetCountryRegion(pAd, arg, BAND_5G); + if (retval == FALSE) + return FALSE; + + // if set country region, driver needs to be reset + BuildChannelList(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_CountryRegionABand_Proc::(CountryRegion=%d)\n", pAd->CommonCfg.CountryRegionForABand)); + + return TRUE; +} + + +/* + ========================================================================== + Description: + Set Wireless Mode + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_WirelessMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + INT success = TRUE; + + success = RT_CfgSetWirelessMode(pAd, arg); + if (success) + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + LONG WirelessMode = pAd->CommonCfg.PhyMode; + + /* clean up previous SCAN result */ + BssTableInit(&pAd->ScanTab); + if (pAd->StaCfg.LastScanTime > 10 * OS_HZ) + pAd->StaCfg.LastScanTime -= (10 * OS_HZ); + + RTMPSetPhyMode(pAd, WirelessMode); +#ifdef DOT11_N_SUPPORT + if (WirelessMode >= PHY_11ABGN_MIXED) + { + pAd->CommonCfg.BACapability.field.AutoBA = TRUE; + pAd->CommonCfg.REGBACapability.field.AutoBA = TRUE; + } + else + { + pAd->CommonCfg.BACapability.field.AutoBA = FALSE; + pAd->CommonCfg.REGBACapability.field.AutoBA = FALSE; + } +#endif // DOT11_N_SUPPORT // + // Set AdhocMode rates + if (pAd->StaCfg.BssType == BSS_ADHOC) + { + MlmeUpdateTxRates(pAd, FALSE, 0); + MakeIbssBeacon(pAd); // re-build BEACON frame + AsicEnableIbssSync(pAd); // copy to on-chip memory + } + } +#endif // CONFIG_STA_SUPPORT // + + // it is needed to set SSID to take effect +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("Set_WirelessMode_Proc::(=%d)\n", pAd->CommonCfg.PhyMode)); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("Set_WirelessMode_Proc::parameters out of range\n")); + } + + return success; +} + +/* + ========================================================================== + Description: + Set Channel + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_Channel_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + INT success = TRUE; + UCHAR Channel; + + Channel = (UCHAR) simple_strtol(arg, 0, 10); + + // check if this channel is valid + if (ChannelSanity(pAd, Channel) == TRUE) + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pAd->CommonCfg.Channel = Channel; + + if (MONITOR_ON(pAd)) + { +#ifdef DOT11_N_SUPPORT + N_ChannelCheck(pAd); + if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED && + pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) + { + N_SetCenCh(pAd); + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + DBGPRINT(RT_DEBUG_TRACE, ("BW_40, control_channel(%d), CentralChannel(%d) \n", + pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel)); + } + else +#endif // DOT11_N_SUPPORT // + { + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + DBGPRINT(RT_DEBUG_TRACE, ("BW_20, Channel(%d)\n", pAd->CommonCfg.Channel)); + } + } + } +#endif // CONFIG_STA_SUPPORT // + success = TRUE; + } + else + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + success = FALSE; +#endif // CONFIG_STA_SUPPORT // + } + + + if (success == TRUE) + DBGPRINT(RT_DEBUG_TRACE, ("Set_Channel_Proc::(Channel=%d)\n", pAd->CommonCfg.Channel)); + + return success; +} + + +/* + ========================================================================== + Description: + Set Short Slot Time Enable or Disable + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_ShortSlot_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + int retval; + + retval = RT_CfgSetShortSlot(pAd, arg); + if (retval == TRUE) + DBGPRINT(RT_DEBUG_TRACE, ("Set_ShortSlot_Proc::(ShortSlot=%d)\n", pAd->CommonCfg.bUseShortSlotTime)); + + return retval; +} + + +/* + ========================================================================== + Description: + Set Tx power + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_TxPower_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + LONG TxPower; + INT success = FALSE; + + TxPower = simple_strtol(arg, 0, 10); + if (TxPower <= 100) + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pAd->CommonCfg.TxPowerDefault = TxPower; + pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; + } +#endif // CONFIG_STA_SUPPORT // + success = TRUE; + } + else + success = FALSE; + + DBGPRINT(RT_DEBUG_TRACE, ("Set_TxPower_Proc::(TxPowerPercentage=%ld)\n", pAd->CommonCfg.TxPowerPercentage)); + + return success; +} + +/* + ========================================================================== + Description: + Set 11B/11G Protection + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_BGProtection_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + switch (simple_strtol(arg, 0, 10)) + { + case 0: //AUTO + pAd->CommonCfg.UseBGProtection = 0; + break; + case 1: //Always On + pAd->CommonCfg.UseBGProtection = 1; + break; + case 2: //Always OFF + pAd->CommonCfg.UseBGProtection = 2; + break; + default: //Invalid argument + return FALSE; + } + + + DBGPRINT(RT_DEBUG_TRACE, ("Set_BGProtection_Proc::(BGProtection=%ld)\n", pAd->CommonCfg.UseBGProtection)); + + return TRUE; +} + +/* + ========================================================================== + Description: + Set TxPreamble + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_TxPreamble_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + RT_802_11_PREAMBLE Preamble; + + Preamble = (RT_802_11_PREAMBLE)simple_strtol(arg, 0, 10); + + + switch (Preamble) + { + case Rt802_11PreambleShort: + pAd->CommonCfg.TxPreamble = Preamble; +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + MlmeSetTxPreamble(pAd, Rt802_11PreambleShort); +#endif // CONFIG_STA_SUPPORT // + break; + case Rt802_11PreambleLong: +#ifdef CONFIG_STA_SUPPORT + case Rt802_11PreambleAuto: + // if user wants AUTO, initialize to LONG here, then change according to AP's + // capability upon association. +#endif // CONFIG_STA_SUPPORT // + pAd->CommonCfg.TxPreamble = Preamble; +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + MlmeSetTxPreamble(pAd, Rt802_11PreambleLong); +#endif // CONFIG_STA_SUPPORT // + break; + default: //Invalid argument + return FALSE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("Set_TxPreamble_Proc::(TxPreamble=%ld)\n", pAd->CommonCfg.TxPreamble)); + + return TRUE; +} + +/* + ========================================================================== + Description: + Set RTS Threshold + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_RTSThreshold_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + NDIS_802_11_RTS_THRESHOLD RtsThresh; + + RtsThresh = simple_strtol(arg, 0, 10); + + if((RtsThresh > 0) && (RtsThresh <= MAX_RTS_THRESHOLD)) + pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh; +#ifdef CONFIG_STA_SUPPORT + else if (RtsThresh == 0) + pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD; +#endif // CONFIG_STA_SUPPORT // + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_RTSThreshold_Proc::(RTSThreshold=%d)\n", pAd->CommonCfg.RtsThreshold)); + + return TRUE; +} + +/* + ========================================================================== + Description: + Set Fragment Threshold + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_FragThreshold_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh; + + FragThresh = simple_strtol(arg, 0, 10); + + if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD) + { + //Illegal FragThresh so we set it to default + pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD; + } + else if (FragThresh % 2 == 1) + { + // The length of each fragment shall always be an even number of octets, except for the last fragment + // of an MSDU or MMPDU, which may be either an even or an odd number of octets. + pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1); + } + else + { + pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh; + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (pAd->CommonCfg.FragmentThreshold == MAX_FRAG_THRESHOLD) + pAd->CommonCfg.bUseZeroToDisableFragment = TRUE; + else + pAd->CommonCfg.bUseZeroToDisableFragment = FALSE; + } +#endif // CONFIG_STA_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("Set_FragThreshold_Proc::(FragThreshold=%d)\n", pAd->CommonCfg.FragmentThreshold)); + + return TRUE; +} + +/* + ========================================================================== + Description: + Set TxBurst + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_TxBurst_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + LONG TxBurst; + + TxBurst = simple_strtol(arg, 0, 10); + if (TxBurst == 1) + pAd->CommonCfg.bEnableTxBurst = TRUE; + else if (TxBurst == 0) + pAd->CommonCfg.bEnableTxBurst = FALSE; + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_TxBurst_Proc::(TxBurst=%d)\n", pAd->CommonCfg.bEnableTxBurst)); + + return TRUE; +} + +#ifdef AGGREGATION_SUPPORT +/* + ========================================================================== + Description: + Set TxBurst + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_PktAggregate_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + LONG aggre; + + aggre = simple_strtol(arg, 0, 10); + + if (aggre == 1) + pAd->CommonCfg.bAggregationCapable = TRUE; + else if (aggre == 0) + pAd->CommonCfg.bAggregationCapable = FALSE; + else + return FALSE; //Invalid argument + + + DBGPRINT(RT_DEBUG_TRACE, ("Set_PktAggregate_Proc::(AGGRE=%d)\n", pAd->CommonCfg.bAggregationCapable)); + + return TRUE; +} +#endif + + +#ifdef INF_AMAZON_PPA +INT Set_INF_AMAZON_SE_PPA_Proc( + IN PRTMP_ADAPTER pAd, + IN PUCHAR arg) +{ + ULONG aggre; + UINT status; + + aggre = simple_strtol(arg, 0, 10); + + if (aggre == 1) + { + if(pAd->PPAEnable==TRUE) + { + printk("INF_AMAZON_SE_PPA already enabled \n"); + } + else + { + if (ppa_hook_directpath_register_dev_fn) + { + UINT32 g_if_id; + + if (pAd->pDirectpathCb == NULL) + { + pAd->pDirectpathCb = (PPA_DIRECTPATH_CB *) kmalloc (sizeof(PPA_DIRECTPATH_CB), GFP_ATOMIC); + printk("Realloc memory for pDirectpathCb ??\n"); + } + + /* register callback */ + pAd->pDirectpathCb->rx_fn = NULL; + pAd->pDirectpathCb->stop_tx_fn = NULL; + pAd->pDirectpathCb->start_tx_fn = NULL; + + status = ppa_hook_directpath_register_dev_fn(&g_if_id, pAd->net_dev, pAd->pDirectpathCb, PPA_F_DIRECTPATH_ETH_IF); + + if(status==1) + { + pAd->g_if_id=g_if_id; + printk("register INF_AMAZON_SE_PPA success :ret:%d id:%d:%d\n",status,pAd->g_if_id,g_if_id); + pAd->PPAEnable=TRUE; + } + else + { + printk("register INF_AMAZON_SE_PPA fail :ret:%d\n",status); + } + + } + else + { + printk("INF_AMAZON_SE_PPA enable fail : there is no INF_AMAZON_SE_PPA module . \n"); + } + } + + + } + else if (aggre == 0) + { + if(pAd->PPAEnable==FALSE) + { + +printk("INF_AMAZON_SE_PPA already disable \n"); + } + else + { + if (ppa_hook_directpath_register_dev_fn) + { + UINT32 g_if_id; + g_if_id=pAd->g_if_id; + printk("g_if_id=%d \n",pAd->g_if_id); + status=ppa_hook_directpath_register_dev_fn(&g_if_id, pAd->net_dev, NULL, PPA_F_DIRECTPATH_DEREGISTER); + + if(status==1) + { + pAd->g_if_id=0; + printk("unregister INF_AMAZON_SE_PPA success :ret:%d\n",status); + pAd->PPAEnable=FALSE; + } + else + { + printk("unregister INF_AMAZON_SE_PPA fail :ret:%d\n",status); + } + + } + else + { + printk("INF_AMAZON_SE_PPA enable fail : there is no INF_AMAZON_SE_PPA module . \n"); + } + } + + } + else + { + printk("Invalid argument %d \n",aggre); + return FALSE; //Invalid argument + } + + return TRUE; + +} +#endif // INF_AMAZON_PPA // + + +/* + ========================================================================== + Description: + Set IEEE80211H. + This parameter is 1 when needs radar detection, otherwise 0 + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_IEEE80211H_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + LONG ieee80211h; + + ieee80211h = simple_strtol(arg, 0, 10); + + if (ieee80211h == 1) + pAd->CommonCfg.bIEEE80211H = TRUE; + else if (ieee80211h == 0) + pAd->CommonCfg.bIEEE80211H = FALSE; + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_IEEE80211H_Proc::(IEEE80211H=%d)\n", pAd->CommonCfg.bIEEE80211H)); + + return TRUE; +} + + +#ifdef DBG +/* + ========================================================================== + Description: + For Debug information + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_Debug_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + DBGPRINT(RT_DEBUG_TRACE, ("==> Set_Debug_Proc *******************\n")); + + if(simple_strtol(arg, 0, 10) <= RT_DEBUG_LOUD) + RTDebugLevel = simple_strtol(arg, 0, 10); + + DBGPRINT(RT_DEBUG_TRACE, ("<== Set_Debug_Proc(RTDebugLevel = %ld)\n", RTDebugLevel)); + + return TRUE; +} +#endif + +INT Show_DescInfo_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ +#ifdef RTMP_MAC_PCI + INT i, QueIdx=0; +// ULONG RegValue; + PRT28XX_RXD_STRUC pRxD; + PTXD_STRUC pTxD; + PRTMP_TX_RING pTxRing = &pAd->TxRing[QueIdx]; + PRTMP_MGMT_RING pMgmtRing = &pAd->MgmtRing; + PRTMP_RX_RING pRxRing = &pAd->RxRing; + + for(i=0;i<TX_RING_SIZE;i++) + { + pTxD = (PTXD_STRUC) pTxRing->Cell[i].AllocVa; + DBGPRINT(RT_DEBUG_OFF, ("Desc #%d\n",i)); + hex_dump("Tx Descriptor", (PUCHAR)pTxD, 16); + DBGPRINT(RT_DEBUG_OFF, ("pTxD->DMADONE = %x\n", pTxD->DMADONE)); + } + DBGPRINT(RT_DEBUG_OFF, ("---------------------------------------------------\n")); + for(i=0;i<MGMT_RING_SIZE;i++) + { + pTxD = (PTXD_STRUC) pMgmtRing->Cell[i].AllocVa; + DBGPRINT(RT_DEBUG_OFF, ("Desc #%d\n",i)); + hex_dump("Mgmt Descriptor", (PUCHAR)pTxD, 16); + DBGPRINT(RT_DEBUG_OFF, ("pMgmt->DMADONE = %x\n", pTxD->DMADONE)); + } + DBGPRINT(RT_DEBUG_OFF, ("---------------------------------------------------\n")); + for(i=0;i<RX_RING_SIZE;i++) + { + pRxD = (PRT28XX_RXD_STRUC) pRxRing->Cell[i].AllocVa; + DBGPRINT(RT_DEBUG_OFF, ("Desc #%d\n",i)); + hex_dump("Rx Descriptor", (PUCHAR)pRxD, 16); + DBGPRINT(RT_DEBUG_OFF, ("pRxD->DDONE = %x\n", pRxD->DDONE)); + } +#endif // RTMP_MAC_PCI // + + return TRUE; +} + +/* + ========================================================================== + Description: + Reset statistics counter + + Arguments: + pAdapter Pointer to our adapter + arg + + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_ResetStatCounter_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + //UCHAR i; + //MAC_TABLE_ENTRY *pEntry; + + DBGPRINT(RT_DEBUG_TRACE, ("==>Set_ResetStatCounter_Proc\n")); + + // add the most up-to-date h/w raw counters into software counters + NICUpdateRawCounters(pAd); + + NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11)); + NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3)); + NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK)); + + // Reset HotSpot counter + + + return TRUE; +} + +/* + ======================================================================== + + Routine Description: + Add WPA key process. + In Adhoc WPANONE, bPairwise = 0; KeyIdx = 0; + + Arguments: + pAd Pointer to our adapter + pBuf Pointer to the where the key stored + + Return Value: + NDIS_SUCCESS Add key successfully + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ + +BOOLEAN RTMPCheckStrPrintAble( + IN CHAR *pInPutStr, + IN UCHAR strLen) +{ + UCHAR i=0; + + for (i=0; i<strLen; i++) + { + if ((pInPutStr[i] < 0x21) || + (pInPutStr[i] > 0x7E)) + return FALSE; + } + + return TRUE; +} + +/* + ======================================================================== + + Routine Description: + Remove WPA Key process + + Arguments: + pAd Pointer to our adapter + pBuf Pointer to the where the key stored + + Return Value: + NDIS_SUCCESS Add key successfully + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +#ifdef CONFIG_STA_SUPPORT +VOID RTMPSetDesiredRates( + IN PRTMP_ADAPTER pAdapter, + IN LONG Rates) +{ + NDIS_802_11_RATES aryRates; + + memset(&aryRates, 0x00, sizeof(NDIS_802_11_RATES)); + switch (pAdapter->CommonCfg.PhyMode) + { + case PHY_11A: // A only + switch (Rates) + { + case 6000000: //6M + aryRates[0] = 0x0c; // 6M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0; + break; + case 9000000: //9M + aryRates[0] = 0x12; // 9M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1; + break; + case 12000000: //12M + aryRates[0] = 0x18; // 12M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2; + break; + case 18000000: //18M + aryRates[0] = 0x24; // 18M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3; + break; + case 24000000: //24M + aryRates[0] = 0x30; // 24M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4; + break; + case 36000000: //36M + aryRates[0] = 0x48; // 36M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5; + break; + case 48000000: //48M + aryRates[0] = 0x60; // 48M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6; + break; + case 54000000: //54M + aryRates[0] = 0x6c; // 54M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7; + break; + case -1: //Auto + default: + aryRates[0] = 0x6c; // 54Mbps + aryRates[1] = 0x60; // 48Mbps + aryRates[2] = 0x48; // 36Mbps + aryRates[3] = 0x30; // 24Mbps + aryRates[4] = 0x24; // 18M + aryRates[5] = 0x18; // 12M + aryRates[6] = 0x12; // 9M + aryRates[7] = 0x0c; // 6M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; + break; + } + break; + case PHY_11BG_MIXED: // B/G Mixed + case PHY_11B: // B only + case PHY_11ABG_MIXED: // A/B/G Mixed + default: + switch (Rates) + { + case 1000000: //1M + aryRates[0] = 0x02; + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0; + break; + case 2000000: //2M + aryRates[0] = 0x04; + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1; + break; + case 5000000: //5.5M + aryRates[0] = 0x0b; // 5.5M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2; + break; + case 11000000: //11M + aryRates[0] = 0x16; // 11M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3; + break; + case 6000000: //6M + aryRates[0] = 0x0c; // 6M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_0; + break; + case 9000000: //9M + aryRates[0] = 0x12; // 9M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_1; + break; + case 12000000: //12M + aryRates[0] = 0x18; // 12M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_2; + break; + case 18000000: //18M + aryRates[0] = 0x24; // 18M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_3; + break; + case 24000000: //24M + aryRates[0] = 0x30; // 24M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_4; + break; + case 36000000: //36M + aryRates[0] = 0x48; // 36M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_5; + break; + case 48000000: //48M + aryRates[0] = 0x60; // 48M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_6; + break; + case 54000000: //54M + aryRates[0] = 0x6c; // 54M + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_7; + break; + case -1: //Auto + default: + if (pAdapter->CommonCfg.PhyMode == PHY_11B) + { //B Only + aryRates[0] = 0x16; // 11Mbps + aryRates[1] = 0x0b; // 5.5Mbps + aryRates[2] = 0x04; // 2Mbps + aryRates[3] = 0x02; // 1Mbps + } + else + { //(B/G) Mixed or (A/B/G) Mixed + aryRates[0] = 0x6c; // 54Mbps + aryRates[1] = 0x60; // 48Mbps + aryRates[2] = 0x48; // 36Mbps + aryRates[3] = 0x30; // 24Mbps + aryRates[4] = 0x16; // 11Mbps + aryRates[5] = 0x0b; // 5.5Mbps + aryRates[6] = 0x04; // 2Mbps + aryRates[7] = 0x02; // 1Mbps + } + pAdapter->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; + break; + } + break; + } + + NdisZeroMemory(pAdapter->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES); + NdisMoveMemory(pAdapter->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES)); + DBGPRINT(RT_DEBUG_TRACE, (" RTMPSetDesiredRates (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n", + pAdapter->CommonCfg.DesireRate[0],pAdapter->CommonCfg.DesireRate[1], + pAdapter->CommonCfg.DesireRate[2],pAdapter->CommonCfg.DesireRate[3], + pAdapter->CommonCfg.DesireRate[4],pAdapter->CommonCfg.DesireRate[5], + pAdapter->CommonCfg.DesireRate[6],pAdapter->CommonCfg.DesireRate[7] )); + // Changing DesiredRate may affect the MAX TX rate we used to TX frames out + MlmeUpdateTxRates(pAdapter, FALSE, 0); +} + +NDIS_STATUS RTMPWPARemoveKeyProc( + IN PRTMP_ADAPTER pAd, + IN PVOID pBuf) +{ + PNDIS_802_11_REMOVE_KEY pKey; + ULONG KeyIdx; + NDIS_STATUS Status = NDIS_STATUS_FAILURE; + BOOLEAN bTxKey; // Set the key as transmit key + BOOLEAN bPairwise; // Indicate the key is pairwise key + BOOLEAN bKeyRSC; // indicate the receive SC set by KeyRSC value. + // Otherwise, it will set by the NIC. + BOOLEAN bAuthenticator; // indicate key is set by authenticator. + INT i; + + DBGPRINT(RT_DEBUG_TRACE,("---> RTMPWPARemoveKeyProc\n")); + + pKey = (PNDIS_802_11_REMOVE_KEY) pBuf; + KeyIdx = pKey->KeyIndex & 0xff; + // Bit 31 of Add-key, Tx Key + bTxKey = (pKey->KeyIndex & 0x80000000) ? TRUE : FALSE; + // Bit 30 of Add-key PairwiseKey + bPairwise = (pKey->KeyIndex & 0x40000000) ? TRUE : FALSE; + // Bit 29 of Add-key KeyRSC + bKeyRSC = (pKey->KeyIndex & 0x20000000) ? TRUE : FALSE; + // Bit 28 of Add-key Authenticator + bAuthenticator = (pKey->KeyIndex & 0x10000000) ? TRUE : FALSE; + + // 1. If bTx is TRUE, return failure information + if (bTxKey == TRUE) + return(NDIS_STATUS_INVALID_DATA); + + // 2. Check Pairwise Key + if (bPairwise) + { + // a. If BSSID is broadcast, remove all pairwise keys. + // b. If not broadcast, remove the pairwise specified by BSSID + for (i = 0; i < SHARE_KEY_NUM; i++) + { + if (MAC_ADDR_EQUAL(pAd->SharedKey[BSS0][i].BssId, pKey->BSSID)) + { + DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%d)\n", i)); + pAd->SharedKey[BSS0][i].KeyLen = 0; + pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_NONE; + AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)i); + Status = NDIS_STATUS_SUCCESS; + break; + } + } + } + // 3. Group Key + else + { + // a. If BSSID is broadcast, remove all group keys indexed + // b. If BSSID matched, delete the group key indexed. + DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveKeyProc(KeyIdx=%ld)\n", KeyIdx)); + pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0; + pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE; + AsicRemoveSharedKeyEntry(pAd, BSS0, (UCHAR)KeyIdx); + Status = NDIS_STATUS_SUCCESS; + } + + return (Status); +} +#endif // CONFIG_STA_SUPPORT // + + +#ifdef CONFIG_STA_SUPPORT +/* + ======================================================================== + + Routine Description: + Remove All WPA Keys + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPWPARemoveAllKeys( + IN PRTMP_ADAPTER pAd) +{ + + UCHAR i; + + DBGPRINT(RT_DEBUG_TRACE,("RTMPWPARemoveAllKeys(AuthMode=%d, WepStatus=%d)\n", pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus)); +#ifdef PCIE_PS_SUPPORT + RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); +#endif // PCIE_PS_SUPPORT // + // For WEP/CKIP, there is no need to remove it, since WinXP won't set it again after + // Link up. And it will be replaced if user changed it. + if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA) + return; + + // For WPA-None, there is no need to remove it, since WinXP won't set it again after + // Link up. And it will be replaced if user changed it. + if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) + return; + + // set BSSID wcid entry of the Pair-wise Key table as no-security mode + AsicRemovePairwiseKeyEntry(pAd, BSSID_WCID); + + // set all shared key mode as no-security. + for (i = 0; i < SHARE_KEY_NUM; i++) + { + DBGPRINT(RT_DEBUG_TRACE,("remove %s key #%d\n", CipherName[pAd->SharedKey[BSS0][i].CipherAlg], i)); + NdisZeroMemory(&pAd->SharedKey[BSS0][i], sizeof(CIPHER_KEY)); + + AsicRemoveSharedKeyEntry(pAd, BSS0, i); + } +#ifdef PCIE_PS_SUPPORT + RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); +#endif // PCIE_PS_SUPPORT // + +} +#endif // CONFIG_STA_SUPPORT // + + +/* + ======================================================================== + + Routine Description: + As STA's BSSID is a WC too, it uses shared key table. + This function write correct unicast TX key to ASIC WCID. + And we still make a copy in our MacTab.Content[BSSID_WCID].PairwiseKey. + Caller guarantee TKIP/AES always has keyidx = 0. (pairwise key) + Caller guarantee WEP calls this function when set Txkey, default key index=0~3. + + Arguments: + pAd Pointer to our adapter + pKey Pointer to the where the key stored + + Return Value: + NDIS_SUCCESS Add key successfully + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +/* + ======================================================================== + Routine Description: + Change NIC PHY mode. Re-association may be necessary. possible settings + include - PHY_11B, PHY_11BG_MIXED, PHY_11A, and PHY_11ABG_MIXED + + Arguments: + pAd - Pointer to our adapter + phymode - + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ======================================================================== +*/ +VOID RTMPSetPhyMode( + IN PRTMP_ADAPTER pAd, + IN ULONG phymode) +{ + INT i; + // the selected phymode must be supported by the RF IC encoded in E2PROM + + // if no change, do nothing + /* bug fix + if (pAd->CommonCfg.PhyMode == phymode) + return; + */ + pAd->CommonCfg.PhyMode = (UCHAR)phymode; + + DBGPRINT(RT_DEBUG_TRACE,("RTMPSetPhyMode : PhyMode=%d, channel=%d \n", pAd->CommonCfg.PhyMode, pAd->CommonCfg.Channel)); +#ifdef EXT_BUILD_CHANNEL_LIST + BuildChannelListEx(pAd); +#else + BuildChannelList(pAd); +#endif // EXT_BUILD_CHANNEL_LIST // + + // sanity check user setting + for (i = 0; i < pAd->ChannelListNum; i++) + { + if (pAd->CommonCfg.Channel == pAd->ChannelList[i].Channel) + break; + } + + if (i == pAd->ChannelListNum) + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + pAd->CommonCfg.Channel = FirstChannel(pAd); +#endif // CONFIG_STA_SUPPORT // + DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetPhyMode: channel is out of range, use first channel=%d \n", pAd->CommonCfg.Channel)); + } + + NdisZeroMemory(pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES); + NdisZeroMemory(pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES); + NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES); + switch (phymode) { + case PHY_11B: + pAd->CommonCfg.SupRate[0] = 0x82; // 1 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[1] = 0x84; // 2 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[2] = 0x8B; // 5.5 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[3] = 0x96; // 11 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRateLen = 4; + pAd->CommonCfg.ExtRateLen = 0; + pAd->CommonCfg.DesireRate[0] = 2; // 1 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[1] = 4; // 2 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[2] = 11; // 5.5 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[3] = 22; // 11 mbps, in units of 0.5 Mbps + //pAd->CommonCfg.HTPhyMode.field.MODE = MODE_CCK; // This MODE is only FYI. not use + break; + + case PHY_11G: + case PHY_11BG_MIXED: + case PHY_11ABG_MIXED: +#ifdef DOT11_N_SUPPORT + case PHY_11N_2_4G: + case PHY_11ABGN_MIXED: + case PHY_11BGN_MIXED: + case PHY_11GN_MIXED: +#endif // DOT11_N_SUPPORT // + pAd->CommonCfg.SupRate[0] = 0x82; // 1 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[1] = 0x84; // 2 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[2] = 0x8B; // 5.5 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[3] = 0x96; // 11 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[4] = 0x12; // 9 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRate[5] = 0x24; // 18 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRate[6] = 0x48; // 36 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRateLen = 8; + pAd->CommonCfg.ExtRate[0] = 0x0C; // 6 mbps, in units of 0.5 Mbps + pAd->CommonCfg.ExtRate[1] = 0x18; // 12 mbps, in units of 0.5 Mbps + pAd->CommonCfg.ExtRate[2] = 0x30; // 24 mbps, in units of 0.5 Mbps + pAd->CommonCfg.ExtRate[3] = 0x60; // 48 mbps, in units of 0.5 Mbps + pAd->CommonCfg.ExtRateLen = 4; + pAd->CommonCfg.DesireRate[0] = 2; // 1 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[1] = 4; // 2 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[2] = 11; // 5.5 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[3] = 22; // 11 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[4] = 12; // 6 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[5] = 18; // 9 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[6] = 24; // 12 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[7] = 36; // 18 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[8] = 48; // 24 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[9] = 72; // 36 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[10] = 96; // 48 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[11] = 108; // 54 mbps, in units of 0.5 Mbps + break; + + case PHY_11A: +#ifdef DOT11_N_SUPPORT + case PHY_11AN_MIXED: + case PHY_11AGN_MIXED: + case PHY_11N_5G: +#endif // DOT11_N_SUPPORT // + pAd->CommonCfg.SupRate[0] = 0x8C; // 6 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRate[2] = 0x98; // 12 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRate[4] = 0xb0; // 24 mbps, in units of 0.5 Mbps, basic rate + pAd->CommonCfg.SupRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps + pAd->CommonCfg.SupRateLen = 8; + pAd->CommonCfg.ExtRateLen = 0; + pAd->CommonCfg.DesireRate[0] = 12; // 6 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[1] = 18; // 9 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[2] = 24; // 12 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[3] = 36; // 18 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[4] = 48; // 24 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[5] = 72; // 36 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[6] = 96; // 48 mbps, in units of 0.5 Mbps + pAd->CommonCfg.DesireRate[7] = 108; // 54 mbps, in units of 0.5 Mbps + //pAd->CommonCfg.HTPhyMode.field.MODE = MODE_OFDM; // This MODE is only FYI. not use + break; + + default: + break; + } + + + pAd->CommonCfg.BandState = UNKNOWN_BAND; +} + + +#ifdef DOT11_N_SUPPORT +/* + ======================================================================== + Routine Description: + Caller ensures we has 802.11n support. + Calls at setting HT from AP/STASetinformation + + Arguments: + pAd - Pointer to our adapter + phymode - + + ======================================================================== +*/ +VOID RTMPSetHT( + IN PRTMP_ADAPTER pAd, + IN OID_SET_HT_PHYMODE *pHTPhyMode) +{ + //ULONG *pmcs; + UINT32 Value = 0; + UCHAR BBPValue = 0; + UCHAR BBP3Value = 0; + UCHAR RxStream = pAd->CommonCfg.RxStream; + + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : HT_mode(%d), ExtOffset(%d), MCS(%d), BW(%d), STBC(%d), SHORTGI(%d)\n", + pHTPhyMode->HtMode, pHTPhyMode->ExtOffset, + pHTPhyMode->MCS, pHTPhyMode->BW, + pHTPhyMode->STBC, pHTPhyMode->SHORTGI)); + + // Don't zero supportedHyPhy structure. + RTMPZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability)); + RTMPZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo)); + RTMPZeroMemory(&pAd->CommonCfg.NewExtChanOffset, sizeof(pAd->CommonCfg.NewExtChanOffset)); + RTMPZeroMemory(&pAd->CommonCfg.DesiredHtPhy, sizeof(pAd->CommonCfg.DesiredHtPhy)); + + if (pAd->CommonCfg.bRdg) + { + pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 1; + pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 1; + } + else + { + pAd->CommonCfg.HtCapability.ExtHtCapInfo.PlusHTC = 0; + pAd->CommonCfg.HtCapability.ExtHtCapInfo.RDGSupport = 0; + } + + pAd->CommonCfg.HtCapability.HtCapParm.MaxRAmpduFactor = 3; + pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor = 3; + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : RxBAWinLimit = %d\n", pAd->CommonCfg.BACapability.field.RxBAWinLimit)); + + // Mimo power save, A-MSDU size, + pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable; + pAd->CommonCfg.DesiredHtPhy.AmsduSize = (UCHAR)pAd->CommonCfg.BACapability.field.AmsduSize; + pAd->CommonCfg.DesiredHtPhy.MimoPs = (UCHAR)pAd->CommonCfg.BACapability.field.MMPSmode; + pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity; + + pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize; + pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode; + pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity; + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetHT : AMsduSize = %d, MimoPs = %d, MpduDensity = %d, MaxRAmpduFactor = %d\n", + pAd->CommonCfg.DesiredHtPhy.AmsduSize, + pAd->CommonCfg.DesiredHtPhy.MimoPs, + pAd->CommonCfg.DesiredHtPhy.MpduDensity, + pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor)); + + if(pHTPhyMode->HtMode == HTMODE_GF) + { + pAd->CommonCfg.HtCapability.HtCapInfo.GF = 1; + pAd->CommonCfg.DesiredHtPhy.GF = 1; + } + else + pAd->CommonCfg.DesiredHtPhy.GF = 0; + + // Decide Rx MCSSet + switch (RxStream) + { + case 1: + pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff; + pAd->CommonCfg.HtCapability.MCSSet[1] = 0x00; + break; + + case 2: + pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff; + pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff; + break; + + case 3: // 3*3 + pAd->CommonCfg.HtCapability.MCSSet[0] = 0xff; + pAd->CommonCfg.HtCapability.MCSSet[1] = 0xff; + pAd->CommonCfg.HtCapability.MCSSet[2] = 0xff; + break; + } + + if (pAd->CommonCfg.bForty_Mhz_Intolerant && (pHTPhyMode->BW == BW_40) /* && (pAd->CommonCfg.Channel <= 14)*/) + { + pHTPhyMode->BW = BW_20; + pAd->CommonCfg.HtCapability.HtCapInfo.Forty_Mhz_Intolerant = 1; + } + + if(pHTPhyMode->BW == BW_40) + { + pAd->CommonCfg.HtCapability.MCSSet[4] = 0x1; // MCS 32 + pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 1; + if (pAd->CommonCfg.Channel <= 14) + pAd->CommonCfg.HtCapability.HtCapInfo.CCKmodein40 = 1; + + pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 1; + pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 1; + pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = (pHTPhyMode->ExtOffset == EXTCHA_BELOW)? (EXTCHA_BELOW): EXTCHA_ABOVE; + // Set Regsiter for extension channel position. + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBP3Value); + if ((pHTPhyMode->ExtOffset == EXTCHA_BELOW)) + { + Value |= 0x1; + BBP3Value |= (0x20); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + } + else if ((pHTPhyMode->ExtOffset == EXTCHA_ABOVE)) + { + Value &= 0xfe; + BBP3Value &= (~0x20); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + } + + // Turn on BBP 40MHz mode now only as AP . + // Sta can turn on BBP 40MHz after connection with 40MHz AP. Sta only broadcast 40MHz capability before connection. + if ((pAd->OpMode == OPMODE_AP) || INFRA_ON(pAd) || ADHOC_ON(pAd) + ) + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue &= (~0x18); + BBPValue |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBP3Value); + pAd->CommonCfg.BBPCurrentBW = BW_40; + } + } + else + { + pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth = 0; + pAd->CommonCfg.DesiredHtPhy.ChannelWidth = 0; + pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth = 0; + pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset = EXTCHA_NONE; + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; + // Turn on BBP 20MHz mode by request here. + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + pAd->CommonCfg.BBPCurrentBW = BW_20; + } + } + + if(pHTPhyMode->STBC == STBC_USE) + { + pAd->CommonCfg.HtCapability.HtCapInfo.TxSTBC = 1; + pAd->CommonCfg.DesiredHtPhy.TxSTBC = 1; + pAd->CommonCfg.HtCapability.HtCapInfo.RxSTBC = 1; + pAd->CommonCfg.DesiredHtPhy.RxSTBC = 1; + } + else + { + pAd->CommonCfg.DesiredHtPhy.TxSTBC = 0; + pAd->CommonCfg.DesiredHtPhy.RxSTBC = 0; + } + + if(pHTPhyMode->SHORTGI == GI_400) + { + pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 1; + pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 1; + pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 1; + pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 1; + } + else + { + pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor20 = 0; + pAd->CommonCfg.HtCapability.HtCapInfo.ShortGIfor40 = 0; + pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 = 0; + pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 = 0; + } + + // We support link adaptation for unsolicit MCS feedback, set to 2. +#ifdef RT2883_TEMP_PATCH + pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_MRQ; //MCSFBK_UNSOLICIT; +#else + pAd->CommonCfg.HtCapability.ExtHtCapInfo.MCSFeedback = MCSFBK_NONE; //MCSFBK_UNSOLICIT; +#endif // RT2883_TEMP_PATCH // + pAd->CommonCfg.AddHTInfo.ControlChan = pAd->CommonCfg.Channel; + // 1, the extension channel above the control channel. + + // EDCA parameters used for AP's own transmission + if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) + { + pAd->CommonCfg.APEdcaParm.bValid = TRUE; + pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3; + pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7; + pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1; + pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1; + + pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4; + pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4; + pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3; + pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2; + + pAd->CommonCfg.APEdcaParm.Cwmax[0] = 6; + pAd->CommonCfg.APEdcaParm.Cwmax[1] = 10; + pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4; + pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3; + + pAd->CommonCfg.APEdcaParm.Txop[0] = 0; + pAd->CommonCfg.APEdcaParm.Txop[1] = 0; + pAd->CommonCfg.APEdcaParm.Txop[2] = 94; + pAd->CommonCfg.APEdcaParm.Txop[3] = 47; + } + AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm); + + +#ifdef RT2883_TEMP_PATCH + pAd->CommonCfg.HtCapability.TxBFCap.TxSoundCapable = TRUE; +#endif // RT2883_TEMP_PATCH // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + RTMPSetIndividualHT(pAd, 0); + } +#endif // CONFIG_STA_SUPPORT // + +} + +/* + ======================================================================== + Routine Description: + Caller ensures we has 802.11n support. + Calls at setting HT from AP/STASetinformation + + Arguments: + pAd - Pointer to our adapter + phymode - + + ======================================================================== +*/ +VOID RTMPSetIndividualHT( + IN PRTMP_ADAPTER pAd, + IN UCHAR apidx) +{ + PRT_HT_PHY_INFO pDesired_ht_phy = NULL; + UCHAR TxStream = pAd->CommonCfg.TxStream; + UCHAR DesiredMcs = MCS_AUTO; + UCHAR encrypt_mode = Ndis802_11EncryptionDisabled; + + do + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pDesired_ht_phy = &pAd->StaCfg.DesiredHtPhyInfo; + DesiredMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS; + encrypt_mode = pAd->StaCfg.WepStatus; + //pAd->StaCfg.bAutoTxRateSwitch = (DesiredMcs == MCS_AUTO) ? TRUE : FALSE; + break; + } +#endif // CONFIG_STA_SUPPORT // + } while (FALSE); + + if (pDesired_ht_phy == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("RTMPSetIndividualHT: invalid apidx(%d)\n", apidx)); + return; + } + RTMPZeroMemory(pDesired_ht_phy, sizeof(RT_HT_PHY_INFO)); + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetIndividualHT : Desired MCS = %d\n", DesiredMcs)); + // Check the validity of MCS + if ((TxStream == 1) && ((DesiredMcs >= MCS_8) && (DesiredMcs <= MCS_15))) + { + DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS(%d) is invalid in 1S, reset it as MCS_7\n", DesiredMcs)); + DesiredMcs = MCS_7; + } + + if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_20) && (DesiredMcs == MCS_32)) + { + DBGPRINT(RT_DEBUG_WARN, ("RTMPSetIndividualHT: MCS_32 is only supported in 40-MHz, reset it as MCS_0\n")); + DesiredMcs = MCS_0; + } + +#ifdef CONFIG_STA_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && (pAd->StaCfg.BssType == BSS_INFRA) && (apidx == MIN_NET_DEVICE_FOR_MBSSID)) + ; + else +#endif // CONFIG_STA_SUPPORT // + /* + WFA recommend to restrict the encryption type in 11n-HT mode. + So, the WEP and TKIP are not allowed in HT rate. + */ + if (pAd->CommonCfg.HT_DisallowTKIP && IS_INVALID_HT_SECURITY(encrypt_mode)) + { + DBGPRINT(RT_DEBUG_WARN, ("%s : Use legacy rate in WEP/TKIP encryption mode (apidx=%d)\n", + __FUNCTION__, apidx)); + return; + } + + if (pAd->CommonCfg.HT_Disable) + { +#ifdef CONFIG_STA_SUPPORT + pAd->StaCfg.bAdhocN = FALSE; +#endif // CONFIG_STA_SUPPORT // + DBGPRINT(RT_DEBUG_TRACE, ("%s : HT is disabled\n", __FUNCTION__)); + return; + } + + pDesired_ht_phy->bHtEnable = TRUE; + + // Decide desired Tx MCS + switch (TxStream) + { + case 1: + if (DesiredMcs == MCS_AUTO) + { + pDesired_ht_phy->MCSSet[0]= 0xff; + pDesired_ht_phy->MCSSet[1]= 0x00; + } + else if (DesiredMcs <= MCS_7) + { + pDesired_ht_phy->MCSSet[0]= 1<<DesiredMcs; + pDesired_ht_phy->MCSSet[1]= 0x00; + } + break; + + case 2: + if (DesiredMcs == MCS_AUTO) + { + pDesired_ht_phy->MCSSet[0]= 0xff; + pDesired_ht_phy->MCSSet[1]= 0xff; + } + else if (DesiredMcs <= MCS_15) + { + ULONG mode; + + mode = DesiredMcs / 8; + if (mode < 2) + pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8)); + } + break; + + case 3: // 3*3 + if (DesiredMcs == MCS_AUTO) + { + /* MCS0 ~ MCS23, 3 bytes */ + pDesired_ht_phy->MCSSet[0]= 0xff; + pDesired_ht_phy->MCSSet[1]= 0xff; + pDesired_ht_phy->MCSSet[2]= 0xff; + } + else if (DesiredMcs <= MCS_23) + { + ULONG mode; + + mode = DesiredMcs / 8; + if (mode < 3) + pDesired_ht_phy->MCSSet[mode] = (1 << (DesiredMcs - mode * 8)); + } + break; + } + + if(pAd->CommonCfg.DesiredHtPhy.ChannelWidth == BW_40) + { + if (DesiredMcs == MCS_AUTO || DesiredMcs == MCS_32) + pDesired_ht_phy->MCSSet[4] = 0x1; + } + + // update HT Rate setting + if (pAd->OpMode == OPMODE_STA) + MlmeUpdateHtTxRates(pAd, BSS0); + else + MlmeUpdateHtTxRates(pAd, apidx); +} + + +/* + ======================================================================== + Routine Description: + Update HT IE from our capability. + + Arguments: + Send all HT IE in beacon/probe rsp/assoc rsp/action frame. + + + ======================================================================== +*/ +VOID RTMPUpdateHTIE( + IN RT_HT_CAPABILITY *pRtHt, + IN UCHAR *pMcsSet, + OUT HT_CAPABILITY_IE *pHtCapability, + OUT ADD_HT_INFO_IE *pAddHtInfo) +{ + RTMPZeroMemory(pHtCapability, sizeof(HT_CAPABILITY_IE)); + RTMPZeroMemory(pAddHtInfo, sizeof(ADD_HT_INFO_IE)); + + pHtCapability->HtCapInfo.ChannelWidth = pRtHt->ChannelWidth; + pHtCapability->HtCapInfo.MimoPs = pRtHt->MimoPs; + pHtCapability->HtCapInfo.GF = pRtHt->GF; + pHtCapability->HtCapInfo.ShortGIfor20 = pRtHt->ShortGIfor20; + pHtCapability->HtCapInfo.ShortGIfor40 = pRtHt->ShortGIfor40; + pHtCapability->HtCapInfo.TxSTBC = pRtHt->TxSTBC; + pHtCapability->HtCapInfo.RxSTBC = pRtHt->RxSTBC; + pHtCapability->HtCapInfo.AMsduSize = pRtHt->AmsduSize; + pHtCapability->HtCapParm.MaxRAmpduFactor = pRtHt->MaxRAmpduFactor; + pHtCapability->HtCapParm.MpduDensity = pRtHt->MpduDensity; + + pAddHtInfo->AddHtInfo.ExtChanOffset = pRtHt->ExtChanOffset ; + pAddHtInfo->AddHtInfo.RecomWidth = pRtHt->RecomWidth; + pAddHtInfo->AddHtInfo2.OperaionMode = pRtHt->OperaionMode; + pAddHtInfo->AddHtInfo2.NonGfPresent = pRtHt->NonGfPresent; + RTMPMoveMemory(pAddHtInfo->MCSSet, /*pRtHt->MCSSet*/pMcsSet, 4); // rt2860 only support MCS max=32, no need to copy all 16 uchar. + + DBGPRINT(RT_DEBUG_TRACE,("RTMPUpdateHTIE <== \n")); +} +#endif // DOT11_N_SUPPORT // + +/* + ======================================================================== + Description: + Add Client security information into ASIC WCID table and IVEIV table. + Return: + ======================================================================== +*/ +VOID RTMPAddWcidAttributeEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIdx, + IN UCHAR KeyIdx, + IN UCHAR CipherAlg, + IN MAC_TABLE_ENTRY *pEntry) +{ + UINT32 WCIDAttri = 0; + USHORT offset; + UCHAR IVEIV = 0; + USHORT Wcid = 0; + + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (BssIdx > BSS0) + { + DBGPRINT(RT_DEBUG_ERROR, ("RTMPAddWcidAttributeEntry: The BSS-index(%d) is out of range for Infra link. \n", BssIdx)); + return; + } + + // 1. In ADHOC mode, the AID is wcid number. And NO mesh link exists. + // 2. In Infra mode, the AID:1 MUST be wcid of infra STA. + // the AID:2~ assign to mesh link entry. + if (pEntry) + Wcid = pEntry->Aid; + else + Wcid = MCAST_WCID; + } +#endif // CONFIG_STA_SUPPORT // + } + + // Update WCID attribute table + offset = MAC_WCID_ATTRIBUTE_BASE + (Wcid * HW_WCID_ATTRI_SIZE); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (pEntry && IS_ENTRY_MESH(pEntry)) + WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE; +#if defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT) + else if ((pEntry) && (IS_ENTRY_DLS(pEntry) || IS_ENTRY_TDLS(pEntry)) && + ((CipherAlg == CIPHER_TKIP) || + (CipherAlg == CIPHER_AES) || + (CipherAlg == CIPHER_NONE))) + WCIDAttri = (CipherAlg<<1) | PAIRWISEKEYTABLE; +#endif + else + WCIDAttri = (CipherAlg<<1) | SHAREDKEYTABLE; + } +#endif // CONFIG_STA_SUPPORT // + + RTMP_IO_WRITE32(pAd, offset, WCIDAttri); + + + // Update IV/EIV table + offset = MAC_IVEIV_TABLE_BASE + (Wcid * HW_IVEIV_ENTRY_SIZE); + + // WPA mode + if ((CipherAlg == CIPHER_TKIP) || (CipherAlg == CIPHER_AES)) + { + // Eiv bit on. keyid always is 0 for pairwise key + IVEIV = (KeyIdx <<6) | 0x20; + } + else + { + // WEP KeyIdx is default tx key. + IVEIV = (KeyIdx << 6); + } + + // For key index and ext IV bit, so only need to update the position(offset+3). +#ifdef RTMP_MAC_PCI + RTMP_IO_WRITE8(pAd, offset+3, IVEIV); +#endif // RTMP_MAC_PCI // + + DBGPRINT(RT_DEBUG_TRACE,("RTMPAddWcidAttributeEntry: WCID #%d, KeyIndex #%d, Alg=%s\n",Wcid, KeyIdx, CipherName[CipherAlg])); + DBGPRINT(RT_DEBUG_TRACE,(" WCIDAttri = 0x%x \n", WCIDAttri)); + +} + +/* + ========================================================================== + Description: + Parse encryption type +Arguments: + pAdapter Pointer to our adapter + wrq Pointer to the ioctl argument + + Return Value: + None + + Note: + ========================================================================== +*/ +PSTRING GetEncryptType(CHAR enc) +{ + if(enc == Ndis802_11WEPDisabled) + return "NONE"; + if(enc == Ndis802_11WEPEnabled) + return "WEP"; + if(enc == Ndis802_11Encryption2Enabled) + return "TKIP"; + if(enc == Ndis802_11Encryption3Enabled) + return "AES"; + if(enc == Ndis802_11Encryption4Enabled) + return "TKIPAES"; + else + return "UNKNOW"; +} + +PSTRING GetAuthMode(CHAR auth) +{ + if(auth == Ndis802_11AuthModeOpen) + return "OPEN"; + if(auth == Ndis802_11AuthModeShared) + return "SHARED"; + if(auth == Ndis802_11AuthModeAutoSwitch) + return "AUTOWEP"; + if(auth == Ndis802_11AuthModeWPA) + return "WPA"; + if(auth == Ndis802_11AuthModeWPAPSK) + return "WPAPSK"; + if(auth == Ndis802_11AuthModeWPANone) + return "WPANONE"; + if(auth == Ndis802_11AuthModeWPA2) + return "WPA2"; + if(auth == Ndis802_11AuthModeWPA2PSK) + return "WPA2PSK"; + if(auth == Ndis802_11AuthModeWPA1WPA2) + return "WPA1WPA2"; + if(auth == Ndis802_11AuthModeWPA1PSKWPA2PSK) + return "WPA1PSKWPA2PSK"; + + return "UNKNOW"; +} + + +/* + ========================================================================== + Description: + Get site survey results + Arguments: + pAdapter Pointer to our adapter + wrq Pointer to the ioctl argument + + Return Value: + None + + Note: + Usage: + 1.) UI needs to wait 4 seconds after issue a site survey command + 2.) iwpriv ra0 get_site_survey + 3.) UI needs to prepare at least 4096bytes to get the results + ========================================================================== +*/ +#define LINE_LEN (4+33+20+23+9+7+7+3) // Channel+SSID+Bssid+Security+Signal+WiressMode+ExtCh+NetworkType +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // +VOID RTMPCommSiteSurveyData( + IN PSTRING msg, + IN PBSS_ENTRY pBss) +{ + INT Rssi = 0; + UINT Rssi_Quality = 0; + NDIS_802_11_NETWORK_TYPE wireless_mode; + CHAR Ssid[MAX_LEN_OF_SSID +1]; + STRING SecurityStr[32] = {0}; + NDIS_802_11_ENCRYPTION_STATUS ap_cipher = Ndis802_11EncryptionDisabled; + NDIS_802_11_AUTHENTICATION_MODE ap_auth_mode = Ndis802_11AuthModeOpen; + + //Channel + sprintf(msg+strlen(msg),"%-4d", pBss->Channel); + + //SSID + NdisZeroMemory(Ssid, (MAX_LEN_OF_SSID +1)); + if (RTMPCheckStrPrintAble((PCHAR)pBss->Ssid, pBss->SsidLen)) + NdisMoveMemory(Ssid, pBss->Ssid, pBss->SsidLen); + else + { + INT idx = 0; + for (idx = 0; idx < 16; idx++) + sprintf(Ssid, "%s%02X", Ssid, pBss->Ssid[idx]); + } + sprintf(msg+strlen(msg),"%-33s", Ssid); + + //BSSID + sprintf(msg+strlen(msg),"%02x:%02x:%02x:%02x:%02x:%02x ", + pBss->Bssid[0], + pBss->Bssid[1], + pBss->Bssid[2], + pBss->Bssid[3], + pBss->Bssid[4], + pBss->Bssid[5]); + + //Security + if ((Ndis802_11AuthModeWPA <= pBss->AuthMode) && + (pBss->AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK)) + { + if (pBss->AuthMode == Ndis802_11AuthModeWPANone) + { + ap_auth_mode = pBss->AuthMode; + ap_cipher = pBss->WPA.PairCipher; + } + else if (pBss->AuthModeAux == Ndis802_11AuthModeOpen) + { + ap_auth_mode = pBss->AuthMode; + if ((ap_auth_mode == Ndis802_11AuthModeWPA) || + (ap_auth_mode == Ndis802_11AuthModeWPAPSK)) + { + if (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled) + ap_cipher = pBss->WPA.PairCipher; + else + ap_cipher = Ndis802_11Encryption4Enabled; + } + else if ((ap_auth_mode == Ndis802_11AuthModeWPA2) || + (ap_auth_mode == Ndis802_11AuthModeWPA2PSK)) + { + if (pBss->WPA2.PairCipherAux == Ndis802_11WEPDisabled) + ap_cipher = pBss->WPA2.PairCipher; + else + ap_cipher = Ndis802_11Encryption4Enabled; + } + } + else if ((pBss->AuthMode == Ndis802_11AuthModeWPAPSK) || + (pBss->AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + if ((pBss->AuthModeAux == Ndis802_11AuthModeWPAPSK) || + (pBss->AuthModeAux == Ndis802_11AuthModeWPA2PSK)) + ap_auth_mode = Ndis802_11AuthModeWPA1PSKWPA2PSK; + else + ap_auth_mode = pBss->AuthMode; + + if (pBss->WPA.PairCipher != pBss->WPA2.PairCipher) + ap_cipher = Ndis802_11Encryption4Enabled; + else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) && + (pBss->WPA.PairCipherAux != pBss->WPA2.PairCipherAux)) + ap_cipher = Ndis802_11Encryption4Enabled; + else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) && + (pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) && + (pBss->WPA.PairCipherAux != Ndis802_11WEPDisabled)) + ap_cipher = Ndis802_11Encryption4Enabled; + else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) && + (pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) && + (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled)) + ap_cipher = pBss->WPA.PairCipher; + } + else if ((pBss->AuthMode == Ndis802_11AuthModeWPA) || + (pBss->AuthMode == Ndis802_11AuthModeWPA2)) + { + if ((pBss->AuthModeAux == Ndis802_11AuthModeWPA) || + (pBss->AuthMode == Ndis802_11AuthModeWPA2)) + ap_auth_mode = Ndis802_11AuthModeWPA1WPA2; + else + ap_auth_mode = pBss->AuthMode; + + if (pBss->WPA.PairCipher != pBss->WPA2.PairCipher) + ap_cipher = Ndis802_11Encryption4Enabled; + else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) && + (pBss->WPA.PairCipherAux != pBss->WPA2.PairCipherAux)) + ap_cipher = Ndis802_11Encryption4Enabled; + else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) && + (pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) && + (pBss->WPA.PairCipherAux != Ndis802_11WEPDisabled)) + ap_cipher = Ndis802_11Encryption4Enabled; + else if ((pBss->WPA.PairCipher == pBss->WPA2.PairCipher) && + (pBss->WPA.PairCipherAux == pBss->WPA2.PairCipherAux) && + (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled)) + ap_cipher = pBss->WPA.PairCipher; + } + + sprintf(SecurityStr, "%s/%s", GetAuthMode((CHAR)ap_auth_mode), GetEncryptType((CHAR)ap_cipher)); + } + else + { + ap_auth_mode = pBss->AuthMode; + ap_cipher = pBss->WepStatus; + if (ap_cipher == Ndis802_11WEPDisabled) + sprintf(SecurityStr, "NONE"); + else if (ap_cipher == Ndis802_11WEPEnabled) + sprintf(SecurityStr, "WEP"); + else + sprintf(SecurityStr, "%s/%s", GetAuthMode((CHAR)ap_auth_mode), GetEncryptType((CHAR)ap_cipher)); + } + + sprintf(msg+strlen(msg), "%-23s", SecurityStr); + + // Rssi + Rssi = (INT)pBss->Rssi; + if (Rssi >= -50) + Rssi_Quality = 100; + else if (Rssi >= -80) // between -50 ~ -80dbm + Rssi_Quality = (UINT)(24 + ((Rssi + 80) * 26)/10); + else if (Rssi >= -90) // between -80 ~ -90dbm + Rssi_Quality = (UINT)(((Rssi + 90) * 26)/10); + else // < -84 dbm + Rssi_Quality = 0; + sprintf(msg+strlen(msg),"%-9d", Rssi_Quality); + // Wireless Mode + wireless_mode = NetworkTypeInUseSanity(pBss); + if (wireless_mode == Ndis802_11FH || + wireless_mode == Ndis802_11DS) + sprintf(msg+strlen(msg),"%-7s", "11b"); + else if (wireless_mode == Ndis802_11OFDM5) + sprintf(msg+strlen(msg),"%-7s", "11a"); + else if (wireless_mode == Ndis802_11OFDM5_N) + sprintf(msg+strlen(msg),"%-7s", "11a/n"); + else if (wireless_mode == Ndis802_11OFDM24) + sprintf(msg+strlen(msg),"%-7s", "11b/g"); + else if (wireless_mode == Ndis802_11OFDM24_N) + sprintf(msg+strlen(msg),"%-7s", "11b/g/n"); + else + sprintf(msg+strlen(msg),"%-7s", "unknow"); + + // Ext Channel + if (pBss->AddHtInfoLen > 0) + { + if (pBss->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE) + sprintf(msg+strlen(msg),"%-7s", " ABOVE"); + else if (pBss->AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW) + sprintf(msg+strlen(msg),"%-7s", " BELOW"); + else + sprintf(msg+strlen(msg),"%-7s", " NONE"); + } + else + { + sprintf(msg+strlen(msg),"%-7s", " NONE"); + } + + //Network Type + if (pBss->BssType == BSS_ADHOC) + sprintf(msg+strlen(msg),"%-3s", " Ad"); + else + sprintf(msg+strlen(msg),"%-3s", " In"); + + sprintf(msg+strlen(msg),"\n"); + + return; +} + +#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT) +VOID RTMPIoctlGetSiteSurvey( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq) +{ + PSTRING msg; + INT i=0; + INT WaitCnt; + INT Status=0; + INT max_len = LINE_LEN; + PBSS_ENTRY pBss; + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + os_alloc_mem(NULL, (PUCHAR *)&msg, sizeof(CHAR)*((MAX_LEN_OF_BSS_TABLE)*max_len)); + + if (msg == NULL) + { + DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - msg memory alloc fail.\n")); + return; + } + + memset(msg, 0 ,(MAX_LEN_OF_BSS_TABLE)*max_len ); + sprintf(msg,"%s","\n"); + sprintf(msg+strlen(msg),"%-4s%-33s%-20s%-23s%-9s%-7s%-7s%-3s\n", + "Ch", "SSID", "BSSID", "Security", "Siganl(%)", "W-Mode", " ExtCH"," NT"); + + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + WaitCnt = 0; +#ifdef CONFIG_STA_SUPPORT + pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE; + while ((ScanRunning(pAdapter) == TRUE) && (WaitCnt++ < 200)) + OS_WAIT(500); +#endif // CONFIG_STA_SUPPORT // + + for(i=0; i<pAdapter->ScanTab.BssNr ;i++) + { + pBss = &pAdapter->ScanTab.BssEntry[i]; + + if( pBss->Channel==0) + break; + + if((strlen(msg)+max_len ) >= IW_SCAN_MAX_DATA) + break; + + + RTMPCommSiteSurveyData(msg, pBss); + + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + } + +#ifdef CONFIG_STA_SUPPORT + pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE; +#endif // CONFIG_STA_SUPPORT // + wrq->u.data.length = strlen(msg); + Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPIoctlGetSiteSurvey - wrq->u.data.length = %d\n", wrq->u.data.length)); + os_free_mem(NULL, (PUCHAR)msg); +} +#endif + +#define MAC_LINE_LEN (14+4+4+10+10+10+6+6) // Addr+aid+psm+datatime+rxbyte+txbyte+current tx rate+last tx rate +VOID RTMPIoctlGetMacTable( + IN PRTMP_ADAPTER pAd, + IN struct iwreq *wrq) +{ + INT i; + RT_802_11_MAC_TABLE MacTab; + char *msg; + + MacTab.Num = 0; + for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) + { + if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i]) && (pAd->MacTab.Content[i].Sst == SST_ASSOC)) + { + COPY_MAC_ADDR(MacTab.Entry[MacTab.Num].Addr, &pAd->MacTab.Content[i].Addr); + MacTab.Entry[MacTab.Num].Aid = (UCHAR)pAd->MacTab.Content[i].Aid; + MacTab.Entry[MacTab.Num].Psm = pAd->MacTab.Content[i].PsMode; +#ifdef DOT11_N_SUPPORT + MacTab.Entry[MacTab.Num].MimoPs = pAd->MacTab.Content[i].MmpsMode; +#endif // DOT11_N_SUPPORT // + + // Fill in RSSI per entry + MacTab.Entry[MacTab.Num].AvgRssi0 = pAd->MacTab.Content[i].RssiSample.AvgRssi0; + MacTab.Entry[MacTab.Num].AvgRssi1 = pAd->MacTab.Content[i].RssiSample.AvgRssi1; + MacTab.Entry[MacTab.Num].AvgRssi2 = pAd->MacTab.Content[i].RssiSample.AvgRssi2; + + // the connected time per entry + MacTab.Entry[MacTab.Num].ConnectedTime = pAd->MacTab.Content[i].StaConnectTime; + MacTab.Entry[MacTab.Num].TxRate.field.MCS = pAd->MacTab.Content[i].HTPhyMode.field.MCS; + MacTab.Entry[MacTab.Num].TxRate.field.BW = pAd->MacTab.Content[i].HTPhyMode.field.BW; + MacTab.Entry[MacTab.Num].TxRate.field.ShortGI = pAd->MacTab.Content[i].HTPhyMode.field.ShortGI; + MacTab.Entry[MacTab.Num].TxRate.field.STBC = pAd->MacTab.Content[i].HTPhyMode.field.STBC; + MacTab.Entry[MacTab.Num].TxRate.field.rsv = pAd->MacTab.Content[i].HTPhyMode.field.rsv; + MacTab.Entry[MacTab.Num].TxRate.field.MODE = pAd->MacTab.Content[i].HTPhyMode.field.MODE; + MacTab.Entry[MacTab.Num].TxRate.word = pAd->MacTab.Content[i].HTPhyMode.word; + + MacTab.Num += 1; + } + } + + wrq->u.data.length = sizeof(RT_802_11_MAC_TABLE); + if (copy_to_user(wrq->u.data.pointer, &MacTab, wrq->u.data.length)) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__)); + } + + + msg = kmalloc(sizeof(CHAR)*(MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN), MEM_ALLOC_FLAG); + if (msg == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s():Alloc memory failed\n", __FUNCTION__)); + return; + } + memset(msg, 0 ,MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN ); + sprintf(msg,"%s","\n"); + sprintf(msg+strlen(msg),"%-14s%-4s%-4s%-4s%-4s%-6s%-6s%-10s%-10s%-10s\n", + "MAC", "AP", "AID", "PSM", "AUTH", "CTxR", "LTxR","LDT", "RxB", "TxB"); + + for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) + { + PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; + if (IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC)) + { + if((strlen(msg)+MAC_LINE_LEN ) >= (MAX_LEN_OF_MAC_TABLE*MAC_LINE_LEN) ) + break; + sprintf(msg+strlen(msg),"%02x%02x%02x%02x%02x%02x ", + pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], + pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]); + sprintf(msg+strlen(msg),"%-4d", (int)pEntry->apidx); + sprintf(msg+strlen(msg),"%-4d", (int)pEntry->Aid); + sprintf(msg+strlen(msg),"%-4d", (int)pEntry->PsMode); + sprintf(msg+strlen(msg),"%-4d", (int)pEntry->AuthState); + sprintf(msg+strlen(msg),"%-6d",RateIdToMbps[pAd->MacTab.Content[i].CurrTxRate]); + sprintf(msg+strlen(msg),"%-6d",0/*RateIdToMbps[pAd->MacTab.Content[i].HTPhyMode.word]*/); // ToDo + sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.LastDataPacketTime*/); // ToDo + sprintf(msg+strlen(msg),"%-10d",0/*pAd->MacTab.Content[i].HSCounter.TotalRxByteCount*/); // ToDo + sprintf(msg+strlen(msg),"%-10d\n",0/*pAd->MacTab.Content[i].HSCounter.TotalTxByteCount*/); // ToDo + + } + } + // for compatible with old API just do the printk to console + + DBGPRINT(RT_DEBUG_TRACE, ("%s", msg)); + kfree(msg); +} + +#ifdef DOT11_N_SUPPORT +INT Set_BASetup_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR mac[6], tid; + PSTRING token; + STRING sepValue[] = ":", DASH = '-'; + INT i; + MAC_TABLE_ENTRY *pEntry; + +/* + The BASetup inupt string format should be xx:xx:xx:xx:xx:xx-d, + =>The six 2 digit hex-decimal number previous are the Mac address, + =>The seventh decimal number is the tid value. +*/ + //DBGPRINT(RT_DEBUG_TRACE,("\n%s\n", arg)); + + if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format. + return FALSE; + + token = strchr(arg, DASH); + if ((token != NULL) && (strlen(token)>1)) + { + tid = (UCHAR) simple_strtol((token+1), 0, 10); + if (tid > 15) + return FALSE; + + *token = '\0'; + for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++) + { + if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1)))) + return FALSE; + AtoH(token, (&mac[i]), 1); + } + if(i != 6) + return FALSE; + + DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid)); + + pEntry = MacTableLookup(pAd, (PUCHAR) mac); + + if (pEntry) { + DBGPRINT(RT_DEBUG_OFF, ("\nSetup BA Session: Tid = %d\n", tid)); + BAOriSessionSetUp(pAd, pEntry, tid, 0, 100, TRUE); + } + + return TRUE; + } + + return FALSE; + +} + +INT Set_BADecline_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG bBADecline; + + bBADecline = simple_strtol(arg, 0, 10); + + if (bBADecline == 0) + { + pAd->CommonCfg.bBADecline = FALSE; + } + else if (bBADecline == 1) + { + pAd->CommonCfg.bBADecline = TRUE; + } + else + { + return FALSE; //Invalid argument + } + + DBGPRINT(RT_DEBUG_TRACE, ("Set_BADecline_Proc::(BADecline=%d)\n", pAd->CommonCfg.bBADecline)); + + return TRUE; +} + +INT Set_BAOriTearDown_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR mac[6], tid; + PSTRING token; + STRING sepValue[] = ":", DASH = '-'; + INT i; + MAC_TABLE_ENTRY *pEntry; + + //DBGPRINT(RT_DEBUG_TRACE,("\n%s\n", arg)); +/* + The BAOriTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d, + =>The six 2 digit hex-decimal number previous are the Mac address, + =>The seventh decimal number is the tid value. +*/ + if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format. + return FALSE; + + token = strchr(arg, DASH); + if ((token != NULL) && (strlen(token)>1)) + { + tid = simple_strtol((token+1), 0, 10); + if (tid > NUM_OF_TID) + return FALSE; + + *token = '\0'; + for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++) + { + if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1)))) + return FALSE; + AtoH(token, (&mac[i]), 1); + } + if(i != 6) + return FALSE; + + DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid)); + + pEntry = MacTableLookup(pAd, (PUCHAR) mac); + + if (pEntry) { + DBGPRINT(RT_DEBUG_OFF, ("\nTear down Ori BA Session: Tid = %d\n", tid)); + BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, TRUE); + } + + return TRUE; + } + + return FALSE; + +} + +INT Set_BARecTearDown_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR mac[6], tid; + PSTRING token; + STRING sepValue[] = ":", DASH = '-'; + INT i; + MAC_TABLE_ENTRY *pEntry; + + //DBGPRINT(RT_DEBUG_TRACE,("\n%s\n", arg)); +/* + The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d, + =>The six 2 digit hex-decimal number previous are the Mac address, + =>The seventh decimal number is the tid value. +*/ + if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and tid value in decimal format. + return FALSE; + + token = strchr(arg, DASH); + if ((token != NULL) && (strlen(token)>1)) + { + tid = simple_strtol((token+1), 0, 10); + if (tid > NUM_OF_TID) + return FALSE; + + *token = '\0'; + for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++) + { + if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1)))) + return FALSE; + AtoH(token, (&mac[i]), 1); + } + if(i != 6) + return FALSE; + + DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], tid)); + + pEntry = MacTableLookup(pAd, (PUCHAR) mac); + + if (pEntry) { + DBGPRINT(RT_DEBUG_OFF, ("\nTear down Rec BA Session: Tid = %d\n", tid)); + BARecSessionTearDown(pAd, pEntry->Aid, tid, FALSE); + } + + return TRUE; + } + + return FALSE; + +} + +INT Set_HtBw_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG HtBw; + + HtBw = simple_strtol(arg, 0, 10); + if (HtBw == BW_40) + pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40; + else if (HtBw == BW_20) + pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBw_Proc::(HtBw=%d)\n", pAd->CommonCfg.RegTransmitSetting.field.BW)); + + return TRUE; +} + +INT Set_HtMcs_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG HtMcs, Mcs_tmp, ValidMcs = 15; +#ifdef CONFIG_STA_SUPPORT + BOOLEAN bAutoRate = FALSE; +#endif // CONFIG_STA_SUPPORT // + + Mcs_tmp = simple_strtol(arg, 0, 10); + + if (Mcs_tmp <= ValidMcs || Mcs_tmp == 32) + HtMcs = Mcs_tmp; + else + HtMcs = MCS_AUTO; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pAd->StaCfg.DesiredTransmitSetting.field.MCS = HtMcs; + pAd->StaCfg.bAutoTxRateSwitch = (HtMcs == MCS_AUTO) ? TRUE:FALSE; + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(HtMcs=%d, bAutoTxRateSwitch = %d)\n", + pAd->StaCfg.DesiredTransmitSetting.field.MCS, pAd->StaCfg.bAutoTxRateSwitch)); + + if ((pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) || + (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE < MODE_HTMIX)) + { + if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) && + (HtMcs <= 3) && + (pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_CCK)) + { + RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs] * 1000000)); + } + else if ((pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) && + (HtMcs <= 7) && + (pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode == FIXED_TXMODE_OFDM)) + { + RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[HtMcs+4] * 1000000)); + } + else + bAutoRate = TRUE; + + if (bAutoRate) + { + pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; + RTMPSetDesiredRates(pAd, -1); + } + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMcs_Proc::(FixedTxMode=%d)\n",pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode)); + } + if (ADHOC_ON(pAd)) + return TRUE; + } +#endif // CONFIG_STA_SUPPORT // + + SetCommonHT(pAd); + + return TRUE; +} + +INT Set_HtGi_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG HtGi; + + HtGi = simple_strtol(arg, 0, 10); + + if ( HtGi == GI_400) + pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400; + else if ( HtGi == GI_800 ) + pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800; + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtGi_Proc::(ShortGI=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.ShortGI)); + + return TRUE; +} + + +INT Set_HtTxBASize_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR Size; + + Size = simple_strtol(arg, 0, 10); + + if (Size <=0 || Size >=64) + { + Size = 8; + } + pAd->CommonCfg.TxBASize = Size-1; + DBGPRINT(RT_DEBUG_ERROR, ("Set_HtTxBASize ::(TxBASize= %d)\n", Size)); + + return TRUE; +} + +INT Set_HtDisallowTKIP_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + + if (Value == 1) + { + pAd->CommonCfg.HT_DisallowTKIP = TRUE; + } + else + { + pAd->CommonCfg.HT_DisallowTKIP = FALSE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtDisallowTKIP_Proc ::%s\n", + (pAd->CommonCfg.HT_DisallowTKIP == TRUE) ? "enabled" : "disabled")); + + return TRUE; +} + +INT Set_HtOpMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + + if (Value == HTMODE_GF) + pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF; + else if ( Value == HTMODE_MM ) + pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM; + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtOpMode_Proc::(HtOpMode=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.HTMODE)); + + return TRUE; + +} + +INT Set_HtStbc_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + + if (Value == STBC_USE) + pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE; + else if ( Value == STBC_NONE ) + pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE; + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_Stbc_Proc::(HtStbc=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.STBC)); + + return TRUE; +} + +INT Set_HtHtc_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + if (Value == 0) + pAd->HTCEnable = FALSE; + else if ( Value ==1 ) + pAd->HTCEnable = TRUE; + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtHtc_Proc::(HtHtc=%d)\n",pAd->HTCEnable)); + + return TRUE; +} + +INT Set_HtExtcha_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + + if (Value == 0) + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW; + else if ( Value ==1 ) + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE; + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtExtcha_Proc::(HtExtcha=%d)\n",pAd->CommonCfg.RegTransmitSetting.field.EXTCHA)); + + return TRUE; +} + +INT Set_HtMpduDensity_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + + if (Value <=7) + pAd->CommonCfg.BACapability.field.MpduDensity = Value; + else + pAd->CommonCfg.BACapability.field.MpduDensity = 4; + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMpduDensity_Proc::(HtMpduDensity=%d)\n",pAd->CommonCfg.BACapability.field.MpduDensity)); + + return TRUE; +} + +INT Set_HtBaWinSize_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + + + if (Value >=1 && Value <= 64) + { + pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value; + pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value; + } + else + { + pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64; + pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; + } + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtBaWinSize_Proc::(HtBaWinSize=%d)\n",pAd->CommonCfg.BACapability.field.RxBAWinLimit)); + + return TRUE; +} + +INT Set_HtRdg_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + + if (Value == 0) + pAd->CommonCfg.bRdg = FALSE; + else if ( Value ==1 ) + { + pAd->HTCEnable = TRUE; + pAd->CommonCfg.bRdg = TRUE; + } + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtRdg_Proc::(HtRdg=%d)\n",pAd->CommonCfg.bRdg)); + + return TRUE; +} + +INT Set_HtLinkAdapt_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + if (Value == 0) + pAd->bLinkAdapt = FALSE; + else if ( Value ==1 ) + { + pAd->HTCEnable = TRUE; + pAd->bLinkAdapt = TRUE; + } + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtLinkAdapt_Proc::(HtLinkAdapt=%d)\n",pAd->bLinkAdapt)); + + return TRUE; +} + +INT Set_HtAmsdu_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + if (Value == 0) + pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE; + else if ( Value == 1 ) + pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE; + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAmsdu_Proc::(HtAmsdu=%d)\n",pAd->CommonCfg.BACapability.field.AmsduEnable)); + + return TRUE; +} + +INT Set_HtAutoBa_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + if (Value == 0) + { + pAd->CommonCfg.BACapability.field.AutoBA = FALSE; + pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE; + } + else if (Value == 1) + { + pAd->CommonCfg.BACapability.field.AutoBA = TRUE; + pAd->CommonCfg.BACapability.field.Policy = IMMED_BA; + } + else + return FALSE; //Invalid argument + + pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA; + pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy; + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtAutoBa_Proc::(HtAutoBa=%d)\n",pAd->CommonCfg.BACapability.field.AutoBA)); + + return TRUE; + +} + +INT Set_HtProtect_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + if (Value == 0) + pAd->CommonCfg.bHTProtect = FALSE; + else if (Value == 1) + pAd->CommonCfg.bHTProtect = TRUE; + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtProtect_Proc::(HtProtect=%d)\n",pAd->CommonCfg.bHTProtect)); + + return TRUE; +} + +INT Set_SendPSMPAction_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR mac[6], mode; + PSTRING token; + STRING sepValue[] = ":", DASH = '-'; + INT i; + MAC_TABLE_ENTRY *pEntry; + + //DBGPRINT(RT_DEBUG_TRACE,("\n%s\n", arg)); +/* + The BARecTearDown inupt string format should be xx:xx:xx:xx:xx:xx-d, + =>The six 2 digit hex-decimal number previous are the Mac address, + =>The seventh decimal number is the mode value. +*/ + if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and mode value in decimal format. + return FALSE; + + token = strchr(arg, DASH); + if ((token != NULL) && (strlen(token)>1)) + { + mode = simple_strtol((token+1), 0, 10); + if (mode > MMPS_ENABLE) + return FALSE; + + *token = '\0'; + for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++) + { + if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1)))) + return FALSE; + AtoH(token, (&mac[i]), 1); + } + if(i != 6) + return FALSE; + + DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%02x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], mode)); + + pEntry = MacTableLookup(pAd, mac); + + if (pEntry) { + DBGPRINT(RT_DEBUG_OFF, ("\nSendPSMPAction MIPS mode = %d\n", mode)); + SendPSMPAction(pAd, pEntry->Aid, mode); + } + + return TRUE; + } + + return FALSE; + + +} + +INT Set_HtMIMOPSmode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + + if (Value <=3) + pAd->CommonCfg.BACapability.field.MMPSmode = Value; + else + pAd->CommonCfg.BACapability.field.MMPSmode = 3; + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMIMOPSmode_Proc::(MIMOPS mode=%d)\n",pAd->CommonCfg.BACapability.field.MMPSmode)); + + return TRUE; +} + + +INT Set_ForceShortGI_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + if (Value == 0) + pAd->WIFItestbed.bShortGI = FALSE; + else if (Value == 1) + pAd->WIFItestbed.bShortGI = TRUE; + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceShortGI_Proc::(ForceShortGI=%d)\n", pAd->WIFItestbed.bShortGI)); + + return TRUE; +} + + + +INT Set_ForceGF_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + if (Value == 0) + pAd->WIFItestbed.bGreenField = FALSE; + else if (Value == 1) + pAd->WIFItestbed.bGreenField = TRUE; + else + return FALSE; //Invalid argument + + SetCommonHT(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_ForceGF_Proc::(ForceGF=%d)\n", pAd->WIFItestbed.bGreenField)); + + return TRUE; +} + +INT Set_HtMimoPs_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + if (Value == 0) + pAd->CommonCfg.bMIMOPSEnable = FALSE; + else if (Value == 1) + pAd->CommonCfg.bMIMOPSEnable = TRUE; + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_HtMimoPs_Proc::(HtMimoPs=%d)\n",pAd->CommonCfg.bMIMOPSEnable)); + + return TRUE; +} + + +#ifdef DOT11N_DRAFT3 +INT Set_HT_BssCoex_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING pParam) +{ + UCHAR bBssCoexEnable = simple_strtol(pParam, 0, 10); + + pAd->CommonCfg.bBssCoexEnable = ((bBssCoexEnable == 1) ? TRUE: FALSE); + + DBGPRINT(RT_DEBUG_TRACE, ("Set bBssCoexEnable=%d!\n", pAd->CommonCfg.bBssCoexEnable)); + + return TRUE; +} +#endif // DOT11N_DRAFT3 // + +#endif // DOT11_N_SUPPORT // + + +#ifdef DOT11_N_SUPPORT +INT SetCommonHT( + IN PRTMP_ADAPTER pAd) +{ + OID_SET_HT_PHYMODE SetHT; + + if (pAd->CommonCfg.PhyMode < PHY_11ABGN_MIXED) + return FALSE; + + SetHT.PhyMode = (RT_802_11_PHY_MODE)pAd->CommonCfg.PhyMode; + SetHT.TransmitNo = ((UCHAR)pAd->Antenna.field.TxPath); + SetHT.HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE; + SetHT.ExtOffset = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.EXTCHA; + SetHT.MCS = MCS_AUTO; + SetHT.BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW; + SetHT.STBC = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC; + SetHT.SHORTGI = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI; + + RTMPSetHT(pAd, &SetHT); + + return TRUE; +} +#endif // DOT11_N_SUPPORT // + +INT Set_FixedTxMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + INT fix_tx_mode = FIXED_TXMODE_HT; + + fix_tx_mode = RT_CfgSetFixedTxPhyMode(arg); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = fix_tx_mode; +#endif // CONFIG_STA_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("Set_FixedTxMode_Proc::(FixedTxMode=%d)\n", fix_tx_mode)); + + return TRUE; +} + +#ifdef CONFIG_APSTA_MIXED_SUPPORT +INT Set_OpMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG Value; + + Value = simple_strtol(arg, 0, 10); + +#ifdef RTMP_MAC_PCI + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) +#endif // RTMP_MAC_PCI // + { + DBGPRINT(RT_DEBUG_ERROR, ("Can not switch operate mode on interface up !! \n")); + return FALSE; + } + + if (Value == 0) + pAd->OpMode = OPMODE_STA; + else if (Value == 1) + pAd->OpMode = OPMODE_AP; + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_OpMode_Proc::(OpMode=%s)\n", pAd->OpMode == 1 ? "AP Mode" : "STA Mode")); + + return TRUE; +} +#endif // CONFIG_APSTA_MIXED_SUPPORT // + + + +INT Set_LongRetryLimit_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + TX_RTY_CFG_STRUC tx_rty_cfg; + UCHAR LongRetryLimit = (UCHAR)simple_strtol(arg, 0, 10); + + RTMP_IO_READ32(pAdapter, TX_RTY_CFG, &tx_rty_cfg.word); + tx_rty_cfg.field.LongRtyLimit = LongRetryLimit; + RTMP_IO_WRITE32(pAdapter, TX_RTY_CFG, tx_rty_cfg.word); + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_LongRetryLimit_Proc::(tx_rty_cfg=0x%x)\n", tx_rty_cfg.word)); + return TRUE; +} + +INT Set_ShortRetryLimit_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + TX_RTY_CFG_STRUC tx_rty_cfg; + UCHAR ShortRetryLimit = (UCHAR)simple_strtol(arg, 0, 10); + + RTMP_IO_READ32(pAdapter, TX_RTY_CFG, &tx_rty_cfg.word); + tx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit; + RTMP_IO_WRITE32(pAdapter, TX_RTY_CFG, tx_rty_cfg.word); + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_ShortRetryLimit_Proc::(tx_rty_cfg=0x%x)\n", tx_rty_cfg.word)); + return TRUE; +} + +INT Set_AutoFallBack_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + return RT_CfgSetAutoFallBack(pAdapter, arg); +} + + + +///////////////////////////////////////////////////////////////////////// +PSTRING RTMPGetRalinkAuthModeStr( + IN NDIS_802_11_AUTHENTICATION_MODE authMode) +{ + switch(authMode) + { + case Ndis802_11AuthModeOpen: + return "OPEN"; + case Ndis802_11AuthModeWPAPSK: + return "WPAPSK"; + case Ndis802_11AuthModeShared: + return "SHARED"; + case Ndis802_11AuthModeAutoSwitch: + return "WEPAUTO"; + case Ndis802_11AuthModeWPA: + return "WPA"; + case Ndis802_11AuthModeWPA2: + return "WPA2"; + case Ndis802_11AuthModeWPA2PSK: + return "WPA2PSK"; + case Ndis802_11AuthModeWPA1PSKWPA2PSK: + return "WPAPSKWPA2PSK"; + case Ndis802_11AuthModeWPA1WPA2: + return "WPA1WPA2"; + case Ndis802_11AuthModeWPANone: + return "WPANONE"; + default: + return "UNKNOW"; + } +} + +PSTRING RTMPGetRalinkEncryModeStr( + IN USHORT encryMode) +{ + switch(encryMode) + { + case Ndis802_11WEPDisabled: + return "NONE"; + case Ndis802_11WEPEnabled: + return "WEP"; + case Ndis802_11Encryption2Enabled: + return "TKIP"; + case Ndis802_11Encryption3Enabled: + return "AES"; + case Ndis802_11Encryption4Enabled: + return "TKIPAES"; + default: + return "UNKNOW"; + } +} + +INT RTMPShowCfgValue( + IN PRTMP_ADAPTER pAd, + IN PSTRING pName, + IN PSTRING pBuf) +{ + INT Status = 0; + + for (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++) + { + if (!strcmp(pName, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name)) + { + if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->show_proc(pAd, pBuf)) + Status = -EINVAL; + break; //Exit for loop. + } + } + + if(PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name == NULL) + { + sprintf(pBuf, "\n"); + for (PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC = RTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name; PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC++) + sprintf(pBuf, "%s%s\n", pBuf, PRTMP_PRIVATE_STA_SHOW_CFG_VALUE_PROC->name); + } + + return Status; +} + +INT Show_SSID_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + sprintf(pBuf, "\t%s", pAd->CommonCfg.Ssid); +#endif // CONFIG_STA_SUPPORT // + return 0; +} + +INT Show_WirelessMode_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + switch(pAd->CommonCfg.PhyMode) + { + case PHY_11BG_MIXED: + sprintf(pBuf, "\t11B/G"); + break; + case PHY_11B: + sprintf(pBuf, "\t11B"); + break; + case PHY_11A: + sprintf(pBuf, "\t11A"); + break; + case PHY_11ABG_MIXED: + sprintf(pBuf, "\t11A/B/G"); + break; + case PHY_11G: + sprintf(pBuf, "\t11G"); + break; +#ifdef DOT11_N_SUPPORT + case PHY_11ABGN_MIXED: + sprintf(pBuf, "\t11A/B/G/N"); + break; + case PHY_11N_2_4G: + sprintf(pBuf, "\t11N only with 2.4G"); + break; + case PHY_11GN_MIXED: + sprintf(pBuf, "\t11G/N"); + break; + case PHY_11AN_MIXED: + sprintf(pBuf, "\t11A/N"); + break; + case PHY_11BGN_MIXED: + sprintf(pBuf, "\t11B/G/N"); + break; + case PHY_11AGN_MIXED: + sprintf(pBuf, "\t11A/G/N"); + break; + case PHY_11N_5G: + sprintf(pBuf, "\t11N only with 5G"); + break; +#endif // DOT11_N_SUPPORT // + default: + sprintf(pBuf, "\tUnknow Value(%d)", pAd->CommonCfg.PhyMode); + break; + } + return 0; +} + + +INT Show_TxBurst_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%s", pAd->CommonCfg.bEnableTxBurst ? "TRUE":"FALSE"); + return 0; +} + +INT Show_TxPreamble_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + switch(pAd->CommonCfg.TxPreamble) + { + case Rt802_11PreambleShort: + sprintf(pBuf, "\tShort"); + break; + case Rt802_11PreambleLong: + sprintf(pBuf, "\tLong"); + break; + case Rt802_11PreambleAuto: + sprintf(pBuf, "\tAuto"); + break; + default: + sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.TxPreamble); + break; + } + + return 0; +} + +INT Show_TxPower_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%lu", pAd->CommonCfg.TxPowerPercentage); + return 0; +} + +INT Show_Channel_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%d", pAd->CommonCfg.Channel); + return 0; +} + +INT Show_BGProtection_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + switch(pAd->CommonCfg.UseBGProtection) + { + case 1: //Always On + sprintf(pBuf, "\tON"); + break; + case 2: //Always OFF + sprintf(pBuf, "\tOFF"); + break; + case 0: //AUTO + sprintf(pBuf, "\tAuto"); + break; + default: + sprintf(pBuf, "\tUnknow Value(%lu)", pAd->CommonCfg.UseBGProtection); + break; + } + return 0; +} + +INT Show_RTSThreshold_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%u", pAd->CommonCfg.RtsThreshold); + return 0; +} + +INT Show_FragThreshold_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%u", pAd->CommonCfg.FragmentThreshold); + return 0; +} + +#ifdef DOT11_N_SUPPORT +INT Show_HtBw_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) + { + sprintf(pBuf, "\t40 MHz"); + } + else + { + sprintf(pBuf, "\t20 MHz"); + } + return 0; +} + +INT Show_HtMcs_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + sprintf(pBuf, "\t%u", pAd->StaCfg.DesiredTransmitSetting.field.MCS); +#endif // CONFIG_STA_SUPPORT // + return 0; +} + +INT Show_HtGi_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + switch(pAd->CommonCfg.RegTransmitSetting.field.ShortGI) + { + case GI_400: + sprintf(pBuf, "\tGI_400"); + break; + case GI_800: + sprintf(pBuf, "\tGI_800"); + break; + default: + sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.ShortGI); + break; + } + return 0; +} + +INT Show_HtOpMode_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + switch(pAd->CommonCfg.RegTransmitSetting.field.HTMODE) + { + case HTMODE_GF: + sprintf(pBuf, "\tGF"); + break; + case HTMODE_MM: + sprintf(pBuf, "\tMM"); + break; + default: + sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.HTMODE); + break; + } + return 0; +} + +INT Show_HtExtcha_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + switch(pAd->CommonCfg.RegTransmitSetting.field.EXTCHA) + { + case EXTCHA_BELOW: + sprintf(pBuf, "\tBelow"); + break; + case EXTCHA_ABOVE: + sprintf(pBuf, "\tAbove"); + break; + default: + sprintf(pBuf, "\tUnknow Value(%u)", pAd->CommonCfg.RegTransmitSetting.field.EXTCHA); + break; + } + return 0; +} + + +INT Show_HtMpduDensity_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.MpduDensity); + return 0; +} + +INT Show_HtBaWinSize_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%u", pAd->CommonCfg.BACapability.field.RxBAWinLimit); + return 0; +} + +INT Show_HtRdg_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%s", pAd->CommonCfg.bRdg ? "TRUE":"FALSE"); + return 0; +} + +INT Show_HtAmsdu_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AmsduEnable ? "TRUE":"FALSE"); + return 0; +} + +INT Show_HtAutoBa_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%s", pAd->CommonCfg.BACapability.field.AutoBA ? "TRUE":"FALSE"); + return 0; +} +#endif // DOT11_N_SUPPORT // + +INT Show_CountryRegion_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegion); + return 0; +} + +INT Show_CountryRegionABand_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%d", pAd->CommonCfg.CountryRegionForABand); + return 0; +} + +INT Show_CountryCode_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%s", pAd->CommonCfg.CountryCode); + return 0; +} + +#ifdef AGGREGATION_SUPPORT +INT Show_PktAggregate_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%s", pAd->CommonCfg.bAggregationCapable ? "TRUE":"FALSE"); + return 0; +} +#endif // AGGREGATION_SUPPORT // + +#ifdef WMM_SUPPORT +INT Show_WmmCapable_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + sprintf(pBuf, "\t%s", pAd->CommonCfg.bWmmCapable ? "TRUE":"FALSE"); +#endif // CONFIG_STA_SUPPORT // + + return 0; +} +#endif // WMM_SUPPORT // + +INT Show_IEEE80211H_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\t%s", pAd->CommonCfg.bIEEE80211H ? "TRUE":"FALSE"); + return 0; +} + +#ifdef CONFIG_STA_SUPPORT +INT Show_NetworkType_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + switch(pAd->StaCfg.BssType) + { + case BSS_ADHOC: + sprintf(pBuf, "\tAdhoc"); + break; + case BSS_INFRA: + sprintf(pBuf, "\tInfra"); + break; + case BSS_ANY: + sprintf(pBuf, "\tAny"); + break; + case BSS_MONITOR: + sprintf(pBuf, "\tMonitor"); + break; + default: + sprintf(pBuf, "\tUnknow Value(%d)", pAd->StaCfg.BssType); + break; + } + return 0; +} + + +INT Show_WPAPSK_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + if ((pAd->StaCfg.WpaPassPhraseLen >= 8) && + (pAd->StaCfg.WpaPassPhraseLen < 64)) + sprintf(pBuf, "\tWPAPSK = %s", pAd->StaCfg.WpaPassPhrase); + else + { + INT idx; + sprintf(pBuf, "\tWPAPSK = "); + for (idx = 0; idx < 32; idx++) + sprintf(pBuf+strlen(pBuf), "%02X", pAd->StaCfg.WpaPassPhrase[idx]); + } + + return 0; +} + + +INT Show_AutoReconnect_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + sprintf(pBuf, "\tAutoReconnect = %d", pAd->StaCfg.bAutoReconnect); + return 0; +} +#endif // CONFIG_STA_SUPPORT // + +INT Show_AuthMode_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeOpen; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + AuthMode = pAd->StaCfg.AuthMode; +#endif // CONFIG_STA_SUPPORT // + + if ((AuthMode >= Ndis802_11AuthModeOpen) && + (AuthMode <= Ndis802_11AuthModeWPA1PSKWPA2PSK)) + sprintf(pBuf, "\t%s", RTMPGetRalinkAuthModeStr(AuthMode)); + else + sprintf(pBuf, "\tUnknow Value(%d)", AuthMode); + + return 0; +} + +INT Show_EncrypType_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + NDIS_802_11_WEP_STATUS WepStatus = Ndis802_11WEPDisabled; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + WepStatus = pAd->StaCfg.WepStatus; +#endif // CONFIG_STA_SUPPORT // + + if ((WepStatus >= Ndis802_11WEPEnabled) && + (WepStatus <= Ndis802_11Encryption4KeyAbsent)) + sprintf(pBuf, "\t%s", RTMPGetRalinkEncryModeStr(WepStatus)); + else + sprintf(pBuf, "\tUnknow Value(%d)", WepStatus); + + return 0; +} + +INT Show_DefaultKeyID_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + UCHAR DefaultKeyId = 0; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + DefaultKeyId = pAd->StaCfg.DefaultKeyId; +#endif // CONFIG_STA_SUPPORT // + + sprintf(pBuf, "\t%d", DefaultKeyId); + + return 0; +} + +INT Show_WepKey_Proc( + IN PRTMP_ADAPTER pAd, + IN INT KeyIdx, + OUT PSTRING pBuf) +{ + UCHAR Key[16] = {0}, KeyLength = 0; + INT index = BSS0; + + KeyLength = pAd->SharedKey[index][KeyIdx].KeyLen; + NdisMoveMemory(Key, pAd->SharedKey[index][KeyIdx].Key, KeyLength); + + //check key string is ASCII or not + if (RTMPCheckStrPrintAble((PCHAR)Key, KeyLength)) + sprintf(pBuf, "\t%s", Key); + else + { + int idx; + sprintf(pBuf, "\t"); + for (idx = 0; idx < KeyLength; idx++) + sprintf(pBuf+strlen(pBuf), "%02X", Key[idx]); + } + return 0; +} + +INT Show_Key1_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + Show_WepKey_Proc(pAd, 0, pBuf); + return 0; +} + +INT Show_Key2_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + Show_WepKey_Proc(pAd, 1, pBuf); + return 0; +} + +INT Show_Key3_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + Show_WepKey_Proc(pAd, 2, pBuf); + return 0; +} + +INT Show_Key4_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + Show_WepKey_Proc(pAd, 3, pBuf); + return 0; +} + +INT Show_PMK_Proc( + IN PRTMP_ADAPTER pAd, + OUT PSTRING pBuf) +{ + INT idx; + UCHAR PMK[32] = {0}; + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + NdisMoveMemory(PMK, pAd->StaCfg.PMK, 32); +#endif // CONFIG_STA_SUPPORT // + + sprintf(pBuf, "\tPMK = "); + for (idx = 0; idx < 32; idx++) + sprintf(pBuf+strlen(pBuf), "%02X", PMK[idx]); + + return 0; +} + +#ifdef RT2883_TEMP_PATCH +INT Set_ETxBfEnCond_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg) +{ + // insert code here + UCHAR i; + MAC_TABLE_ENTRY *pEntry = NULL; + for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++){ + pEntry = &pAd->MacTab.Content[i]; + pEntry->eTxBfEnCond = simple_strtol(arg, 0, 10); + } + + return TRUE; +} +INT Set_NoSndgCntThrd_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg) +{ + // insert code here + UCHAR i; + MAC_TABLE_ENTRY *pEntry = NULL; + for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++){ + pEntry = &pAd->MacTab.Content[i]; + pEntry->noSndgCntThrd = simple_strtol(arg, 0, 10); + } + return TRUE; +} + +INT Set_NdpSndgStreams_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg) +{ + // insert code here + UCHAR i; + MAC_TABLE_ENTRY *pEntry = NULL; + for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++){ + pEntry = &pAd->MacTab.Content[i]; + pEntry->ndpSndgStreams = simple_strtol(arg, 0, 10); + } + return TRUE; +} + +INT Set_PerThrdAdj_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg) +{ + // insert code here + UCHAR i; + MAC_TABLE_ENTRY *pEntry = NULL; + for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++){ + pEntry = &pAd->MacTab.Content[i]; + pEntry->perThrdAdj = simple_strtol(arg, 0, 10); + } + return TRUE; +} + +INT Set_Trigger_Sounding_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg) +{ + UCHAR macAddr[MAC_ADDR_LEN]; + CHAR *value; + INT i; + UCHAR HashIdx; + MAC_TABLE_ENTRY *pEntry = NULL; + + if(strlen(arg) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17 + return FALSE; + + for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":")) + { + if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) + return FALSE; //Invalid + + AtoH(value, &macAddr[i++], 1); + } + + HashIdx = MAC_ADDR_HASH_INDEX(macAddr); + pEntry = pAd->MacTab.Hash[HashIdx]; + + if (pEntry) + { + //MlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING); + Trigger_Sounding_Packet(pAd, SNDG_TYPE_SOUNGING, 0, pEntry->sndgMcs, pEntry); + } + + return TRUE; +} +#endif // RT2883_TEMP_PATCH // + + +void getRate(HTTRANSMIT_SETTING HTSetting, ULONG* fLastTxRxRate) + +{ + INT MCSMappingRateTable[] = + {2, 4, 11, 22, // CCK + 12, 18, 24, 36, 48, 72, 96, 108, // OFDM + 13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, // 20MHz, 800ns GI, MCS: 0 ~ 15 + 39, 78, 117, 156, 234, 312, 351, 390, // 20MHz, 800ns GI, MCS: 16 ~ 23 + 27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540, // 40MHz, 800ns GI, MCS: 0 ~ 15 + 81, 162, 243, 324, 486, 648, 729, 810, // 40MHz, 800ns GI, MCS: 16 ~ 23 + 14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, // 20MHz, 400ns GI, MCS: 0 ~ 15 + 43, 87, 130, 173, 260, 317, 390, 433, // 20MHz, 400ns GI, MCS: 16 ~ 23 + 30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600, // 40MHz, 400ns GI, MCS: 0 ~ 15 + 90, 180, 270, 360, 540, 720, 810, 900}; + + int rate_count = sizeof(MCSMappingRateTable)/sizeof(int); + int rate_index = 0; + int value = 0; + +#ifdef DOT11_N_SUPPORT + if (HTSetting.field.MODE >= MODE_HTMIX) + { +// rate_index = 12 + ((UCHAR)ht_setting.field.BW *16) + ((UCHAR)ht_setting.field.ShortGI *32) + ((UCHAR)ht_setting.field.MCS); + rate_index = 12 + ((UCHAR)HTSetting.field.BW *24) + ((UCHAR)HTSetting.field.ShortGI *48) + ((UCHAR)HTSetting.field.MCS); + } + else +#endif // DOT11_N_SUPPORT // + if (HTSetting.field.MODE == MODE_OFDM) + rate_index = (UCHAR)(HTSetting.field.MCS) + 4; + else if (HTSetting.field.MODE == MODE_CCK) + rate_index = (UCHAR)(HTSetting.field.MCS); + + if (rate_index < 0) + rate_index = 0; + + if (rate_index > rate_count) + rate_index = rate_count; + + value = (MCSMappingRateTable[rate_index] * 5)/10; + *fLastTxRxRate=(ULONG)value; + return; +} diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_mac_pci.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_mac_pci.c new file mode 100644 index 000000000..235f517dc --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_mac_pci.c @@ -0,0 +1,1680 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + + + +#ifdef RTMP_MAC_PCI +#include "rt_config.h" + + +/* + ======================================================================== + + Routine Description: + Allocate DMA memory blocks for send, receive + + Arguments: + Adapter Pointer to our adapter + + Return Value: + NDIS_STATUS_SUCCESS + NDIS_STATUS_FAILURE + NDIS_STATUS_RESOURCES + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +NDIS_STATUS RTMPAllocTxRxRingMemory( + IN PRTMP_ADAPTER pAd) +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + ULONG RingBasePaHigh; + ULONG RingBasePaLow; + PVOID RingBaseVa; + INT index, num; + PTXD_STRUC pTxD; + PRXD_STRUC pRxD; + ULONG ErrorValue = 0; + PRTMP_TX_RING pTxRing; + PRTMP_DMABUF pDmaBuf; + PNDIS_PACKET pPacket; +// PRTMP_REORDERBUF pReorderBuf; + + DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocTxRxRingMemory\n")); + do + { + // Init the CmdQ and CmdQLock + NdisAllocateSpinLock(&pAd->CmdQLock); + NdisAcquireSpinLock(&pAd->CmdQLock); + RTInitializeCmdQ(&pAd->CmdQ); + NdisReleaseSpinLock(&pAd->CmdQLock); + + // + // Allocate all ring descriptors, include TxD, RxD, MgmtD. + // Although each size is different, to prevent cacheline and alignment + // issue, I intentional set them all to 64 bytes. + // + for (num=0; num<NUM_OF_TX_RING; num++) + { + ULONG BufBasePaHigh; + ULONG BufBasePaLow; + PVOID BufBaseVa; + + // + // Allocate Tx ring descriptor's memory (5 TX rings = 4 ACs + 1 HCCA) + // + pAd->TxDescRing[num].AllocSize = TX_RING_SIZE * TXD_SIZE; + RTMP_AllocateTxDescMemory( + pAd, + num, + pAd->TxDescRing[num].AllocSize, + FALSE, + &pAd->TxDescRing[num].AllocVa, + &pAd->TxDescRing[num].AllocPa); + + if (pAd->TxDescRing[num].AllocVa == NULL) + { + ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY; + DBGPRINT_ERR(("Failed to allocate a big buffer\n")); + Status = NDIS_STATUS_RESOURCES; + break; + } + + // Zero init this memory block + NdisZeroMemory(pAd->TxDescRing[num].AllocVa, pAd->TxDescRing[num].AllocSize); + + // Save PA & VA for further operation + RingBasePaHigh = RTMP_GetPhysicalAddressHigh(pAd->TxDescRing[num].AllocPa); + RingBasePaLow = RTMP_GetPhysicalAddressLow (pAd->TxDescRing[num].AllocPa); + RingBaseVa = pAd->TxDescRing[num].AllocVa; + + // + // Allocate all 1st TXBuf's memory for this TxRing + // + pAd->TxBufSpace[num].AllocSize = TX_RING_SIZE * TX_DMA_1ST_BUFFER_SIZE; + RTMP_AllocateFirstTxBuffer( + pAd, + num, + pAd->TxBufSpace[num].AllocSize, + FALSE, + &pAd->TxBufSpace[num].AllocVa, + &pAd->TxBufSpace[num].AllocPa); + + if (pAd->TxBufSpace[num].AllocVa == NULL) + { + ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY; + DBGPRINT_ERR(("Failed to allocate a big buffer\n")); + Status = NDIS_STATUS_RESOURCES; + break; + } + + // Zero init this memory block + NdisZeroMemory(pAd->TxBufSpace[num].AllocVa, pAd->TxBufSpace[num].AllocSize); + + // Save PA & VA for further operation + BufBasePaHigh = RTMP_GetPhysicalAddressHigh(pAd->TxBufSpace[num].AllocPa); + BufBasePaLow = RTMP_GetPhysicalAddressLow (pAd->TxBufSpace[num].AllocPa); + BufBaseVa = pAd->TxBufSpace[num].AllocVa; + + // + // Initialize Tx Ring Descriptor and associated buffer memory + // + pTxRing = &pAd->TxRing[num]; + for (index = 0; index < TX_RING_SIZE; index++) + { + pTxRing->Cell[index].pNdisPacket = NULL; + pTxRing->Cell[index].pNextNdisPacket = NULL; + // Init Tx Ring Size, Va, Pa variables + pTxRing->Cell[index].AllocSize = TXD_SIZE; + pTxRing->Cell[index].AllocVa = RingBaseVa; + RTMP_SetPhysicalAddressHigh(pTxRing->Cell[index].AllocPa, RingBasePaHigh); + RTMP_SetPhysicalAddressLow (pTxRing->Cell[index].AllocPa, RingBasePaLow); + + // Setup Tx Buffer size & address. only 802.11 header will store in this space + pDmaBuf = &pTxRing->Cell[index].DmaBuf; + pDmaBuf->AllocSize = TX_DMA_1ST_BUFFER_SIZE; + pDmaBuf->AllocVa = BufBaseVa; + RTMP_SetPhysicalAddressHigh(pDmaBuf->AllocPa, BufBasePaHigh); + RTMP_SetPhysicalAddressLow(pDmaBuf->AllocPa, BufBasePaLow); + + // link the pre-allocated TxBuf to TXD + pTxD = (PTXD_STRUC) pTxRing->Cell[index].AllocVa; + pTxD->SDPtr0 = BufBasePaLow; + // advance to next ring descriptor address + pTxD->DMADONE = 1; +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif + RingBasePaLow += TXD_SIZE; + RingBaseVa = (PUCHAR) RingBaseVa + TXD_SIZE; + + // advance to next TxBuf address + BufBasePaLow += TX_DMA_1ST_BUFFER_SIZE; + BufBaseVa = (PUCHAR) BufBaseVa + TX_DMA_1ST_BUFFER_SIZE; + } + DBGPRINT(RT_DEBUG_TRACE, ("TxRing[%d]: total %d entry allocated\n", num, index)); + } + if (Status == NDIS_STATUS_RESOURCES) + break; + + // + // Allocate MGMT ring descriptor's memory except Tx ring which allocated eariler + // + pAd->MgmtDescRing.AllocSize = MGMT_RING_SIZE * TXD_SIZE; + RTMP_AllocateMgmtDescMemory( + pAd, + pAd->MgmtDescRing.AllocSize, + FALSE, + &pAd->MgmtDescRing.AllocVa, + &pAd->MgmtDescRing.AllocPa); + + if (pAd->MgmtDescRing.AllocVa == NULL) + { + ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY; + DBGPRINT_ERR(("Failed to allocate a big buffer\n")); + Status = NDIS_STATUS_RESOURCES; + break; + } + + // Zero init this memory block + NdisZeroMemory(pAd->MgmtDescRing.AllocVa, pAd->MgmtDescRing.AllocSize); + + // Save PA & VA for further operation + RingBasePaHigh = RTMP_GetPhysicalAddressHigh(pAd->MgmtDescRing.AllocPa); + RingBasePaLow = RTMP_GetPhysicalAddressLow (pAd->MgmtDescRing.AllocPa); + RingBaseVa = pAd->MgmtDescRing.AllocVa; + + // + // Initialize MGMT Ring and associated buffer memory + // + for (index = 0; index < MGMT_RING_SIZE; index++) + { + pAd->MgmtRing.Cell[index].pNdisPacket = NULL; + pAd->MgmtRing.Cell[index].pNextNdisPacket = NULL; + // Init MGMT Ring Size, Va, Pa variables + pAd->MgmtRing.Cell[index].AllocSize = TXD_SIZE; + pAd->MgmtRing.Cell[index].AllocVa = RingBaseVa; + RTMP_SetPhysicalAddressHigh(pAd->MgmtRing.Cell[index].AllocPa, RingBasePaHigh); + RTMP_SetPhysicalAddressLow (pAd->MgmtRing.Cell[index].AllocPa, RingBasePaLow); + + // Offset to next ring descriptor address + RingBasePaLow += TXD_SIZE; + RingBaseVa = (PUCHAR) RingBaseVa + TXD_SIZE; + + // link the pre-allocated TxBuf to TXD + pTxD = (PTXD_STRUC) pAd->MgmtRing.Cell[index].AllocVa; + pTxD->DMADONE = 1; + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif + // no pre-allocated buffer required in MgmtRing for scatter-gather case + } + DBGPRINT(RT_DEBUG_TRACE, ("MGMT Ring: total %d entry allocated\n", index)); + + // + // Allocate RX ring descriptor's memory except Tx ring which allocated eariler + // + pAd->RxDescRing.AllocSize = RX_RING_SIZE * RXD_SIZE; + RTMP_AllocateRxDescMemory( + pAd, + pAd->RxDescRing.AllocSize, + FALSE, + &pAd->RxDescRing.AllocVa, + &pAd->RxDescRing.AllocPa); + + if (pAd->RxDescRing.AllocVa == NULL) + { + ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY; + DBGPRINT_ERR(("Failed to allocate a big buffer\n")); + Status = NDIS_STATUS_RESOURCES; + break; + } + + // Zero init this memory block + NdisZeroMemory(pAd->RxDescRing.AllocVa, pAd->RxDescRing.AllocSize); + + + DBGPRINT(RT_DEBUG_OFF, + ("RX DESC %p size = %ld\n", pAd->RxDescRing.AllocVa, pAd->RxDescRing.AllocSize)); + + // Save PA & VA for further operation + RingBasePaHigh = RTMP_GetPhysicalAddressHigh(pAd->RxDescRing.AllocPa); + RingBasePaLow = RTMP_GetPhysicalAddressLow (pAd->RxDescRing.AllocPa); + RingBaseVa = pAd->RxDescRing.AllocVa; + + // + // Initialize Rx Ring and associated buffer memory + // + for (index = 0; index < RX_RING_SIZE; index++) + { + // Init RX Ring Size, Va, Pa variables + pAd->RxRing.Cell[index].AllocSize = RXD_SIZE; + pAd->RxRing.Cell[index].AllocVa = RingBaseVa; + RTMP_SetPhysicalAddressHigh(pAd->RxRing.Cell[index].AllocPa, RingBasePaHigh); + RTMP_SetPhysicalAddressLow (pAd->RxRing.Cell[index].AllocPa, RingBasePaLow); + + //NdisZeroMemory(RingBaseVa, RXD_SIZE); + + // Offset to next ring descriptor address + RingBasePaLow += RXD_SIZE; + RingBaseVa = (PUCHAR) RingBaseVa + RXD_SIZE; + + // Setup Rx associated Buffer size & allocate share memory + pDmaBuf = &pAd->RxRing.Cell[index].DmaBuf; + pDmaBuf->AllocSize = RX_BUFFER_AGGRESIZE; + pPacket = RTMP_AllocateRxPacketBuffer( + pAd, + pDmaBuf->AllocSize, + FALSE, + &pDmaBuf->AllocVa, + &pDmaBuf->AllocPa); + + /* keep allocated rx packet */ + pAd->RxRing.Cell[index].pNdisPacket = pPacket; + + // Error handling + if (pDmaBuf->AllocVa == NULL) + { + ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY; + DBGPRINT_ERR(("Failed to allocate RxRing's 1st buffer\n")); + Status = NDIS_STATUS_RESOURCES; + break; + } + + // Zero init this memory block + NdisZeroMemory(pDmaBuf->AllocVa, pDmaBuf->AllocSize); + + // Write RxD buffer address & allocated buffer length + pRxD = (PRXD_STRUC) pAd->RxRing.Cell[index].AllocVa; + pRxD->SDP0 = RTMP_GetPhysicalAddressLow(pDmaBuf->AllocPa); + pRxD->DDONE = 0; + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pRxD, TYPE_RXD); +#endif + } + + DBGPRINT(RT_DEBUG_TRACE, ("Rx Ring: total %d entry allocated\n", index)); + + } while (FALSE); + + + NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME)); + pAd->FragFrame.pFragPacket = RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE); + + if (pAd->FragFrame.pFragPacket == NULL) + { + Status = NDIS_STATUS_RESOURCES; + } + + if (Status != NDIS_STATUS_SUCCESS) + { + // Log error inforamtion + NdisWriteErrorLogEntry( + pAd->AdapterHandle, + NDIS_ERROR_CODE_OUT_OF_RESOURCES, + 1, + ErrorValue); + } + + // Following code segment get from original func:NICInitTxRxRingAndBacklogQueue(), now should integrate it to here. + { + DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitTxRxRingAndBacklogQueue\n")); + +/* + // Disable DMA. + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); + GloCfg.word &= 0xff0; + GloCfg.field.EnTXWriteBackDDONE =1; + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); +*/ + + // Initialize all transmit related software queues + for(index = 0; index < NUM_OF_TX_RING; index++) + { + InitializeQueueHeader(&pAd->TxSwQueue[index]); + // Init TX rings index pointer + pAd->TxRing[index].TxSwFreeIdx = 0; + pAd->TxRing[index].TxCpuIdx = 0; + //RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10) , pAd->TxRing[i].TX_CTX_IDX); + } + + // Init RX Ring index pointer + pAd->RxRing.RxSwReadIdx = 0; + pAd->RxRing.RxCpuIdx = RX_RING_SIZE - 1; + //RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RX_CRX_IDX0); + + + // init MGMT ring index pointer + pAd->MgmtRing.TxSwFreeIdx = 0; + pAd->MgmtRing.TxCpuIdx = 0; + + pAd->PrivateInfo.TxRingFullCnt = 0; + + DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitTxRxRingAndBacklogQueue\n")); + } + + DBGPRINT_S(Status, ("<-- RTMPAllocTxRxRingMemory, Status=%x\n", Status)); + return Status; +} + + + + +/* + ======================================================================== + + Routine Description: + Reset NIC Asics. Call after rest DMA. So reset TX_CTX_IDX to zero. + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + Reset NIC to initial state AS IS system boot up time. + + ======================================================================== +*/ +VOID RTMPRingCleanUp( + IN PRTMP_ADAPTER pAd, + IN UCHAR RingType) +{ + PTXD_STRUC pTxD; + PRXD_STRUC pRxD; + PQUEUE_ENTRY pEntry; + PNDIS_PACKET pPacket; + int i; + PRTMP_TX_RING pTxRing; + unsigned long IrqFlags; + //UINT32 RxSwReadIdx; + + + DBGPRINT(RT_DEBUG_TRACE,("RTMPRingCleanUp(RingIdx=%d, Pending-NDIS=%ld)\n", RingType, pAd->RalinkCounters.PendingNdisPacketCount)); + switch (RingType) + { + case QID_AC_BK: + case QID_AC_BE: + case QID_AC_VI: + case QID_AC_VO: + case QID_HCCA: + + pTxRing = &pAd->TxRing[RingType]; + + RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); + // We have to clean all descriptors in case some error happened with reset + for (i=0; i<TX_RING_SIZE; i++) // We have to scan all TX ring + { + pTxD = (PTXD_STRUC) pTxRing->Cell[i].AllocVa; + + pPacket = (PNDIS_PACKET) pTxRing->Cell[i].pNdisPacket; + // release scatter-and-gather NDIS_PACKET + if (pPacket) + { + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + pTxRing->Cell[i].pNdisPacket = NULL; + } + + pPacket = (PNDIS_PACKET) pTxRing->Cell[i].pNextNdisPacket; + // release scatter-and-gather NDIS_PACKET + if (pPacket) + { + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + pTxRing->Cell[i].pNextNdisPacket = NULL; + } + } + + RTMP_IO_READ32(pAd, TX_DTX_IDX0 + RingType * 0x10, &pTxRing->TxDmaIdx); + pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx; + pTxRing->TxCpuIdx = pTxRing->TxDmaIdx; + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + RingType * 0x10, pTxRing->TxCpuIdx); + + RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); + + RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); + while (pAd->TxSwQueue[RingType].Head != NULL) + { + pEntry = RemoveHeadQueue(&pAd->TxSwQueue[RingType]); + pPacket = QUEUE_ENTRY_TO_PACKET(pEntry); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + DBGPRINT(RT_DEBUG_TRACE,("Release 1 NDIS packet from s/w backlog queue\n")); + } + RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); + break; + + case QID_MGMT: + // We have to clean all descriptors in case some error happened with reset + NdisAcquireSpinLock(&pAd->MgmtRingLock); + + for (i=0; i<MGMT_RING_SIZE; i++) + { + pTxD = (PTXD_STRUC) pAd->MgmtRing.Cell[i].AllocVa; + + pPacket = (PNDIS_PACKET) pAd->MgmtRing.Cell[i].pNdisPacket; + // rlease scatter-and-gather NDIS_PACKET + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + } + pAd->MgmtRing.Cell[i].pNdisPacket = NULL; + + pPacket = (PNDIS_PACKET) pAd->MgmtRing.Cell[i].pNextNdisPacket; + // release scatter-and-gather NDIS_PACKET + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + } + pAd->MgmtRing.Cell[i].pNextNdisPacket = NULL; + + } + + RTMP_IO_READ32(pAd, TX_MGMTDTX_IDX, &pAd->MgmtRing.TxDmaIdx); + pAd->MgmtRing.TxSwFreeIdx = pAd->MgmtRing.TxDmaIdx; + pAd->MgmtRing.TxCpuIdx = pAd->MgmtRing.TxDmaIdx; + RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx); + + NdisReleaseSpinLock(&pAd->MgmtRingLock); + pAd->RalinkCounters.MgmtRingFullCount = 0; + break; + + case QID_RX: + // We have to clean all descriptors in case some error happened with reset + NdisAcquireSpinLock(&pAd->RxRingLock); + + for (i=0; i<RX_RING_SIZE; i++) + { + pRxD = (PRXD_STRUC) pAd->RxRing.Cell[i].AllocVa; + pRxD->DDONE = 0 ; + } + + RTMP_IO_READ32(pAd, RX_DRX_IDX, &pAd->RxRing.RxDmaIdx); + pAd->RxRing.RxSwReadIdx = pAd->RxRing.RxDmaIdx; + pAd->RxRing.RxCpuIdx = ((pAd->RxRing.RxDmaIdx == 0) ? (RX_RING_SIZE-1) : (pAd->RxRing.RxDmaIdx-1)); + RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx); + + NdisReleaseSpinLock(&pAd->RxRingLock); + break; + + default: + break; + } +} + + +VOID RTMPFreeTxRxRingMemory( + IN PRTMP_ADAPTER pAd) +{ + int index, num , j; + PRTMP_TX_RING pTxRing; + PTXD_STRUC pTxD; + PNDIS_PACKET pPacket; + unsigned int IrqFlags; + + //POS_COOKIE pObj =(POS_COOKIE) pAd->OS_Cookie; + + DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPFreeTxRxRingMemory\n")); + + // Free TxSwQueue Packet + for (index=0; index <NUM_OF_TX_RING; index++) + { + PQUEUE_ENTRY pEntry; + PNDIS_PACKET pPacket; + PQUEUE_HEADER pQueue; + + RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); + pQueue = &pAd->TxSwQueue[index]; + while (pQueue->Head) + { + pEntry = RemoveHeadQueue(pQueue); + pPacket = QUEUE_ENTRY_TO_PACKET(pEntry); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + } + RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); + } + + // Free Tx Ring Packet + for (index=0;index< NUM_OF_TX_RING;index++) + { + pTxRing = &pAd->TxRing[index]; + + for (j=0; j< TX_RING_SIZE; j++) + { + pTxD = (PTXD_STRUC) (pTxRing->Cell[j].AllocVa); + pPacket = pTxRing->Cell[j].pNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + //Always assign pNdisPacket as NULL after clear + pTxRing->Cell[j].pNdisPacket = NULL; + + pPacket = pTxRing->Cell[j].pNextNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + //Always assign pNextNdisPacket as NULL after clear + pTxRing->Cell[pTxRing->TxSwFreeIdx].pNextNdisPacket = NULL; + + } + } + + for (index = RX_RING_SIZE - 1 ; index >= 0; index--) + { + if ((pAd->RxRing.Cell[index].DmaBuf.AllocVa) && (pAd->RxRing.Cell[index].pNdisPacket)) + { + PCI_UNMAP_SINGLE(pAd, pAd->RxRing.Cell[index].DmaBuf.AllocPa, pAd->RxRing.Cell[index].DmaBuf.AllocSize, PCI_DMA_FROMDEVICE); + RELEASE_NDIS_PACKET(pAd, pAd->RxRing.Cell[index].pNdisPacket, NDIS_STATUS_SUCCESS); + } + } + NdisZeroMemory(pAd->RxRing.Cell, RX_RING_SIZE * sizeof(RTMP_DMACB)); + + if (pAd->RxDescRing.AllocVa) + { + RTMP_FreeDescMemory(pAd, pAd->RxDescRing.AllocSize, pAd->RxDescRing.AllocVa, pAd->RxDescRing.AllocPa); + } + NdisZeroMemory(&pAd->RxDescRing, sizeof(RTMP_DMABUF)); + + if (pAd->MgmtDescRing.AllocVa) + { + RTMP_FreeDescMemory(pAd, pAd->MgmtDescRing.AllocSize, pAd->MgmtDescRing.AllocVa, pAd->MgmtDescRing.AllocPa); + } + NdisZeroMemory(&pAd->MgmtDescRing, sizeof(RTMP_DMABUF)); + + for (num = 0; num < NUM_OF_TX_RING; num++) + { + if (pAd->TxBufSpace[num].AllocVa) + { + RTMP_FreeFirstTxBuffer(pAd, pAd->TxBufSpace[num].AllocSize, FALSE, pAd->TxBufSpace[num].AllocVa, pAd->TxBufSpace[num].AllocPa); + } + NdisZeroMemory(&pAd->TxBufSpace[num], sizeof(RTMP_DMABUF)); + + if (pAd->TxDescRing[num].AllocVa) + { + RTMP_FreeDescMemory(pAd, pAd->TxDescRing[num].AllocSize, pAd->TxDescRing[num].AllocVa, pAd->TxDescRing[num].AllocPa); + } + NdisZeroMemory(&pAd->TxDescRing[num], sizeof(RTMP_DMABUF)); + } + + if (pAd->FragFrame.pFragPacket) + RELEASE_NDIS_PACKET(pAd, pAd->FragFrame.pFragPacket, NDIS_STATUS_SUCCESS); + + DBGPRINT(RT_DEBUG_TRACE, ("<-- RTMPFreeTxRxRingMemory\n")); +} + + +/*************************************************************************** + * + * register related procedures. + * + **************************************************************************/ +/* +======================================================================== +Routine Description: + Disable DMA. + +Arguments: + *pAd the raxx interface data pointer + +Return Value: + None + +Note: +======================================================================== +*/ +VOID RT28XXDMADisable( + IN RTMP_ADAPTER *pAd) +{ + WPDMA_GLO_CFG_STRUC GloCfg; + + + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); + GloCfg.word &= 0xff0; + GloCfg.field.EnTXWriteBackDDONE =1; + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); +} + + +/* +======================================================================== +Routine Description: + Enable DMA. + +Arguments: + *pAd the raxx interface data pointer + +Return Value: + None + +Note: +======================================================================== +*/ +VOID RT28XXDMAEnable( + IN RTMP_ADAPTER *pAd) +{ + WPDMA_GLO_CFG_STRUC GloCfg; + int i = 0; + + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x4); + do + { + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); + if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0)) + break; + + DBGPRINT(RT_DEBUG_TRACE, ("==> DMABusy\n")); + RTMPusecDelay(1000); + i++; + }while ( i <200); + + RTMPusecDelay(50); + + GloCfg.field.EnTXWriteBackDDONE = 1; + GloCfg.field.WPDMABurstSIZE = 2; + GloCfg.field.EnableRxDMA = 1; + GloCfg.field.EnableTxDMA = 1; + + DBGPRINT(RT_DEBUG_TRACE, ("<== WRITE DMA offset 0x208 = 0x%x\n", GloCfg.word)); + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); + +} + + +BOOLEAN AsicCheckCommanOk( + IN PRTMP_ADAPTER pAd, + IN UCHAR Command) +{ + UINT32 CmdStatus = 0, CID = 0, i; + UINT32 ThisCIDMask = 0; + + i = 0; + do + { + RTMP_IO_READ32(pAd, H2M_MAILBOX_CID, &CID); + // Find where the command is. Because this is randomly specified by firmware. + if ((CID & CID0MASK) == Command) + { + ThisCIDMask = CID0MASK; + break; + } + else if ((((CID & CID1MASK)>>8) & 0xff) == Command) + { + ThisCIDMask = CID1MASK; + break; + } + else if ((((CID & CID2MASK)>>16) & 0xff) == Command) + { + ThisCIDMask = CID2MASK; + break; + } + else if ((((CID & CID3MASK)>>24) & 0xff) == Command) + { + ThisCIDMask = CID3MASK; + break; + } + + RTMPusecDelay(100); + i++; + }while (i < 200); + + // Get CommandStatus Value + RTMP_IO_READ32(pAd, H2M_MAILBOX_STATUS, &CmdStatus); + + // This command's status is at the same position as command. So AND command position's bitmask to read status. + if (i < 200) + { + // If Status is 1, the comamnd is success. + if (((CmdStatus & ThisCIDMask) == 0x1) || ((CmdStatus & ThisCIDMask) == 0x100) + || ((CmdStatus & ThisCIDMask) == 0x10000) || ((CmdStatus & ThisCIDMask) == 0x1000000)) + { + DBGPRINT(RT_DEBUG_TRACE, ("--> AsicCheckCommanOk CID = 0x%x, CmdStatus= 0x%x \n", CID, CmdStatus)); + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_STATUS, 0xffffffff); + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CID, 0xffffffff); + return TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("--> AsicCheckCommanFail1 CID = 0x%x, CmdStatus= 0x%x \n", CID, CmdStatus)); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("--> AsicCheckCommanFail2 Timeout Command = %d, CmdStatus= 0x%x \n", Command, CmdStatus)); + } + // Clear Command and Status. + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_STATUS, 0xffffffff); + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CID, 0xffffffff); + + return FALSE; +} + + +/* +======================================================================== +Routine Description: + Write Beacon buffer to Asic. + +Arguments: + *pAd the raxx interface data pointer + +Return Value: + None + +Note: +======================================================================== +*/ +VOID RT28xx_UpdateBeaconToAsic( + IN RTMP_ADAPTER *pAd, + IN INT apidx, + IN ULONG FrameLen, + IN ULONG UpdatePos) +{ + ULONG CapInfoPos = 0; + UCHAR *ptr, *ptr_update, *ptr_capinfo; + UINT i; + BOOLEAN bBcnReq = FALSE; + UCHAR bcn_idx = 0; + + + { + DBGPRINT(RT_DEBUG_ERROR, ("%s() : No valid Interface be found.\n", __FUNCTION__)); + return; + } + + //if ((pAd->WdsTab.Mode == WDS_BRIDGE_MODE) + // || ((pAd->ApCfg.MBSSID[apidx].MSSIDDev == NULL) + // || !((RTMP_OS_NETDEV_STATE_RUNNING(pAd->ApCfg.MBSSID[apidx].MSSIDDev))) + // ) + if (bBcnReq == FALSE) + { + /* when the ra interface is down, do not send its beacon frame */ + /* clear all zero */ + for(i=0; i<TXWI_SIZE; i+=4) + RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[bcn_idx] + i, 0x00); + } + else + { + ptr = (PUCHAR)&pAd->BeaconTxWI; +#ifdef RT_BIG_ENDIAN + RTMPWIEndianChange(ptr, TYPE_TXWI); +#endif + for (i=0; i<TXWI_SIZE; i+=4) // 16-byte TXWI field + { + UINT32 longptr = *ptr + (*(ptr+1)<<8) + (*(ptr+2)<<16) + (*(ptr+3)<<24); + RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[bcn_idx] + i, longptr); + ptr += 4; + } + + // Update CapabilityInfo in Beacon + for (i = CapInfoPos; i < (CapInfoPos+2); i++) + { + RTMP_IO_WRITE8(pAd, pAd->BeaconOffset[bcn_idx] + TXWI_SIZE + i, *ptr_capinfo); + ptr_capinfo ++; + } + + if (FrameLen > UpdatePos) + { + for (i= UpdatePos; i< (FrameLen); i++) + { + RTMP_IO_WRITE8(pAd, pAd->BeaconOffset[bcn_idx] + TXWI_SIZE + i, *ptr_update); + ptr_update ++; + } + } + + } + +} + + +#ifdef CONFIG_STA_SUPPORT +VOID RT28xxPciStaAsicForceWakeup( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bFromTx) +{ + AUTO_WAKEUP_STRUC AutoWakeupCfg; + + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + return; + + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WAKEUP_NOW)) + { + DBGPRINT(RT_DEBUG_TRACE, ("waking up now!\n")); + return; + } + + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_WAKEUP_NOW); + + // RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW); +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE) + &&pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + { + // Support PCIe Advance Power Save + if (bFromTx == TRUE + &&(pAd->Mlme.bPsPollTimerRunning == TRUE)) + { + pAd->Mlme.bPsPollTimerRunning = FALSE; + RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP); + RTMPusecDelay(3000); + DBGPRINT(RT_DEBUG_TRACE, ("=======AsicForceWakeup===bFromTx\n")); + } + + AutoWakeupCfg.word = 0; + RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); + + if (RT28xxPciAsicRadioOn(pAd, DOT11POWERSAVE)) + { + { + // end johnli + // In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. + if (INFRA_ON(pAd) && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel) + && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) + { + // Must using 40MHz. + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + } + else + { + // Must using 20MHz. + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + } + } + } + } + else +#endif // PCIE_PS_SUPPORT // + { + // PCI, 2860-PCIe + DBGPRINT(RT_DEBUG_TRACE, ("<==RT28xxPciStaAsicForceWakeup::Original PCI Power Saving\n")); + AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02); + AutoWakeupCfg.word = 0; + RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); + } + + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW); + DBGPRINT(RT_DEBUG_TRACE, ("<=======RT28xxPciStaAsicForceWakeup\n")); +} + + +VOID RT28xxPciStaAsicSleepThenAutoWakeup( + IN PRTMP_ADAPTER pAd, + IN USHORT TbttNumToNextWakeUp) +{ + BOOLEAN brc; + + if (pAd->StaCfg.bRadio == FALSE) + { + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); + return; + } +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE) + &&pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + { + ULONG Now = 0; + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WAKEUP_NOW)) + { + DBGPRINT(RT_DEBUG_TRACE, ("waking up now!\n")); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); + return; + } + + NdisGetSystemUpTime(&Now); + // If last send NULL fram time is too close to this receiving beacon (within 8ms), don't go to sleep for this DTM. + // Because Some AP can't queuing outgoing frames immediately. + if (((pAd->Mlme.LastSendNULLpsmTime + 8) >= Now) && (pAd->Mlme.LastSendNULLpsmTime <= Now)) + { + DBGPRINT(RT_DEBUG_TRACE, ("Now = %lu, LastSendNULLpsmTime=%lu : RxCountSinceLastNULL = %lu. \n", Now, pAd->Mlme.LastSendNULLpsmTime, pAd->RalinkCounters.RxCountSinceLastNULL)); + return; + } + else if ((pAd->RalinkCounters.RxCountSinceLastNULL > 0) && ((pAd->Mlme.LastSendNULLpsmTime + pAd->CommonCfg.BeaconPeriod) >= Now)) + { + DBGPRINT(RT_DEBUG_TRACE, ("Now = %lu, LastSendNULLpsmTime=%lu: RxCountSinceLastNULL = %lu > 0 \n", Now, pAd->Mlme.LastSendNULLpsmTime, pAd->RalinkCounters.RxCountSinceLastNULL)); + return; + } + + brc = RT28xxPciAsicRadioOff(pAd, DOT11POWERSAVE, TbttNumToNextWakeUp); + if (brc==TRUE) + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_DOZE); + } + else +#endif // PCIE_PS_SUPPORT // + { + AUTO_WAKEUP_STRUC AutoWakeupCfg; + // we have decided to SLEEP, so at least do it for a BEACON period. + if (TbttNumToNextWakeUp == 0) + TbttNumToNextWakeUp = 1; + + //RTMP_IO_WRITE32(pAd, INT_MASK_CSR, AutoWakeupInt); + + AutoWakeupCfg.word = 0; + RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); + AutoWakeupCfg.field.NumofSleepingTbtt = TbttNumToNextWakeUp - 1; + AutoWakeupCfg.field.EnableAutoWakeup = 1; + AutoWakeupCfg.field.AutoLeadTime = 5; + RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); + AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x00); // send POWER-SAVE command to MCU. Timeout 40us. + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_DOZE); + DBGPRINT(RT_DEBUG_TRACE, ("<-- %s, TbttNumToNextWakeUp=%d \n", __FUNCTION__, TbttNumToNextWakeUp)); + } + +} + +#ifdef PCIE_PS_SUPPORT +VOID PsPollWakeExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + unsigned long flags; + + DBGPRINT(RT_DEBUG_TRACE,("-->PsPollWakeExec \n")); + + RTMP_INT_LOCK(&pAd->irq_lock, flags); + if (pAd->Mlme.bPsPollTimerRunning) + { + RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP); + } + pAd->Mlme.bPsPollTimerRunning = FALSE; + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); +} + + +VOID RadioOnExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + RTMP_CHIP_OP *pChipOps = &pAd->chipOps; + WPDMA_GLO_CFG_STRUC DmaCfg; + BOOLEAN Cancelled; + + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { + DBGPRINT(RT_DEBUG_TRACE,("-->RadioOnExec() return on fOP_STATUS_DOZE == TRUE; \n")); + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE) + &&pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 10); + return; + } + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + DBGPRINT(RT_DEBUG_TRACE,("-->RadioOnExec() return on SCAN_IN_PROGRESS; \n")); + + + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE) + &&pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 10); + return; + } + +if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE) + &&pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + { + pAd->Mlme.bPsPollTimerRunning = FALSE; + RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); + } + + + if (pAd->StaCfg.bRadio == TRUE) + { + pAd->bPCIclkOff = FALSE; + RTMPRingCleanUp(pAd, QID_AC_BK); + RTMPRingCleanUp(pAd, QID_AC_BE); + RTMPRingCleanUp(pAd, QID_AC_VI); + RTMPRingCleanUp(pAd, QID_AC_VO); + RTMPRingCleanUp(pAd, QID_HCCA); + RTMPRingCleanUp(pAd, QID_MGMT); + RTMPRingCleanUp(pAd, QID_RX); + + // 2. Send wake up command. + AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02); + // 2-1. wait command ok. + AsicCheckCommanOk(pAd, PowerWakeCID); + + // When PCI clock is off, don't want to service interrupt. So when back to clock on, enable interrupt. + //RTMP_IO_WRITE32(pAd, INT_MASK_CSR, (DELAYINTMASK|RxINT)); + RTMP_ASIC_INTERRUPT_ENABLE(pAd); + + // 3. Enable Tx DMA. + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word); + DmaCfg.field.EnableTxDMA = 1; + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, DmaCfg.word); + + // In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. + if (INFRA_ON(pAd) && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel) + && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) + { + // Must using 40MHz. + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + } + else + { + // Must using 20MHz. + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + } + + if (pChipOps->AsicReverseRfFromSleepMode) + pChipOps->AsicReverseRfFromSleepMode(pAd); + + // Clear Radio off flag + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); + + // Set LED + RTMPSetLED(pAd, LED_RADIO_ON); + + if (pAd->StaCfg.Psm == PWR_ACTIVE) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); + } + } + else + { + RT28xxPciAsicRadioOff(pAd, GUIRADIO_OFF, 0); + } +} +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + +/* + ========================================================================== + Description: + This routine sends command to firmware and turn our chip to wake up mode from power save mode. + Both RadioOn and .11 power save function needs to call this routine. + Input: + Level = GUIRADIO_OFF : call this function is from Radio Off to Radio On. Need to restore PCI host value. + Level = other value : normal wake up function. + + ========================================================================== + */ +BOOLEAN RT28xxPciAsicRadioOn( + IN PRTMP_ADAPTER pAd, + IN UCHAR Level) +{ + //WPDMA_GLO_CFG_STRUC DmaCfg; +#ifdef CONFIG_STA_SUPPORT + BOOLEAN Cancelled; +#endif // CONFIG_STA_SUPPORT // + //UINT32 MACValue; + + if (pAd->OpMode == OPMODE_AP && Level==DOT11POWERSAVE) + return FALSE; + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + { + if (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + { + pAd->Mlme.bPsPollTimerRunning = FALSE; + RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); + } + if ((pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)&& + ((Level == GUIRADIO_OFF) || (Level == GUI_IDLE_POWER_SAVE)) + ||(RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND))) + { + // Some chips don't need to delay 6ms, so copy RTMPPCIePowerLinkCtrlRestore + // return condition here. + /* + if (((pAd->MACVersion&0xffff0000) != 0x28600000) + && ((pAd->DeviceID == NIC2860_PCIe_DEVICE_ID) + ||(pAd->DeviceID == NIC2790_PCIe_DEVICE_ID))) + */ + { + DBGPRINT(RT_DEBUG_TRACE, ("RT28xxPciAsicRadioOn ()\n")); + // 1. Set PCI Link Control in Configuration Space. + RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP); + RTMPusecDelay(6000); + } + } + } + + { + pAd->bPCIclkOff = FALSE; + DBGPRINT(RT_DEBUG_TRACE, ("PSM :309xbPCIclkOff == %d\n", pAd->bPCIclkOff)); + + } +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + // 2. Send wake up command. + AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02); + pAd->bPCIclkOff = FALSE; + // 2-1. wait command ok. + AsicCheckCommanOk(pAd, PowerWakeCID); + RTMP_ASIC_INTERRUPT_ENABLE(pAd); + + + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF); + if (Level == GUI_IDLE_POWER_SAVE) + { + //2009/06/09: AP and stations need call the following function + { + // In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (INFRA_ON(pAd) && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel) + && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) + { + // Must using 40MHz. + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + } + else + { + // Must using 20MHz. + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + } + } +#endif // CONFIG_STA_SUPPORT // + } + } + return TRUE; + +} + + +/* + ========================================================================== + Description: + This routine sends command to firmware and turn our chip to power save mode. + Both RadioOff and .11 power save function needs to call this routine. + Input: + Level = GUIRADIO_OFF : GUI Radio Off mode + Level = DOT11POWERSAVE : 802.11 power save mode + Level = RTMP_HALT : When Disable device. + + ========================================================================== + */ +BOOLEAN RT28xxPciAsicRadioOff( + IN PRTMP_ADAPTER pAd, + IN UCHAR Level, + IN USHORT TbttNumToNextWakeUp) +{ +#ifdef CONFIG_STA_SUPPORT + WPDMA_GLO_CFG_STRUC DmaCfg; + UCHAR i, tempBBP_R3 = 0; +#ifdef PCIE_PS_SUPPORT + ULONG BeaconPeriodTime; + UINT32 PsPollTime = 0/*, MACValue*/; + UINT32 TbTTTime = 0; + BOOLEAN Cancelled; +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + BOOLEAN brc = FALSE; + UINT32 RxDmaIdx, RxCpuIdx; + DBGPRINT(RT_DEBUG_TRACE, ("%s ===> Lv= %d, TxCpuIdx = %d, TxDmaIdx = %d. RxCpuIdx = %d, RxDmaIdx = %d.\n", + __FUNCTION__, Level,pAd->TxRing[0].TxCpuIdx, pAd->TxRing[0].TxDmaIdx, pAd->RxRing.RxCpuIdx, pAd->RxRing.RxDmaIdx)); + + if (pAd->OpMode == OPMODE_AP && Level==DOT11POWERSAVE) + return FALSE; + + // Check Rx DMA busy status, if more than half is occupied, give up this radio off. + RTMP_IO_READ32(pAd, RX_DRX_IDX , &RxDmaIdx); + RTMP_IO_READ32(pAd, RX_CRX_IDX , &RxCpuIdx); + if ((RxDmaIdx > RxCpuIdx) && ((RxDmaIdx - RxCpuIdx) > RX_RING_SIZE/3)) + { + DBGPRINT(RT_DEBUG_TRACE, ("AsicRadioOff ===> return1. RxDmaIdx = %d , RxCpuIdx = %d. \n", RxDmaIdx, RxCpuIdx)); + return FALSE; + } + else if ((RxCpuIdx >= RxDmaIdx) && ((RxCpuIdx - RxDmaIdx) < RX_RING_SIZE/3)) + { + DBGPRINT(RT_DEBUG_TRACE, ("AsicRadioOff ===> return2. RxCpuIdx = %d. RxDmaIdx = %d , \n", RxCpuIdx, RxDmaIdx)); + return FALSE; + } + + // Once go into this function, disable tx because don't want too many packets in queue to prevent HW stops. + //pAd->bPCIclkOffDisableTx = TRUE; +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + RTMP_SET_PSFLAG(pAd, fRTMP_PS_DISABLE_TX); + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE) + && pAd->OpMode == OPMODE_STA + &&pAd->StaCfg.PSControl.field.EnableNewPS == TRUE + ) + { + + RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled); + RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); + + if (Level == DOT11POWERSAVE) + { + RTMP_IO_READ32(pAd, TBTT_TIMER, &TbTTTime); + TbTTTime &= 0x1ffff; + // 00. check if need to do sleep in this DTIM period. If next beacon will arrive within 30ms , ...doesn't necessarily sleep. + // TbTTTime uint = 64us, LEAD_TIME unit = 1024us, PsPollTime unit = 1ms + if (((64*TbTTTime) <((LEAD_TIME*1024) + 40000)) && (TbttNumToNextWakeUp == 0)) + { + DBGPRINT(RT_DEBUG_TRACE, ("TbTTTime = 0x%x , give up this sleep. \n", TbTTTime)); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); + //pAd->bPCIclkOffDisableTx = FALSE; + RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_DISABLE_TX); + return FALSE; + } + else + { + PsPollTime = (64*TbTTTime- LEAD_TIME*1024)/1000; + PsPollTime -= 3; + + BeaconPeriodTime = pAd->CommonCfg.BeaconPeriod*102/100; + if (TbttNumToNextWakeUp > 0) + PsPollTime += ((TbttNumToNextWakeUp -1) * BeaconPeriodTime); + + pAd->Mlme.bPsPollTimerRunning = TRUE; + RTMPSetTimer(&pAd->Mlme.PsPollTimer, PsPollTime); + } + } + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("RT28xxPciAsicRadioOff::Level!=DOT11POWERSAVE \n")); + } +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + //pAd->bPCIclkOffDisableTx = FALSE; + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF); + +#ifdef CONFIG_STA_SUPPORT + // Set to 1R. + if (pAd->Antenna.field.RxPath > 1 && pAd->OpMode == OPMODE_STA) + { + tempBBP_R3 = (pAd->StaCfg.BBPR3 & 0xE7); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, tempBBP_R3); + } +#endif // CONFIG_STA_SUPPORT // + + // In Radio Off, we turn off RF clk, So now need to call ASICSwitchChannel again. + if ((INFRA_ON(pAd) || pAd->OpMode == OPMODE_AP) && (pAd->CommonCfg.CentralChannel != pAd->CommonCfg.Channel) + && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) + { + // Must using 40MHz. + AsicTurnOffRFClk(pAd, pAd->CommonCfg.CentralChannel); + } + else + { + // Must using 20MHz. + AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel); + } + + if (Level != RTMP_HALT) + { + // Change Interrupt bitmask. + // When PCI clock is off, don't want to service interrupt. + RTMP_IO_WRITE32(pAd, INT_MASK_CSR, AutoWakeupInt); + } + else + { + RTMP_ASIC_INTERRUPT_DISABLE(pAd); + } + + + RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx); + // 2. Send Sleep command + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_STATUS, 0xffffffff); + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CID, 0xffffffff); + // send POWER-SAVE command to MCU. high-byte = 1 save power as much as possible. high byte = 0 save less power + AsicSendCommandToMcu(pAd, 0x30, PowerSafeCID, 0xff, 0x1); + // 2-1. Wait command success + // Status = 1 : success, Status = 2, already sleep, Status = 3, Maybe MAC is busy so can't finish this task. + brc = AsicCheckCommanOk(pAd, PowerSafeCID); + + // 3. After 0x30 command is ok, send radio off command. lowbyte = 0 for power safe. + // If 0x30 command is not ok this time, we can ignore 0x35 command. It will make sure not cause firmware'r problem. + if ((Level == DOT11POWERSAVE) && (brc == TRUE)) + { + AsicSendCommandToMcu(pAd, 0x35, PowerRadioOffCID, 0, 0x00); // lowbyte = 0 means to do power safe, NOT turn off radio. + // 3-1. Wait command success + AsicCheckCommanOk(pAd, PowerRadioOffCID); + } + else if (brc == TRUE) + { + AsicSendCommandToMcu(pAd, 0x35, PowerRadioOffCID, 1, 0x00); // lowbyte = 0 means to do power safe, NOT turn off radio. + // 3-1. Wait command success + AsicCheckCommanOk(pAd, PowerRadioOffCID); + } + +#ifdef CONFIG_STA_SUPPORT + // 1. Wait DMA not busy + i = 0; + do + { + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &DmaCfg.word); + if ((DmaCfg.field.RxDMABusy == 0) && (DmaCfg.field.TxDMABusy == 0)) + break; + RTMPusecDelay(20); + i++; + }while(i < 50); + + /* + if (i >= 50) + { + pAd->CheckDmaBusyCount++; + DBGPRINT(RT_DEBUG_TRACE, ("DMA Rx keeps busy. return on AsicRadioOff () CheckDmaBusyCount = %d \n", pAd->CheckDmaBusyCount)); + } + else + { + pAd->CheckDmaBusyCount = 0; + } + */ +#endif // CONFIG_STA_SUPPORT // +//KH Debug:My original codes have the follwoing codes, but currecnt codes do not have it. +// Disable for stability. If PCIE Link Control is modified for advance power save, re-covery this code segment. +RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x1280); +//OPSTATUS_SET_FLAG(pAd, fOP_STATUS_CLKSELECT_40MHZ); + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + if (Level == DOT11POWERSAVE) + { + AUTO_WAKEUP_STRUC AutoWakeupCfg; + //RTMPSetTimer(&pAd->Mlme.PsPollTimer, 90); + + // we have decided to SLEEP, so at least do it for a BEACON period. + if (TbttNumToNextWakeUp == 0) + TbttNumToNextWakeUp = 1; + + AutoWakeupCfg.word = 0; + RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); + + // 1. Set auto wake up timer. + AutoWakeupCfg.field.NumofSleepingTbtt = TbttNumToNextWakeUp - 1; + AutoWakeupCfg.field.EnableAutoWakeup = 1; + AutoWakeupCfg.field.AutoLeadTime = LEAD_TIME; + RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); + } + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + + // 4-1. If it's to disable our device. Need to restore PCI Configuration Space to its original value. + if (Level == RTMP_HALT && pAd->OpMode == OPMODE_STA) + { + if ((brc == TRUE) && (i < 50)) + RTMPPCIeLinkCtrlSetting(pAd, 1); + } + // 4. Set PCI configuration Space Link Comtrol fields. Only Radio Off needs to call this function + else if (pAd->OpMode == OPMODE_STA) + { + if ((brc == TRUE) && (i < 50)) + RTMPPCIeLinkCtrlSetting(pAd, 3); + } + RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_DISABLE_TX); +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + //pAd->bPCIclkOffDisableTx = FALSE; + + return TRUE; +} + + + + +VOID RT28xxPciMlmeRadioOn( + IN PRTMP_ADAPTER pAd) +{ + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) + return; + + DBGPRINT(RT_DEBUG_TRACE,("%s===>\n", __FUNCTION__)); + + if ((pAd->OpMode == OPMODE_AP) || + ((pAd->OpMode == OPMODE_STA) +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE) + ||pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) + #endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + )) + { + RTMPRingCleanUp(pAd, QID_AC_BK); + RTMPRingCleanUp(pAd, QID_AC_BE); + RTMPRingCleanUp(pAd, QID_AC_VI); + RTMPRingCleanUp(pAd, QID_AC_VO); + RTMPRingCleanUp(pAd, QID_HCCA); + RTMPRingCleanUp(pAd, QID_MGMT); + RTMPRingCleanUp(pAd, QID_RX); + + RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); + //NICResetFromError(pAd); + + // Enable Tx/Rx + RTMPEnableRxTx(pAd); + + // Clear Radio off flag + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF); + // Set LED + RTMPSetLED(pAd, LED_RADIO_ON); + } + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + + if ((pAd->OpMode == OPMODE_STA) && + (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + &&(pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) + { + BOOLEAN Cancelled; + + RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_WAKEUP); + + pAd->Mlme.bPsPollTimerRunning = FALSE; + RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); + RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled); + RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 40); + } +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // +} + + +VOID RT28xxPciMlmeRadioOFF( + IN PRTMP_ADAPTER pAd) +{ + BOOLEAN brc=TRUE; + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) + return; + +#ifdef CONFIG_STA_SUPPORT + // Link down first if any association exists + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + { + if (INFRA_ON(pAd) || ADHOC_ON(pAd)) + { + MLME_DISASSOC_REQ_STRUCT DisReq; + MLME_QUEUE_ELEM *pMsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); + + if (pMsgElem) + { + COPY_MAC_ADDR(&DisReq.Addr, pAd->CommonCfg.Bssid); + DisReq.Reason = REASON_DISASSOC_STA_LEAVING; + + pMsgElem->Machine = ASSOC_STATE_MACHINE; + pMsgElem->MsgType = MT2_MLME_DISASSOC_REQ; + pMsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT); + NdisMoveMemory(pMsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT)); + + MlmeDisassocReqAction(pAd, pMsgElem); + kfree(pMsgElem); + + RTMPusecDelay(1000); + } + } + } +#endif // CONFIG_STA_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE,("%s===>\n", __FUNCTION__)); + + // Set Radio off flag + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + BOOLEAN Cancelled; + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); + } + // If during power safe mode. + if (pAd->StaCfg.bRadio == TRUE) + { + DBGPRINT(RT_DEBUG_TRACE,("-->MlmeRadioOff() return on bRadio == TRUE; \n")); + return; + } + // Always radio on since the NIC needs to set the MCU command (LED_RADIO_OFF). + if (IDLE_ON(pAd) && + (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) + { + RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); + } +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)&&pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + { + BOOLEAN Cancelled; + pAd->Mlme.bPsPollTimerRunning = FALSE; + RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); + RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled); + } +#endif // PCIE_PS_SUPPORT // + + + // Link down first if any association exists + if (INFRA_ON(pAd) || ADHOC_ON(pAd)) + LinkDown(pAd, FALSE); + RTMPusecDelay(10000); + //========================================== + // Clean up old bss table + BssTableInit(&pAd->ScanTab); + + /* + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + { + RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 10); + return; + } + */ + } +#endif // CONFIG_STA_SUPPORT // + // Set LED.Move to here for fixing LED bug. This flag must be called after LinkDown + RTMPSetLED(pAd, LED_RADIO_OFF); + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT +//Q:Does all PCIe devices need to use timer to execute radio off function? or only if the device is PCIe and EnableNewPS is true ? +//A:It is right, because only when the PCIe and EnableNewPs is true, we need to delay the RadioOffTimer +//to avoid the deadlock with PCIe Power saving function. +if (pAd->OpMode == OPMODE_STA&& + OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)&& + pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + { + RTMPSetTimer(&pAd->Mlme.RadioOnOffTimer, 10); + } +else +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // +{ + + + brc=RT28xxPciAsicRadioOff(pAd, GUIRADIO_OFF, 0); + + if (brc==FALSE) + { + DBGPRINT(RT_DEBUG_ERROR,("%s call RT28xxPciAsicRadioOff fail !!\n", __FUNCTION__)); + } +} +/* + // Disable Tx/Rx DMA + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); // disable DMA + GloCfg.field.EnableTxDMA = 0; + GloCfg.field.EnableRxDMA = 0; + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); // abort all TX rings + + + // MAC_SYS_CTRL => value = 0x0 => 40mA + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0); + + // PWR_PIN_CFG => value = 0x0 => 40mA + RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0); + + // TX_PIN_CFG => value = 0x0 => 20mA + RTMP_IO_WRITE32(pAd, TX_PIN_CFG, 0); + + if (pAd->CommonCfg.BBPCurrentBW == BW_40) + { + // Must using 40MHz. + AsicTurnOffRFClk(pAd, pAd->CommonCfg.CentralChannel); + } + else + { + // Must using 20MHz. + AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel); + } + + // Waiting for DMA idle + i = 0; + do + { + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); + if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0)) + break; + + RTMPusecDelay(1000); + }while (i++ < 100); +*/ +} + +#endif // RTMP_MAC_PCI // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_profile.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_profile.c new file mode 100644 index 000000000..629dd4fc7 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_profile.c @@ -0,0 +1,2309 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + +#include "rt_config.h" + + +#define ETH_MAC_ADDR_STR_LEN 17 // in format of xx:xx:xx:xx:xx:xx + +// We assume the s1 is a sting, s2 is a memory space with 6 bytes. and content of s1 will be changed. +BOOLEAN rtstrmactohex(PSTRING s1, PSTRING s2) +{ + int i = 0; + PSTRING ptokS = s1, ptokE = s1; + + if (strlen(s1) != ETH_MAC_ADDR_STR_LEN) + return FALSE; + + while((*ptokS) != '\0') + { + if((ptokE = strchr(ptokS, ':')) != NULL) + *ptokE++ = '\0'; + if ((strlen(ptokS) != 2) || (!isxdigit(*ptokS)) || (!isxdigit(*(ptokS+1)))) + break; // fail + AtoH(ptokS, (PUCHAR)&s2[i++], 1); + ptokS = ptokE; + if (i == 6) + break; // parsing finished + } + + return ( i == 6 ? TRUE : FALSE); + +} + + +// we assume the s1 and s2 both are strings. +BOOLEAN rtstrcasecmp(PSTRING s1, PSTRING s2) +{ + PSTRING p1 = s1, p2 = s2; + + if (strlen(s1) != strlen(s2)) + return FALSE; + + while(*p1 != '\0') + { + if((*p1 != *p2) && ((*p1 ^ *p2) != 0x20)) + return FALSE; + p1++; + p2++; + } + + return TRUE; +} + +// we assume the s1 (buffer) and s2 (key) both are strings. +PSTRING rtstrstruncasecmp(PSTRING s1, PSTRING s2) +{ + INT l1, l2, i; + char temp1, temp2; + + l2 = strlen(s2); + if (!l2) + return (char *) s1; + + l1 = strlen(s1); + + while (l1 >= l2) + { + l1--; + + for(i=0; i<l2; i++) + { + temp1 = *(s1+i); + temp2 = *(s2+i); + + if (('a' <= temp1) && (temp1 <= 'z')) + temp1 = 'A'+(temp1-'a'); + if (('a' <= temp2) && (temp2 <= 'z')) + temp2 = 'A'+(temp2-'a'); + + if (temp1 != temp2) + break; + } + + if (i == l2) + return (char *) s1; + + s1++; + } + + return NULL; // not found +} + +//add by kathy + + /** + * strstr - Find the first substring in a %NUL terminated string + * @s1: The string to be searched + * @s2: The string to search for + */ +PSTRING rtstrstr(PSTRING s1,const PSTRING s2) +{ + INT l1, l2; + + l2 = strlen(s2); + if (!l2) + return s1; + + l1 = strlen(s1); + + while (l1 >= l2) + { + l1--; + if (!memcmp(s1,s2,l2)) + return s1; + s1++; + } + + return NULL; +} + +/** + * rstrtok - Split a string into tokens + * @s: The string to be searched + * @ct: The characters to search for + * * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture. + */ +PSTRING __rstrtok; +PSTRING rstrtok(PSTRING s,const PSTRING ct) +{ + PSTRING sbegin, send; + + sbegin = s ? s : __rstrtok; + if (!sbegin) + { + return NULL; + } + + sbegin += strspn(sbegin,ct); + if (*sbegin == '\0') + { + __rstrtok = NULL; + return( NULL ); + } + + send = strpbrk( sbegin, ct); + if (send && *send != '\0') + *send++ = '\0'; + + __rstrtok = send; + + return (sbegin); +} + +/** + * delimitcnt - return the count of a given delimiter in a given string. + * @s: The string to be searched. + * @ct: The delimiter to search for. + * Notice : We suppose the delimiter is a single-char string(for example : ";"). + */ +INT delimitcnt(PSTRING s,PSTRING ct) +{ + INT count = 0; + /* point to the beginning of the line */ + PSTRING token = s; + + for ( ;; ) + { + token = strpbrk(token, ct); /* search for delimiters */ + + if ( token == NULL ) + { + /* advanced to the terminating null character */ + break; + } + /* skip the delimiter */ + ++token; + + /* + * Print the found text: use len with %.*s to specify field width. + */ + + /* accumulate delimiter count */ + ++count; + } + return count; +} + +/* + * converts the Internet host address from the standard numbers-and-dots notation + * into binary data. + * returns nonzero if the address is valid, zero if not. + */ +int rtinet_aton(PSTRING cp, unsigned int *addr) +{ + unsigned int val; + int base, n; + STRING c; + unsigned int parts[4]; + unsigned int *pp = parts; + + for (;;) + { + /* + * Collect number up to ``.''. + * Values are specified as for C: + * 0x=hex, 0=octal, other=decimal. + */ + val = 0; + base = 10; + if (*cp == '0') + { + if (*++cp == 'x' || *cp == 'X') + base = 16, cp++; + else + base = 8; + } + while ((c = *cp) != '\0') + { + if (isdigit((unsigned char) c)) + { + val = (val * base) + (c - '0'); + cp++; + continue; + } + if (base == 16 && isxdigit((unsigned char) c)) + { + val = (val << 4) + + (c + 10 - (islower((unsigned char) c) ? 'a' : 'A')); + cp++; + continue; + } + break; + } + if (*cp == '.') + { + /* + * Internet format: a.b.c.d a.b.c (with c treated as 16-bits) + * a.b (with b treated as 24 bits) + */ + if (pp >= parts + 3 || val > 0xff) + return 0; + *pp++ = val, cp++; + } + else + break; + } + + /* + * Check for trailing junk. + */ + while (*cp) + if (!isspace((unsigned char) *cp++)) + return 0; + + /* + * Concoct the address according to the number of parts specified. + */ + n = pp - parts + 1; + switch (n) + { + + case 1: /* a -- 32 bits */ + break; + + case 2: /* a.b -- 8.24 bits */ + if (val > 0xffffff) + return 0; + val |= parts[0] << 24; + break; + + case 3: /* a.b.c -- 8.8.16 bits */ + if (val > 0xffff) + return 0; + val |= (parts[0] << 24) | (parts[1] << 16); + break; + + case 4: /* a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xff) + return 0; + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + } + + *addr = htonl(val); + return 1; + +} + +/* + ======================================================================== + + Routine Description: + Find key section for Get key parameter. + + Arguments: + buffer Pointer to the buffer to start find the key section + section the key of the secion to be find + + Return Value: + NULL Fail + Others Success + ======================================================================== +*/ +PSTRING RTMPFindSection( + IN PSTRING buffer) +{ + STRING temp_buf[32]; + PSTRING ptr; + + strcpy(temp_buf, "Default"); + + if((ptr = rtstrstr(buffer, temp_buf)) != NULL) + return (ptr+strlen("\n")); + else + return NULL; +} + +/* + ======================================================================== + + Routine Description: + Get key parameter. + + Arguments: + key Pointer to key string + dest Pointer to destination + destsize The datasize of the destination + buffer Pointer to the buffer to start find the key + bTrimSpace Set true if you want to strip the space character of the result pattern + + Return Value: + TRUE Success + FALSE Fail + + Note: + This routine get the value with the matched key (case case-sensitive) + For SSID and security key related parameters, we SHALL NOT trim the space(' ') character. + ======================================================================== +*/ +INT RTMPGetKeyParameter( + IN PSTRING key, + OUT PSTRING dest, + IN INT destsize, + IN PSTRING buffer, + IN BOOLEAN bTrimSpace) +{ + PSTRING pMemBuf, temp_buf1 = NULL, temp_buf2 = NULL; + PSTRING start_ptr, end_ptr; + PSTRING ptr; + PSTRING offset = NULL; + INT len, keyLen; + + + keyLen = strlen(key); + os_alloc_mem(NULL, (PUCHAR *)&pMemBuf, MAX_PARAM_BUFFER_SIZE * 2); + if (pMemBuf == NULL) + return (FALSE); + + memset(pMemBuf, 0, MAX_PARAM_BUFFER_SIZE * 2); + temp_buf1 = pMemBuf; + temp_buf2 = (PSTRING)(pMemBuf + MAX_PARAM_BUFFER_SIZE); + + + //find section + if((offset = RTMPFindSection(buffer)) == NULL) + { + os_free_mem(NULL, (PUCHAR)pMemBuf); + return (FALSE); + } + + strcpy(temp_buf1, "\n"); + strcat(temp_buf1, key); + strcat(temp_buf1, "="); + + //search key + if((start_ptr=rtstrstr(offset, temp_buf1)) == NULL) + { + os_free_mem(NULL, (PUCHAR)pMemBuf); + return (FALSE); + } + + start_ptr += strlen("\n"); + if((end_ptr = rtstrstr(start_ptr, "\n"))==NULL) + end_ptr = start_ptr+strlen(start_ptr); + + if (end_ptr<start_ptr) + { + os_free_mem(NULL, (PUCHAR)pMemBuf); + return (FALSE); + } + + NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr); + temp_buf2[end_ptr-start_ptr]='\0'; + + if((start_ptr=rtstrstr(temp_buf2, "=")) == NULL) + { + os_free_mem(NULL, (PUCHAR)pMemBuf); + return (FALSE); + } + ptr = (start_ptr +1); + //trim special characters, i.e., TAB or space + while(*start_ptr != 0x00) + { + if( ((*ptr == ' ') && bTrimSpace) || (*ptr == '\t') ) + ptr++; + else + break; + } + len = strlen(start_ptr); + + memset(dest, 0x00, destsize); + strncpy(dest, ptr, ((len >= destsize) ? destsize: len)); + + os_free_mem(NULL, (PUCHAR)pMemBuf); + + return TRUE; +} + + +/* + ======================================================================== + + Routine Description: + Get multiple key parameter. + + Arguments: + key Pointer to key string + dest Pointer to destination + destsize The datasize of the destination + buffer Pointer to the buffer to start find the key + + Return Value: + TRUE Success + FALSE Fail + + Note: + This routine get the value with the matched key (case case-sensitive) + ======================================================================== +*/ +INT RTMPGetKeyParameterWithOffset( + IN PSTRING key, + OUT PSTRING dest, + OUT USHORT *end_offset, + IN INT destsize, + IN PSTRING buffer, + IN BOOLEAN bTrimSpace) +{ + PSTRING temp_buf1 = NULL; + PSTRING temp_buf2 = NULL; + PSTRING start_ptr; + PSTRING end_ptr; + PSTRING ptr; + PSTRING offset = 0; + INT len; + + if (*end_offset >= MAX_INI_BUFFER_SIZE) + return (FALSE); + + os_alloc_mem(NULL, (PUCHAR *)&temp_buf1, MAX_PARAM_BUFFER_SIZE); + + if(temp_buf1 == NULL) + return (FALSE); + + os_alloc_mem(NULL, (PUCHAR *)&temp_buf2, MAX_PARAM_BUFFER_SIZE); + if(temp_buf2 == NULL) + { + os_free_mem(NULL, (PUCHAR)temp_buf1); + return (FALSE); + } + + //find section + if(*end_offset == 0) + { + if ((offset = RTMPFindSection(buffer)) == NULL) + { + os_free_mem(NULL, (PUCHAR)temp_buf1); + os_free_mem(NULL, (PUCHAR)temp_buf2); + return (FALSE); + } + } + else + offset = buffer + (*end_offset); + + strcpy(temp_buf1, "\n"); + strcat(temp_buf1, key); + strcat(temp_buf1, "="); + + //search key + if((start_ptr=rtstrstr(offset, temp_buf1))==NULL) + { + os_free_mem(NULL, (PUCHAR)temp_buf1); + os_free_mem(NULL, (PUCHAR)temp_buf2); + return (FALSE); + } + + start_ptr+=strlen("\n"); + if((end_ptr=rtstrstr(start_ptr, "\n"))==NULL) + end_ptr=start_ptr+strlen(start_ptr); + + if (end_ptr<start_ptr) + { + os_free_mem(NULL, (PUCHAR)temp_buf1); + os_free_mem(NULL, (PUCHAR)temp_buf2); + return (FALSE); + } + + *end_offset = end_ptr - buffer; + + NdisMoveMemory(temp_buf2, start_ptr, end_ptr-start_ptr); + temp_buf2[end_ptr-start_ptr]='\0'; + len = strlen(temp_buf2); + strcpy(temp_buf1, temp_buf2); + if((start_ptr=rtstrstr(temp_buf1, "=")) == NULL) + { + os_free_mem(NULL, (PUCHAR)temp_buf1); + os_free_mem(NULL, (PUCHAR)temp_buf2); + return (FALSE); + } + + strcpy(temp_buf2, start_ptr+1); + ptr = temp_buf2; + //trim space or tab + while(*ptr != 0x00) + { + if((bTrimSpace && (*ptr == ' ')) || (*ptr == '\t') ) + ptr++; + else + break; + } + + len = strlen(ptr); + memset(dest, 0x00, destsize); + strncpy(dest, ptr, len >= destsize ? destsize: len); + + os_free_mem(NULL, (PUCHAR)temp_buf1); + os_free_mem(NULL, (PUCHAR)temp_buf2); + return TRUE; +} + + +static int rtmp_parse_key_buffer_from_file(IN PRTMP_ADAPTER pAd,IN PSTRING buffer,IN ULONG KeyType,IN INT BSSIdx,IN INT KeyIdx) +{ + PSTRING keybuff; + //INT i = BSSIdx, idx = KeyIdx, retVal; + ULONG KeyLen; + //UCHAR CipherAlg = CIPHER_WEP64; + CIPHER_KEY *pSharedKey; + + keybuff = buffer; + KeyLen = strlen(keybuff); + pSharedKey = &pAd->SharedKey[BSSIdx][KeyIdx]; + + if(((KeyType != 0) && (KeyType != 1)) || + ((KeyType == 0) && (KeyLen != 10) && (KeyLen != 26)) || + ((KeyType== 1) && (KeyLen != 5) && (KeyLen != 13))) + { + DBGPRINT(RT_DEBUG_ERROR, ("Key%dStr is Invalid key length(%ld) or Type(%ld)\n", + KeyIdx+1, KeyLen, KeyType)); + return FALSE; + } + else + { + return RT_CfgSetWepKey(pAd, buffer, pSharedKey, KeyIdx); + } + +} + + +static void rtmp_read_key_parms_from_file(IN PRTMP_ADAPTER pAd, PSTRING tmpbuf, PSTRING buffer) +{ + STRING tok_str[16]; + PSTRING macptr; + INT i = 0, idx; + ULONG KeyType[MAX_MBSSID_NUM]; + ULONG KeyIdx; + + NdisZeroMemory(KeyType, sizeof(KeyType)); + + //DefaultKeyID + if(RTMPGetKeyParameter("DefaultKeyID", tmpbuf, 25, buffer, TRUE)) + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + KeyIdx = simple_strtol(tmpbuf, 0, 10); + if((KeyIdx >= 1 ) && (KeyIdx <= 4)) + pAd->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1); + else + pAd->StaCfg.DefaultKeyId = 0; + + DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyID(0~3)=%d\n", pAd->StaCfg.DefaultKeyId)); + } +#endif // CONFIG_STA_SUPPORT // + } + + + for (idx = 0; idx < 4; idx++) + { + sprintf(tok_str, "Key%dType", idx + 1); + //Key1Type + if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, TRUE)) + { + for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++) + { + /* + do sanity check for KeyType length; + or in station mode, the KeyType length > 1, + the code will overwrite the stack of caller + (RTMPSetProfileParameters) and cause srcbuf = NULL + */ + if (i < MAX_MBSSID_NUM) + KeyType[i] = simple_strtol(macptr, 0, 10); + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + sprintf(tok_str, "Key%dStr", idx + 1); + if (RTMPGetKeyParameter(tok_str, tmpbuf, 128, buffer, FALSE)) + { + rtmp_parse_key_buffer_from_file(pAd, tmpbuf, KeyType[BSS0], BSS0, idx); + } + } +#endif // CONFIG_STA_SUPPORT // + } + } +} + + + +#ifdef CONFIG_STA_SUPPORT +static void rtmp_read_sta_wmm_parms_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer) +{ + PSTRING macptr; + INT i=0; + BOOLEAN bWmmEnable = FALSE; + + //WmmCapable + if(RTMPGetKeyParameter("WmmCapable", tmpbuf, 32, buffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable + { + pAd->CommonCfg.bWmmCapable = TRUE; + bWmmEnable = TRUE; + } + else //Disable + { + pAd->CommonCfg.bWmmCapable = FALSE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("WmmCapable=%d\n", pAd->CommonCfg.bWmmCapable)); + } + +#ifdef QOS_DLS_SUPPORT + //DLSCapable + if(RTMPGetKeyParameter("DLSCapable", tmpbuf, 32, buffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable + { + pAd->CommonCfg.bDLSCapable = TRUE; + } + else //Disable + { + pAd->CommonCfg.bDLSCapable = FALSE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("bDLSCapable=%d\n", pAd->CommonCfg.bDLSCapable)); + } +#endif // QOS_DLS_SUPPORT // + + //AckPolicy for AC_BK, AC_BE, AC_VI, AC_VO + if(RTMPGetKeyParameter("AckPolicy", tmpbuf, 32, buffer, TRUE)) + { + for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++) + { + pAd->CommonCfg.AckPolicy[i] = (UCHAR)simple_strtol(macptr, 0, 10); + + DBGPRINT(RT_DEBUG_TRACE, ("AckPolicy[%d]=%d\n", i, pAd->CommonCfg.AckPolicy[i])); + } + } + + if (bWmmEnable) + { + //APSDCapable + if(RTMPGetKeyParameter("APSDCapable", tmpbuf, 10, buffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable + pAd->CommonCfg.bAPSDCapable = TRUE; + else + pAd->CommonCfg.bAPSDCapable = FALSE; + + DBGPRINT(RT_DEBUG_TRACE, ("APSDCapable=%d\n", pAd->CommonCfg.bAPSDCapable)); + } + + //MaxSPLength + if(RTMPGetKeyParameter("MaxSPLength", tmpbuf, 10, buffer, TRUE)) + { + pAd->CommonCfg.MaxSPLength = simple_strtol(tmpbuf, 0, 10); + + DBGPRINT(RT_DEBUG_TRACE, ("MaxSPLength=%d\n", pAd->CommonCfg.MaxSPLength)); + } + + //APSDAC for AC_BE, AC_BK, AC_VI, AC_VO + if(RTMPGetKeyParameter("APSDAC", tmpbuf, 32, buffer, TRUE)) + { + BOOLEAN apsd_ac[4]; + + for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++) + { + apsd_ac[i] = (BOOLEAN)simple_strtol(macptr, 0, 10); + + DBGPRINT(RT_DEBUG_TRACE, ("APSDAC%d %d\n", i, apsd_ac[i])); + } + + pAd->CommonCfg.bAPSDAC_BE = apsd_ac[0]; + pAd->CommonCfg.bAPSDAC_BK = apsd_ac[1]; + pAd->CommonCfg.bAPSDAC_VI = apsd_ac[2]; + pAd->CommonCfg.bAPSDAC_VO = apsd_ac[3]; + + pAd->CommonCfg.bACMAPSDTr[0] = apsd_ac[0]; + pAd->CommonCfg.bACMAPSDTr[1] = apsd_ac[1]; + pAd->CommonCfg.bACMAPSDTr[2] = apsd_ac[2]; + pAd->CommonCfg.bACMAPSDTr[3] = apsd_ac[3]; + } + } + +} + +#ifdef XLINK_SUPPORT +static void rtmp_get_psp_xlink_mode_from_file(IN PRTMP_ADAPTER pAd, char *tmpbuf, char *buffer) +{ + UINT32 Value = 0; + + // Xlink Mode + if (RTMPGetKeyParameter("PSP_XLINK_MODE", tmpbuf, 32, buffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) // enable + { + pAd->StaCfg.PSPXlink = TRUE; + } + else // disable + { + pAd->StaCfg.PSPXlink = FALSE; + } + + if (pAd->StaCfg.PSPXlink) + Value = PSPXLINK; + else + Value = STANORMAL; + + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Value); + + DBGPRINT(RT_DEBUG_TRACE, ("PSP_XLINK_MODE=%d\n", pAd->StaCfg.PSPXlink)); + } +} +#endif // XLINK_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + +#ifdef DOT11_N_SUPPORT +static void HTParametersHook( + IN PRTMP_ADAPTER pAd, + IN PSTRING pValueStr, + IN PSTRING pInput) +{ + long Value; + + if (RTMPGetKeyParameter("HT_PROTECT", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value == 0) + { + pAd->CommonCfg.bHTProtect = FALSE; + } + else + { + pAd->CommonCfg.bHTProtect = TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: Protection = %s\n", (Value==0) ? "Disable" : "Enable")); + } + + + if (RTMPGetKeyParameter("HT_MIMOPSMode", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value > MMPS_ENABLE) + { + pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE; + } + else + { + //TODO: add mimo power saving mechanism + pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE; + //pAd->CommonCfg.BACapability.field.MMPSmode = Value; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: MIMOPS Mode = %d\n", (INT) Value)); + } + + if (RTMPGetKeyParameter("HT_BADecline", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value == 0) + { + pAd->CommonCfg.bBADecline = FALSE; + } + else + { + pAd->CommonCfg.bBADecline = TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Decline = %s\n", (Value==0) ? "Disable" : "Enable")); + } + + + if (RTMPGetKeyParameter("HT_AutoBA", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value == 0) + { + pAd->CommonCfg.BACapability.field.AutoBA = FALSE; + pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE; + } + else + { + pAd->CommonCfg.BACapability.field.AutoBA = TRUE; + pAd->CommonCfg.BACapability.field.Policy = IMMED_BA; + } + pAd->CommonCfg.REGBACapability.field.AutoBA = pAd->CommonCfg.BACapability.field.AutoBA; + pAd->CommonCfg.REGBACapability.field.Policy = pAd->CommonCfg.BACapability.field.Policy; + DBGPRINT(RT_DEBUG_TRACE, ("HT: Auto BA = %s\n", (Value==0) ? "Disable" : "Enable")); + } + + // Tx_+HTC frame + if (RTMPGetKeyParameter("HT_HTC", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value == 0) + { + pAd->HTCEnable = FALSE; + } + else + { + pAd->HTCEnable = TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx +HTC frame = %s\n", (Value==0) ? "Disable" : "Enable")); + } + + + // Reverse Direction Mechanism + if (RTMPGetKeyParameter("HT_RDG", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value == 0) + { + pAd->CommonCfg.bRdg = FALSE; + } + else + { + pAd->HTCEnable = TRUE; + pAd->CommonCfg.bRdg = TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: RDG = %s\n", (Value==0) ? "Disable" : "Enable(+HTC)")); + } + + + + + // Tx A-MSUD ? + if (RTMPGetKeyParameter("HT_AMSDU", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value == 0) + { + pAd->CommonCfg.BACapability.field.AmsduEnable = FALSE; + } + else + { + pAd->CommonCfg.BACapability.field.AmsduEnable = TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx A-MSDU = %s\n", (Value==0) ? "Disable" : "Enable")); + } + + // MPDU Density + if (RTMPGetKeyParameter("HT_MpduDensity", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value <=7 && Value >= 0) + { + pAd->CommonCfg.BACapability.field.MpduDensity = Value; + DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d\n", (INT) Value)); + } + else + { + pAd->CommonCfg.BACapability.field.MpduDensity = 4; + DBGPRINT(RT_DEBUG_TRACE, ("HT: MPDU Density = %d (Default)\n", 4)); + } + } + + // Max Rx BA Window Size + if (RTMPGetKeyParameter("HT_BAWinSize", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + + if (Value >=1 && Value <= 64) + { + pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = Value; + pAd->CommonCfg.BACapability.field.RxBAWinLimit = Value; + DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = %d\n", (INT) Value)); + } + else + { + pAd->CommonCfg.REGBACapability.field.RxBAWinLimit = 64; + pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; + DBGPRINT(RT_DEBUG_TRACE, ("HT: BA Windw Size = 64 (Defualt)\n")); + } + + } + + // Guard Interval + if (RTMPGetKeyParameter("HT_GI", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + + if (Value == GI_400) + { + pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_400; + } + else + { + pAd->CommonCfg.RegTransmitSetting.field.ShortGI = GI_800; + } + + DBGPRINT(RT_DEBUG_TRACE, ("HT: Guard Interval = %s\n", (Value==GI_400) ? "400" : "800" )); + } + + // HT Operation Mode : Mixed Mode , Green Field + if (RTMPGetKeyParameter("HT_OpMode", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + + if (Value == HTMODE_GF) + { + + pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_GF; + } + else + { + pAd->CommonCfg.RegTransmitSetting.field.HTMODE = HTMODE_MM; + } + + DBGPRINT(RT_DEBUG_TRACE, ("HT: Operate Mode = %s\n", (Value==HTMODE_GF) ? "Green Field" : "Mixed Mode" )); + } + + // Fixed Tx mode : CCK, OFDM + if (RTMPGetKeyParameter("FixedTxMode", pValueStr, 25, pInput, TRUE)) + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode = + RT_CfgSetFixedTxPhyMode(pValueStr); + DBGPRINT(RT_DEBUG_TRACE, ("Fixed Tx Mode = %d\n", + pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode)); + } +#endif // CONFIG_STA_SUPPORT // + } + + + // Channel Width + if (RTMPGetKeyParameter("HT_BW", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + + if (Value == BW_40) + { + pAd->CommonCfg.RegTransmitSetting.field.BW = BW_40; + } + else + { + pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; + } + +#ifdef MCAST_RATE_SPECIFIC + pAd->CommonCfg.MCastPhyMode.field.BW = pAd->CommonCfg.RegTransmitSetting.field.BW; +#endif // MCAST_RATE_SPECIFIC // + + DBGPRINT(RT_DEBUG_TRACE, ("HT: Channel Width = %s\n", (Value==BW_40) ? "40 MHz" : "20 MHz" )); + } + + if (RTMPGetKeyParameter("HT_EXTCHA", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + + if (Value == 0) + { + + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW; + } + else + { + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("HT: Ext Channel = %s\n", (Value==0) ? "BELOW" : "ABOVE" )); + } + + // MSC + if (RTMPGetKeyParameter("HT_MCS", pValueStr, 50, pInput, TRUE)) + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + Value = simple_strtol(pValueStr, 0, 10); + +// if ((Value >= 0 && Value <= 15) || (Value == 32)) + if ((Value >= 0 && Value <= 23) || (Value == 32)) // 3*3 + { + pAd->StaCfg.DesiredTransmitSetting.field.MCS = Value; + pAd->StaCfg.bAutoTxRateSwitch = FALSE; + DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = %d\n", pAd->StaCfg.DesiredTransmitSetting.field.MCS)); + } + else + { + pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; + pAd->StaCfg.bAutoTxRateSwitch = TRUE; + DBGPRINT(RT_DEBUG_TRACE, ("HT: MCS = AUTO\n")); + } + } +#endif // CONFIG_STA_SUPPORT // + } + + // STBC + if (RTMPGetKeyParameter("HT_STBC", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value == STBC_USE) + { + pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_USE; + } + else + { + pAd->CommonCfg.RegTransmitSetting.field.STBC = STBC_NONE; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: STBC = %d\n", pAd->CommonCfg.RegTransmitSetting.field.STBC)); + } + + // 40_Mhz_Intolerant + if (RTMPGetKeyParameter("HT_40MHZ_INTOLERANT", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + if (Value == 0) + { + pAd->CommonCfg.bForty_Mhz_Intolerant = FALSE; + } + else + { + pAd->CommonCfg.bForty_Mhz_Intolerant = TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: 40MHZ INTOLERANT = %d\n", pAd->CommonCfg.bForty_Mhz_Intolerant)); + } + //HT_TxStream + if(RTMPGetKeyParameter("HT_TxStream", pValueStr, 10, pInput, TRUE)) + { + switch (simple_strtol(pValueStr, 0, 10)) + { + case 1: + pAd->CommonCfg.TxStream = 1; + break; + case 2: + pAd->CommonCfg.TxStream = 2; + break; + case 3: // 3*3 + default: + pAd->CommonCfg.TxStream = 3; + + if (pAd->MACVersion < RALINK_2883_VERSION) + pAd->CommonCfg.TxStream = 2; // only 2 tx streams for RT2860 series + break; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: Tx Stream = %d\n", pAd->CommonCfg.TxStream)); + } + //HT_RxStream + if(RTMPGetKeyParameter("HT_RxStream", pValueStr, 10, pInput, TRUE)) + { + switch (simple_strtol(pValueStr, 0, 10)) + { + case 1: + pAd->CommonCfg.RxStream = 1; + break; + case 2: + pAd->CommonCfg.RxStream = 2; + break; + case 3: + default: + pAd->CommonCfg.RxStream = 3; + + if (pAd->MACVersion < RALINK_2883_VERSION) + pAd->CommonCfg.RxStream = 2; // only 2 rx streams for RT2860 series + break; + } + DBGPRINT(RT_DEBUG_TRACE, ("HT: Rx Stream = %d\n", pAd->CommonCfg.RxStream)); + } + // HT_DisallowTKIP + if (RTMPGetKeyParameter("HT_DisallowTKIP", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + + if (Value == 1) + { + pAd->CommonCfg.HT_DisallowTKIP = TRUE; + } + else + { + pAd->CommonCfg.HT_DisallowTKIP = FALSE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("HT: Disallow TKIP mode = %s\n", (pAd->CommonCfg.HT_DisallowTKIP == TRUE) ? "ON" : "OFF" )); + } + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + if (RTMPGetKeyParameter("OBSSScanParam", pValueStr, 32, pInput, TRUE)) + { int ObssScanValue, idx; + PSTRING macptr; + for (idx = 0, macptr = rstrtok(pValueStr,";"); macptr; macptr = rstrtok(NULL,";"), idx++) + { + ObssScanValue = simple_strtol(macptr, 0, 10); + switch (idx) + { + case 0: + if (ObssScanValue < 5 || ObssScanValue > 1000) + { + DBGPRINT(RT_DEBUG_ERROR, ("Invalid OBSSScanParam for Dot11OBssScanPassiveDwell(%d), should in range 5~1000\n", ObssScanValue)); + } + else + { + pAd->CommonCfg.Dot11OBssScanPassiveDwell = ObssScanValue; // Unit : TU. 5~1000 + DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11OBssScanPassiveDwell=%d\n", ObssScanValue)); + } + break; + case 1: + if (ObssScanValue < 10 || ObssScanValue > 1000) + { + DBGPRINT(RT_DEBUG_ERROR, ("Invalid OBSSScanParam for Dot11OBssScanActiveDwell(%d), should in range 10~1000\n", ObssScanValue)); + } + else + { + pAd->CommonCfg.Dot11OBssScanActiveDwell = ObssScanValue; // Unit : TU. 10~1000 + DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11OBssScanActiveDwell=%d\n", ObssScanValue)); + } + break; + case 2: + pAd->CommonCfg.Dot11BssWidthTriggerScanInt = ObssScanValue; // Unit : Second + DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11BssWidthTriggerScanInt=%d\n", ObssScanValue)); + break; + case 3: + if (ObssScanValue < 200 || ObssScanValue > 10000) + { + DBGPRINT(RT_DEBUG_ERROR, ("Invalid OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel(%d), should in range 200~10000\n", ObssScanValue)); + } + else + { + pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = ObssScanValue; // Unit : TU. 200~10000 + DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11OBssScanPassiveTotalPerChannel=%d\n", ObssScanValue)); + } + break; + case 4: + if (ObssScanValue < 20 || ObssScanValue > 10000) + { + DBGPRINT(RT_DEBUG_ERROR, ("Invalid OBSSScanParam for Dot11OBssScanActiveTotalPerChannel(%d), should in range 20~10000\n", ObssScanValue)); + } + else + { + pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = ObssScanValue; // Unit : TU. 20~10000 + DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11OBssScanActiveTotalPerChannel=%d\n", ObssScanValue)); + } + break; + case 5: + pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = ObssScanValue; + DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\n", ObssScanValue)); + break; + case 6: + pAd->CommonCfg.Dot11OBssScanActivityThre = ObssScanValue; // Unit : percentage + DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11BssWidthChanTranDelayFactor=%d\n", ObssScanValue)); + break; + } + } + + if (idx != 7) + { + DBGPRINT(RT_DEBUG_ERROR, ("Wrong OBSSScanParamtetrs format in dat file!!!!! Use default value.\n")); + + pAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell; // Unit : TU. 5~1000 + pAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell; // Unit : TU. 10~1000 + pAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval; // Unit : Second + pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel; // Unit : TU. 200~10000 + pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel; // Unit : TU. 20~10000 + pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor; + pAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold; // Unit : percentage + } + pAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor); + DBGPRINT(RT_DEBUG_TRACE, ("OBSSScanParam for Dot11BssWidthChanTranDelay=%ld\n", pAd->CommonCfg.Dot11BssWidthChanTranDelay)); + } + + if (RTMPGetKeyParameter("HT_BSSCoexistence", pValueStr, 25, pInput, TRUE)) + { + Value = simple_strtol(pValueStr, 0, 10); + pAd->CommonCfg.bBssCoexEnable = ((Value == 1) ? TRUE : FALSE); + + DBGPRINT(RT_DEBUG_TRACE, ("HT: 20/40 BssCoexSupport = %s\n", (pAd->CommonCfg.bBssCoexEnable == TRUE) ? "ON" : "OFF" )); + } +#endif // DOT11N_DRAFT3 // + +#endif // DOT11_N_SUPPORT // + + //2008/11/05:KH add to support Antenna power-saving of AP--> +} +#endif // DOT11_N_SUPPORT // + + +NDIS_STATUS RTMPSetProfileParameters( + IN RTMP_ADAPTER *pAd, + IN PSTRING pBuffer) +{ + PSTRING tmpbuf; + ULONG RtsThresh; + ULONG FragThresh; + PSTRING macptr; + INT i = 0, retval; + tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG); + if(tmpbuf == NULL) + return NDIS_STATUS_FAILURE; + + do + { + // set file parameter to portcfg + if (RTMPGetKeyParameter("MacAddress", tmpbuf, 25, pBuffer, TRUE)) + { + retval = RT_CfgSetMacAddress(pAd, tmpbuf); + if (retval) + DBGPRINT(RT_DEBUG_TRACE, ("MacAddress = %02x:%02x:%02x:%02x:%02x:%02x\n", + PRINT_MAC(pAd->CurrentAddress))); + } + //CountryRegion + if(RTMPGetKeyParameter("CountryRegion", tmpbuf, 25, pBuffer, TRUE)) + { + retval = RT_CfgSetCountryRegion(pAd, tmpbuf, BAND_24G); + DBGPRINT(RT_DEBUG_TRACE, ("CountryRegion=%d\n", pAd->CommonCfg.CountryRegion)); + } + //CountryRegionABand + if(RTMPGetKeyParameter("CountryRegionABand", tmpbuf, 25, pBuffer, TRUE)) + { + retval = RT_CfgSetCountryRegion(pAd, tmpbuf, BAND_5G); + DBGPRINT(RT_DEBUG_TRACE, ("CountryRegionABand=%d\n", pAd->CommonCfg.CountryRegionForABand)); + } +#ifdef RTMP_EFUSE_SUPPORT +#ifdef RT30xx +#ifdef RALINK_ATE + //EfuseBufferMode + if(RTMPGetKeyParameter("EfuseBufferMode", tmpbuf, 25, pBuffer, TRUE)) + { + pAd->bEEPROMFile = (UCHAR) simple_strtol(tmpbuf, 0, 10); + DBGPRINT(RT_DEBUG_TRACE, ("EfuseBufferMode=%d\n", pAd->bUseEfuse)); + } +#endif // RALINK_ATE // +#endif // RT30xx // +#endif // RTMP_EFUSE_SUPPORT // + //CountryCode + if(RTMPGetKeyParameter("CountryCode", tmpbuf, 25, pBuffer, TRUE)) + { + NdisMoveMemory(pAd->CommonCfg.CountryCode, tmpbuf , 2); +#ifdef CONFIG_STA_SUPPORT +#ifdef EXT_BUILD_CHANNEL_LIST + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + NdisMoveMemory(pAd->StaCfg.StaOriCountryCode, tmpbuf , 2); +#endif // EXT_BUILD_CHANNEL_LIST // +#endif // CONFIG_STA_SUPPORT // + if (strlen((PSTRING) pAd->CommonCfg.CountryCode) != 0) + { + pAd->CommonCfg.bCountryFlag = TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("CountryCode=%s\n", pAd->CommonCfg.CountryCode)); + } + +#ifdef EXT_BUILD_CHANNEL_LIST + //ChannelGeography + if(RTMPGetKeyParameter("ChannelGeography", tmpbuf, 25, pBuffer, TRUE)) + { + UCHAR Geography = (UCHAR) simple_strtol(tmpbuf, 0, 10); + if (Geography <= BOTH) + { + pAd->CommonCfg.Geography = Geography; + pAd->CommonCfg.CountryCode[2] = + (pAd->CommonCfg.Geography == BOTH) ? ' ' : ((pAd->CommonCfg.Geography == IDOR) ? 'I' : 'O'); +#ifdef CONFIG_STA_SUPPORT +#ifdef EXT_BUILD_CHANNEL_LIST + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + pAd->StaCfg.StaOriGeography = pAd->CommonCfg.Geography; +#endif // EXT_BUILD_CHANNEL_LIST // +#endif // CONFIG_STA_SUPPORT // + DBGPRINT(RT_DEBUG_TRACE, ("ChannelGeography=%d\n", pAd->CommonCfg.Geography)); + } + } + else + { + pAd->CommonCfg.Geography = BOTH; + pAd->CommonCfg.CountryCode[2] = ' '; + } +#endif // EXT_BUILD_CHANNEL_LIST // + + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + //SSID + if (RTMPGetKeyParameter("SSID", tmpbuf, 256, pBuffer, FALSE)) + { + if (strlen(tmpbuf) <= 32) + { + pAd->CommonCfg.SsidLen = (UCHAR) strlen(tmpbuf); + NdisZeroMemory(pAd->CommonCfg.Ssid, NDIS_802_11_LENGTH_SSID); + NdisMoveMemory(pAd->CommonCfg.Ssid, tmpbuf, pAd->CommonCfg.SsidLen); + pAd->CommonCfg.LastSsidLen= pAd->CommonCfg.SsidLen; + NdisZeroMemory(pAd->CommonCfg.LastSsid, NDIS_802_11_LENGTH_SSID); + NdisMoveMemory(pAd->CommonCfg.LastSsid, tmpbuf, pAd->CommonCfg.LastSsidLen); + pAd->MlmeAux.AutoReconnectSsidLen = pAd->CommonCfg.SsidLen; + NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, NDIS_802_11_LENGTH_SSID); + NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, tmpbuf, pAd->MlmeAux.AutoReconnectSsidLen); + pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen; + NdisZeroMemory(pAd->MlmeAux.Ssid, NDIS_802_11_LENGTH_SSID); + NdisMoveMemory(pAd->MlmeAux.Ssid, tmpbuf, pAd->MlmeAux.SsidLen); + DBGPRINT(RT_DEBUG_TRACE, ("%s::(SSID=%s)\n", __FUNCTION__, tmpbuf)); + } + } + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + //NetworkType + if (RTMPGetKeyParameter("NetworkType", tmpbuf, 25, pBuffer, TRUE)) + { + pAd->bConfigChanged = TRUE; + if (strcmp(tmpbuf, "Adhoc") == 0) + pAd->StaCfg.BssType = BSS_ADHOC; + else //Default Infrastructure mode + pAd->StaCfg.BssType = BSS_INFRA; + // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key + pAd->StaCfg.WpaState = SS_NOTUSE; + DBGPRINT(RT_DEBUG_TRACE, ("%s::(NetworkType=%d)\n", __FUNCTION__, pAd->StaCfg.BssType)); + } + } +#endif // CONFIG_STA_SUPPORT // + //Channel + if(RTMPGetKeyParameter("Channel", tmpbuf, 10, pBuffer, TRUE)) + { + pAd->CommonCfg.Channel = (UCHAR) simple_strtol(tmpbuf, 0, 10); + DBGPRINT(RT_DEBUG_TRACE, ("Channel=%d\n", pAd->CommonCfg.Channel)); + } + //WirelessMode + if(RTMPGetKeyParameter("WirelessMode", tmpbuf, 10, pBuffer, TRUE)) + { + RT_CfgSetWirelessMode(pAd, tmpbuf); + DBGPRINT(RT_DEBUG_TRACE, ("PhyMode=%d\n", pAd->CommonCfg.PhyMode)); + } + //BasicRate + if(RTMPGetKeyParameter("BasicRate", tmpbuf, 10, pBuffer, TRUE)) + { + pAd->CommonCfg.BasicRateBitmap = (ULONG) simple_strtol(tmpbuf, 0, 10); + DBGPRINT(RT_DEBUG_TRACE, ("BasicRate=%ld\n", pAd->CommonCfg.BasicRateBitmap)); + } + //BeaconPeriod + if(RTMPGetKeyParameter("BeaconPeriod", tmpbuf, 10, pBuffer, TRUE)) + { + USHORT bcn_val = (USHORT) simple_strtol(tmpbuf, 0, 10); + + /* The acceptable is 20~1000 ms. Refer to WiFi test plan. */ + if (bcn_val >= 20 && bcn_val <= 1000) + pAd->CommonCfg.BeaconPeriod = bcn_val; + else + pAd->CommonCfg.BeaconPeriod = 100; // Default value + + DBGPRINT(RT_DEBUG_TRACE, ("BeaconPeriod=%d\n", pAd->CommonCfg.BeaconPeriod)); + } + + + //TxPower + if(RTMPGetKeyParameter("TxPower", tmpbuf, 10, pBuffer, TRUE)) + { + pAd->CommonCfg.TxPowerPercentage = (ULONG) simple_strtol(tmpbuf, 0, 10); +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + pAd->CommonCfg.TxPowerDefault = pAd->CommonCfg.TxPowerPercentage; +#endif // CONFIG_STA_SUPPORT // + DBGPRINT(RT_DEBUG_TRACE, ("TxPower=%ld\n", pAd->CommonCfg.TxPowerPercentage)); + } + //BGProtection + if(RTMPGetKeyParameter("BGProtection", tmpbuf, 10, pBuffer, TRUE)) + { + //#if 0 //#ifndef WIFI_TEST + // pAd->CommonCfg.UseBGProtection = 2;// disable b/g protection for throughput test + //#else + switch (simple_strtol(tmpbuf, 0, 10)) + { + case 1: //Always On + pAd->CommonCfg.UseBGProtection = 1; + break; + case 2: //Always OFF + pAd->CommonCfg.UseBGProtection = 2; + break; + case 0: //AUTO + default: + pAd->CommonCfg.UseBGProtection = 0; + break; + } + //#endif + DBGPRINT(RT_DEBUG_TRACE, ("BGProtection=%ld\n", pAd->CommonCfg.UseBGProtection)); + } + + //TxPreamble + if(RTMPGetKeyParameter("TxPreamble", tmpbuf, 10, pBuffer, TRUE)) + { + switch (simple_strtol(tmpbuf, 0, 10)) + { + case Rt802_11PreambleShort: + pAd->CommonCfg.TxPreamble = Rt802_11PreambleShort; + break; + case Rt802_11PreambleLong: + default: + pAd->CommonCfg.TxPreamble = Rt802_11PreambleLong; + break; + } + DBGPRINT(RT_DEBUG_TRACE, ("TxPreamble=%ld\n", pAd->CommonCfg.TxPreamble)); + } + //RTSThreshold + if(RTMPGetKeyParameter("RTSThreshold", tmpbuf, 10, pBuffer, TRUE)) + { + RtsThresh = simple_strtol(tmpbuf, 0, 10); + if( (RtsThresh >= 1) && (RtsThresh <= MAX_RTS_THRESHOLD) ) + pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh; + else + pAd->CommonCfg.RtsThreshold = MAX_RTS_THRESHOLD; + + DBGPRINT(RT_DEBUG_TRACE, ("RTSThreshold=%d\n", pAd->CommonCfg.RtsThreshold)); + } + //FragThreshold + if(RTMPGetKeyParameter("FragThreshold", tmpbuf, 10, pBuffer, TRUE)) + { + FragThresh = simple_strtol(tmpbuf, 0, 10); + pAd->CommonCfg.bUseZeroToDisableFragment = FALSE; + + if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD) + { //illegal FragThresh so we set it to default + pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD; + pAd->CommonCfg.bUseZeroToDisableFragment = TRUE; + } + else if (FragThresh % 2 == 1) + { + // The length of each fragment shall always be an even number of octets, except for the last fragment + // of an MSDU or MMPDU, which may be either an even or an odd number of octets. + pAd->CommonCfg.FragmentThreshold = (USHORT)(FragThresh - 1); + } + else + { + pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh; + } + //pAd->CommonCfg.AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC; + DBGPRINT(RT_DEBUG_TRACE, ("FragThreshold=%d\n", pAd->CommonCfg.FragmentThreshold)); + } + //TxBurst + if(RTMPGetKeyParameter("TxBurst", tmpbuf, 10, pBuffer, TRUE)) + { + //#ifdef WIFI_TEST + // pAd->CommonCfg.bEnableTxBurst = FALSE; + //#else + if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable + pAd->CommonCfg.bEnableTxBurst = TRUE; + else //Disable + pAd->CommonCfg.bEnableTxBurst = FALSE; + //#endif + DBGPRINT(RT_DEBUG_TRACE, ("TxBurst=%d\n", pAd->CommonCfg.bEnableTxBurst)); + } + +#ifdef AGGREGATION_SUPPORT + //PktAggregate + if(RTMPGetKeyParameter("PktAggregate", tmpbuf, 10, pBuffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) //Enable + pAd->CommonCfg.bAggregationCapable = TRUE; + else //Disable + pAd->CommonCfg.bAggregationCapable = FALSE; +#ifdef PIGGYBACK_SUPPORT + pAd->CommonCfg.bPiggyBackCapable = pAd->CommonCfg.bAggregationCapable; +#endif // PIGGYBACK_SUPPORT // + DBGPRINT(RT_DEBUG_TRACE, ("PktAggregate=%d\n", pAd->CommonCfg.bAggregationCapable)); + } +#else + pAd->CommonCfg.bAggregationCapable = FALSE; + pAd->CommonCfg.bPiggyBackCapable = FALSE; +#endif // AGGREGATION_SUPPORT // + + // WmmCapable + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + rtmp_read_sta_wmm_parms_from_file(pAd, tmpbuf, pBuffer); +#ifdef XLINK_SUPPORT + rtmp_get_psp_xlink_mode_from_file(pAd, tmpbuf, pBuffer); +#endif // XLINK_SUPPORT // + } +#endif // CONFIG_STA_SUPPORT // + + //ShortSlot + if(RTMPGetKeyParameter("ShortSlot", tmpbuf, 10, pBuffer, TRUE)) + { + RT_CfgSetShortSlot(pAd, tmpbuf); + DBGPRINT(RT_DEBUG_TRACE, ("ShortSlot=%d\n", pAd->CommonCfg.bUseShortSlotTime)); + } + //IEEE80211H + if(RTMPGetKeyParameter("IEEE80211H", tmpbuf, 10, pBuffer, TRUE)) + { + for (i = 0, macptr = rstrtok(tmpbuf,";"); macptr; macptr = rstrtok(NULL,";"), i++) + { + if(simple_strtol(macptr, 0, 10) != 0) //Enable + pAd->CommonCfg.bIEEE80211H = TRUE; + else //Disable + pAd->CommonCfg.bIEEE80211H = FALSE; + + DBGPRINT(RT_DEBUG_TRACE, ("IEEE80211H=%d\n", pAd->CommonCfg.bIEEE80211H)); + } + } + //CSPeriod + if(RTMPGetKeyParameter("CSPeriod", tmpbuf, 10, pBuffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) + pAd->CommonCfg.RadarDetect.CSPeriod = simple_strtol(tmpbuf, 0, 10); + else + pAd->CommonCfg.RadarDetect.CSPeriod = 0; + + DBGPRINT(RT_DEBUG_TRACE, ("CSPeriod=%d\n", pAd->CommonCfg.RadarDetect.CSPeriod)); + } + +#ifdef MERGE_ARCH_TEAM + // DfsLowerLimit + if(RTMPGetKeyParameter("DfsLowerLimit", tmpbuf, 10, pBuffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) + pAd->CommonCfg.RadarDetect.DfsLowerLimit = simple_strtol(tmpbuf, 0, 10); + + DBGPRINT(RT_DEBUG_TRACE, ("DfsLowerLimit=%ld\n", pAd->CommonCfg.RadarDetect.DfsLowerLimit)); + } + + // DfsUpperLimit + if(RTMPGetKeyParameter("DfsUpperLimit", tmpbuf, 10, pBuffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) + pAd->CommonCfg.RadarDetect.DfsUpperLimit = simple_strtol(tmpbuf, 0, 10); + + DBGPRINT(RT_DEBUG_TRACE, ("DfsUpperLimit=%ld\n", pAd->CommonCfg.RadarDetect.DfsUpperLimit)); + } + + // FixDfsLimit + if(RTMPGetKeyParameter("FixDfsLimit", tmpbuf, 10, pBuffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) + pAd->CommonCfg.RadarDetect.FixDfsLimit = TRUE; + else + pAd->CommonCfg.RadarDetect.FixDfsLimit = FALSE; + + DBGPRINT(RT_DEBUG_TRACE, ("FixDfsLimit=%d\n", pAd->CommonCfg.RadarDetect.FixDfsLimit)); + } + + // LongPulseRadarTh + if(RTMPGetKeyParameter("LongPulseRadarTh", tmpbuf, 10, pBuffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) + pAd->CommonCfg.RadarDetect.LongPulseRadarTh = simple_strtol(tmpbuf, 0, 10); + + DBGPRINT(RT_DEBUG_TRACE, ("LongPulseRadarTh=%d\n", pAd->CommonCfg.RadarDetect.LongPulseRadarTh)); + } + + // AvgRssiReq + if(RTMPGetKeyParameter("AvgRssiReq", tmpbuf, 10, pBuffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) != 0) + pAd->CommonCfg.RadarDetect.AvgRssiReq = simple_strtol(tmpbuf, 0, 10); + + DBGPRINT(RT_DEBUG_TRACE, ("AvgRssiReq=%d\n", pAd->CommonCfg.RadarDetect.AvgRssiReq)); + } + +#endif // MERGE_ARCH_TEAM // + + //RDRegion + if(RTMPGetKeyParameter("RDRegion", tmpbuf, 128, pBuffer, TRUE)) + { + RADAR_DETECT_STRUCT *pRadarDetect = &pAd->CommonCfg.RadarDetect; + if ((strncmp(tmpbuf, "JAP_W53", 7) == 0) || (strncmp(tmpbuf, "jap_w53", 7) == 0)) + { + pRadarDetect->RDDurRegion = JAP_W53; + pRadarDetect->DfsSessionTime = 15; + } + else if ((strncmp(tmpbuf, "JAP_W56", 7) == 0) || (strncmp(tmpbuf, "jap_w56", 7) == 0)) + { + pRadarDetect->RDDurRegion = JAP_W56; + pRadarDetect->DfsSessionTime = 13; + } + else if ((strncmp(tmpbuf, "JAP", 3) == 0) || (strncmp(tmpbuf, "jap", 3) == 0)) + { + pRadarDetect->RDDurRegion = JAP; + pRadarDetect->DfsSessionTime = 5; + } + else if ((strncmp(tmpbuf, "FCC", 3) == 0) || (strncmp(tmpbuf, "fcc", 3) == 0)) + { + pRadarDetect->RDDurRegion = FCC; + pRadarDetect->DfsSessionTime = 5; +#ifdef DFS_FCC_BW40_FIX + pRadarDetect->DfsSessionFccOff = 0; +#endif // DFS_FCC_BW40_FIX // + } + else if ((strncmp(tmpbuf, "CE", 2) == 0) || (strncmp(tmpbuf, "ce", 2) == 0)) + { + pRadarDetect->RDDurRegion = CE; + pRadarDetect->DfsSessionTime = 13; + } + else + { + pRadarDetect->RDDurRegion = CE; + pRadarDetect->DfsSessionTime = 13; + } + + DBGPRINT(RT_DEBUG_TRACE, ("RDRegion=%d\n", pRadarDetect->RDDurRegion)); + } + else + { + pAd->CommonCfg.RadarDetect.RDDurRegion = CE; + pAd->CommonCfg.RadarDetect.DfsSessionTime = 13; + } + +#ifdef SYSTEM_LOG_SUPPORT + //WirelessEvent + if(RTMPGetKeyParameter("WirelessEvent", tmpbuf, 10, pBuffer, TRUE)) + { +#if WIRELESS_EXT >= 15 + if(simple_strtol(tmpbuf, 0, 10) != 0) + pAd->CommonCfg.bWirelessEvent = TRUE; + else + pAd->CommonCfg.bWirelessEvent = FALSE; // disable +#else + pAd->CommonCfg.bWirelessEvent = FALSE; // disable +#endif + DBGPRINT(RT_DEBUG_TRACE, ("WirelessEvent=%d\n", pAd->CommonCfg.bWirelessEvent)); + } +#endif // SYSTEM_LOG_SUPPORT // + + + //AuthMode + if(RTMPGetKeyParameter("AuthMode", tmpbuf, 128, pBuffer, TRUE)) + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if ((strcmp(tmpbuf, "WEPAUTO") == 0) || (strcmp(tmpbuf, "wepauto") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch; + else if ((strcmp(tmpbuf, "SHARED") == 0) || (strcmp(tmpbuf, "shared") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared; + else if ((strcmp(tmpbuf, "WPAPSK") == 0) || (strcmp(tmpbuf, "wpapsk") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK; + else if ((strcmp(tmpbuf, "WPANONE") == 0) || (strcmp(tmpbuf, "wpanone") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone; + else if ((strcmp(tmpbuf, "WPA2PSK") == 0) || (strcmp(tmpbuf, "wpa2psk") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK; +#ifdef WPA_SUPPLICANT_SUPPORT + else if ((strcmp(tmpbuf, "WPA") == 0) || (strcmp(tmpbuf, "wpa") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA; + else if ((strcmp(tmpbuf, "WPA2") == 0) || (strcmp(tmpbuf, "wpa2") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2; +#endif // WPA_SUPPLICANT_SUPPORT // + else + pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen; + + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; + + DBGPRINT(RT_DEBUG_TRACE, ("%s::(AuthMode=%d)\n", __FUNCTION__, pAd->StaCfg.AuthMode)); + } +#endif // CONFIG_STA_SUPPORT // + } + //EncrypType + if(RTMPGetKeyParameter("EncrypType", tmpbuf, 128, pBuffer, TRUE)) + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if ((strcmp(tmpbuf, "WEP") == 0) || (strcmp(tmpbuf, "wep") == 0)) + pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled; + else if ((strcmp(tmpbuf, "TKIP") == 0) || (strcmp(tmpbuf, "tkip") == 0)) + pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled; + else if ((strcmp(tmpbuf, "AES") == 0) || (strcmp(tmpbuf, "aes") == 0)) + pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled; + else + pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled; + + // Update all wepstatus related + pAd->StaCfg.PairCipher = pAd->StaCfg.WepStatus; + pAd->StaCfg.GroupCipher = pAd->StaCfg.WepStatus; + pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus; + pAd->StaCfg.bMixCipher = FALSE; + + //RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0); + DBGPRINT(RT_DEBUG_TRACE, ("%s::(EncrypType=%d)\n", __FUNCTION__, pAd->StaCfg.WepStatus)); + } +#endif // CONFIG_STA_SUPPORT // + } + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if(RTMPGetKeyParameter("WPAPSK", tmpbuf, 512, pBuffer, FALSE)) + { + int ret = TRUE; + + tmpbuf[strlen(tmpbuf)] = '\0'; // make STA can process .$^& for WPAPSK input + + if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) && + (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) && + (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) + ) + { + ret = FALSE; + } + else + { + ret = RT_CfgSetWPAPSKKey(pAd, tmpbuf, (PUCHAR)pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->StaCfg.PMK); + } + + if (ret == TRUE) + { + RTMPZeroMemory(pAd->StaCfg.WpaPassPhrase, 64); + RTMPMoveMemory(pAd->StaCfg.WpaPassPhrase, tmpbuf, strlen(tmpbuf)); + pAd->StaCfg.WpaPassPhraseLen= strlen(tmpbuf); + + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + // Start STA supplicant state machine + pAd->StaCfg.WpaState = SS_START; + } + else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) + { + pAd->StaCfg.WpaState = SS_NOTUSE; + } + DBGPRINT(RT_DEBUG_TRACE, ("%s::(WPAPSK=%s)\n", __FUNCTION__, tmpbuf)); + } + } + } +#endif // CONFIG_STA_SUPPORT // + + //DefaultKeyID, KeyType, KeyStr + rtmp_read_key_parms_from_file(pAd, tmpbuf, pBuffer); + + + +#ifdef DOT11_N_SUPPORT + HTParametersHook(pAd, tmpbuf, pBuffer); +#endif // DOT11_N_SUPPORT // + + +#ifdef CARRIER_DETECTION_SUPPORT + //CarrierDetect + if(RTMPGetKeyParameter("CarrierDetect", tmpbuf, 128, pBuffer, TRUE)) + { + if ((strncmp(tmpbuf, "0", 1) == 0)) + pAd->CommonCfg.CarrierDetect.Enable = FALSE; + else if ((strncmp(tmpbuf, "1", 1) == 0)) + pAd->CommonCfg.CarrierDetect.Enable = TRUE; + else + pAd->CommonCfg.CarrierDetect.Enable = FALSE; + + DBGPRINT(RT_DEBUG_TRACE, ("CarrierDetect.Enable=%d\n", pAd->CommonCfg.CarrierDetect.Enable)); + } + else + pAd->CommonCfg.CarrierDetect.Enable = FALSE; +#endif // CARRIER_DETECTION_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + //PSMode + if (RTMPGetKeyParameter("PSMode", tmpbuf, 10, pBuffer, TRUE)) + { + if (pAd->StaCfg.BssType == BSS_INFRA) + { + if ((strcmp(tmpbuf, "MAX_PSP") == 0) || (strcmp(tmpbuf, "max_psp") == 0)) + { + // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange() + // to exclude certain situations. + // MlmeSetPsm(pAd, PWR_SAVE); + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); + if (pAd->StaCfg.bWindowsACCAMEnable == FALSE) + pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP; + pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP; + pAd->StaCfg.DefaultListenCount = 5; + } + else if ((strcmp(tmpbuf, "Fast_PSP") == 0) || (strcmp(tmpbuf, "fast_psp") == 0) + || (strcmp(tmpbuf, "FAST_PSP") == 0)) + { + // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange() + // to exclude certain situations. + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); + if (pAd->StaCfg.bWindowsACCAMEnable == FALSE) + pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP; + pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP; + pAd->StaCfg.DefaultListenCount = 3; + } + else if ((strcmp(tmpbuf, "Legacy_PSP") == 0) || (strcmp(tmpbuf, "legacy_psp") == 0) + || (strcmp(tmpbuf, "LEGACY_PSP") == 0)) + { + // do NOT turn on PSM bit here, wait until MlmeCheckForPsmChange() + // to exclude certain situations. + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); + if (pAd->StaCfg.bWindowsACCAMEnable == FALSE) + pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP; + pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP; + pAd->StaCfg.DefaultListenCount = 3; + } + else + { //Default Ndis802_11PowerModeCAM + // clear PSM bit immediately + RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE); + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); + if (pAd->StaCfg.bWindowsACCAMEnable == FALSE) + pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM; + pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM; + } + DBGPRINT(RT_DEBUG_TRACE, ("PSMode=%ld\n", pAd->StaCfg.WindowsPowerMode)); + } + } + // AutoRoaming by RSSI + if (RTMPGetKeyParameter("AutoRoaming", tmpbuf, 32, pBuffer, TRUE)) + { + if (simple_strtol(tmpbuf, 0, 10) == 0) + pAd->StaCfg.bAutoRoaming = FALSE; + else + pAd->StaCfg.bAutoRoaming = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("AutoRoaming=%d\n", pAd->StaCfg.bAutoRoaming)); + } + // RoamThreshold + if (RTMPGetKeyParameter("RoamThreshold", tmpbuf, 32, pBuffer, TRUE)) + { + long lInfo = simple_strtol(tmpbuf, 0, 10); + + if (lInfo > 90 || lInfo < 60) + pAd->StaCfg.dBmToRoam = -70; + else + pAd->StaCfg.dBmToRoam = (CHAR)(-1)*lInfo; + + DBGPRINT(RT_DEBUG_TRACE, ("RoamThreshold=%d dBm\n", pAd->StaCfg.dBmToRoam)); + } + + if(RTMPGetKeyParameter("TGnWifiTest", tmpbuf, 10, pBuffer, TRUE)) + { + if(simple_strtol(tmpbuf, 0, 10) == 0) + pAd->StaCfg.bTGnWifiTest = FALSE; + else + pAd->StaCfg.bTGnWifiTest = TRUE; + DBGPRINT(RT_DEBUG_TRACE, ("TGnWifiTest=%d\n", pAd->StaCfg.bTGnWifiTest)); + } + + // Beacon Lost Time + if (RTMPGetKeyParameter("BeaconLostTime", tmpbuf, 32, pBuffer, TRUE)) + { + ULONG lInfo = (ULONG)simple_strtol(tmpbuf, 0, 10); + + if ((lInfo != 0) && (lInfo <= 60)) + pAd->StaCfg.BeaconLostTime = (lInfo * OS_HZ); + DBGPRINT(RT_DEBUG_TRACE, ("BeaconLostTime=%ld \n", pAd->StaCfg.BeaconLostTime)); + } + + // Auto Connet Setting if no SSID + if (RTMPGetKeyParameter("AutoConnect", tmpbuf, 32, pBuffer, TRUE)) + { + if (simple_strtol(tmpbuf, 0, 10) == 0) + pAd->StaCfg.bAutoConnectIfNoSSID = FALSE; + else + pAd->StaCfg.bAutoConnectIfNoSSID = TRUE; + } + + + } +#endif // CONFIG_STA_SUPPORT // + + + + + +#ifdef SINGLE_SKU + if(RTMPGetKeyParameter("AntGain", tmpbuf, 10, pBuffer, TRUE)) + { + UCHAR AntGain = simple_strtol(tmpbuf, 0, 10); + pAd->CommonCfg.AntGain= AntGain; + + DBGPRINT(RT_DEBUG_TRACE, ("AntGain=%d\n", pAd->CommonCfg.AntGain)); + } + if(RTMPGetKeyParameter("BandedgeDelta", tmpbuf, 10, pBuffer, TRUE)) + { + UCHAR Bandedge = simple_strtol(tmpbuf, 0, 10); + pAd->CommonCfg.BandedgeDelta = Bandedge; + + DBGPRINT(RT_DEBUG_TRACE, ("BandedgeDelta=%d\n", pAd->CommonCfg.BandedgeDelta)); + } +#endif // SINGLE_SKU // + }while(0); + + + kfree(tmpbuf); + + return NDIS_STATUS_SUCCESS; + +} + + +#ifdef MULTIPLE_CARD_SUPPORT +// record whether the card in the card list is used in the card file +UINT8 MC_CardUsed[MAX_NUM_OF_MULTIPLE_CARD]; +// record used card mac address in the card list +static UINT8 MC_CardMac[MAX_NUM_OF_MULTIPLE_CARD][6]; + +/* +======================================================================== +Routine Description: + Get card profile path. + +Arguments: + pAd + +Return Value: + TRUE - Find a card profile + FALSE - use default profile + +Note: +======================================================================== +*/ +BOOLEAN RTMP_CardInfoRead( + IN PRTMP_ADAPTER pAd) +{ +#define MC_SELECT_CARDID 0 /* use CARD ID (0 ~ 31) to identify different cards */ +#define MC_SELECT_MAC 1 /* use CARD MAC to identify different cards */ +#define MC_SELECT_CARDTYPE 2 /* use CARD type (abgn or bgn) to identify different cards */ + +#define LETTER_CASE_TRANSLATE(txt_p, card_id) \ + { UINT32 _len; char _char; \ + for(_len=0; _len<strlen(card_id); _len++) { \ + _char = *(txt_p + _len); \ + if (('A' <= _char) && (_char <= 'Z')) \ + *(txt_p+_len) = 'a'+(_char-'A'); \ + } } + + RTMP_OS_FD srcf; + INT retval; + PSTRING buffer, tmpbuf; + STRING card_id_buf[30], RFIC_word[30]; + BOOLEAN flg_match_ok = FALSE; + INT32 card_select_method; + INT32 card_free_id, card_nouse_id, card_same_mac_id, card_match_id; + EEPROM_ANTENNA_STRUC antenna; + USHORT addr01, addr23, addr45; + UINT8 mac[6]; + UINT32 data, card_index; + UCHAR *start_ptr; + RTMP_OS_FS_INFO osFSInfo; + + // init + buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG); + if (buffer == NULL) + return FALSE; + + tmpbuf = kmalloc(MAX_PARAM_BUFFER_SIZE, MEM_ALLOC_FLAG); + if(tmpbuf == NULL) + { + kfree(buffer); + return NDIS_STATUS_FAILURE; + } + + // get RF IC type + RTMP_IO_READ32(pAd, E2PROM_CSR, &data); + + if ((data & 0x30) == 0) + pAd->EEPROMAddressNum = 6; // 93C46 + else if ((data & 0x30) == 0x10) + pAd->EEPROMAddressNum = 8; // 93C66 + else + pAd->EEPROMAddressNum = 8; // 93C86 + + RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, antenna.word); + + if ((antenna.field.RfIcType == RFIC_2850) || + (antenna.field.RfIcType == RFIC_2750)) + { + /* ABGN card */ + strcpy(RFIC_word, "abgn"); + } + else + { + /* BGN card */ + strcpy(RFIC_word, "bgn"); + } + + // get MAC address + RT28xx_EEPROM_READ16(pAd, 0x04, addr01); + RT28xx_EEPROM_READ16(pAd, 0x06, addr23); + RT28xx_EEPROM_READ16(pAd, 0x08, addr45); + + mac[0] = (UCHAR)(addr01 & 0xff); + mac[1] = (UCHAR)(addr01 >> 8); + mac[2] = (UCHAR)(addr23 & 0xff); + mac[3] = (UCHAR)(addr23 >> 8); + mac[4] = (UCHAR)(addr45 & 0xff); + mac[5] = (UCHAR)(addr45 >> 8); + + DBGPRINT(RT_DEBUG_TRACE, ("mac addr=%02x:%02x:%02x:%02x:%02x:%02x!\n", PRINT_MAC(mac))); + + RtmpOSFSInfoChange(&osFSInfo, TRUE); + // open card information file + srcf = RtmpOSFileOpen(CARD_INFO_PATH, O_RDONLY, 0); + if (IS_FILE_OPEN_ERR(srcf)) + { + /* card information file does not exist */ + DBGPRINT(RT_DEBUG_TRACE, + ("--> Error opening %s\n", CARD_INFO_PATH)); + goto free_resource; + } + + /* card information file exists so reading the card information */ + memset(buffer, 0x00, MAX_INI_BUFFER_SIZE); + retval = RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE); + if (retval < 0) + { + /* read fail */ + DBGPRINT(RT_DEBUG_TRACE, + ("--> Read %s error %d\n", CARD_INFO_PATH, -retval)); + } + else + { + /* get card selection method */ + memset(tmpbuf, 0x00, MAX_PARAM_BUFFER_SIZE); + card_select_method = MC_SELECT_CARDTYPE; // default + + if (RTMPGetKeyParameter("SELECT", tmpbuf, 256, buffer, TRUE)) + { + if (strcmp(tmpbuf, "CARDID") == 0) + card_select_method = MC_SELECT_CARDID; + else if (strcmp(tmpbuf, "MAC") == 0) + card_select_method = MC_SELECT_MAC; + else if (strcmp(tmpbuf, "CARDTYPE") == 0) + card_select_method = MC_SELECT_CARDTYPE; + } + + DBGPRINT(RT_DEBUG_TRACE, + ("MC> Card Selection = %d\n", card_select_method)); + + // init + card_free_id = -1; + card_nouse_id = -1; + card_same_mac_id = -1; + card_match_id = -1; + + // search current card information records + for(card_index=0; + card_index<MAX_NUM_OF_MULTIPLE_CARD; + card_index++) + { + if ((*(UINT32 *)&MC_CardMac[card_index][0] == 0) && + (*(UINT16 *)&MC_CardMac[card_index][4] == 0)) + { + // MAC is all-0 so the entry is available + MC_CardUsed[card_index] = 0; + + if (card_free_id < 0) + card_free_id = card_index; // 1st free entry + } + else + { + if (memcmp(MC_CardMac[card_index], mac, 6) == 0) + { + // we find the entry with same MAC + if (card_same_mac_id < 0) + card_same_mac_id = card_index; // 1st same entry + } + else + { + // MAC is not all-0 but used flag == 0 + if ((MC_CardUsed[card_index] == 0) && + (card_nouse_id < 0)) + { + card_nouse_id = card_index; // 1st available entry + } + } + } + } + + DBGPRINT(RT_DEBUG_TRACE, + ("MC> Free = %d, Same = %d, NOUSE = %d\n", + card_free_id, card_same_mac_id, card_nouse_id)); + + if ((card_same_mac_id >= 0) && + ((card_select_method == MC_SELECT_CARDID) || + (card_select_method == MC_SELECT_CARDTYPE))) + { + // same MAC entry is found + card_match_id = card_same_mac_id; + + if (card_select_method == MC_SELECT_CARDTYPE) + { + // for CARDTYPE + sprintf(card_id_buf, "%02dCARDTYPE%s", + card_match_id, RFIC_word); + + if ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer, card_id_buf)) != NULL) + { + // we found the card ID + LETTER_CASE_TRANSLATE(start_ptr, card_id_buf); + } + } + } + else + { + // the card is 1st plug-in, try to find the match card profile + switch(card_select_method) + { + case MC_SELECT_CARDID: // CARDID + default: + if (card_free_id >= 0) + card_match_id = card_free_id; + else + card_match_id = card_nouse_id; + break; + + case MC_SELECT_MAC: // MAC + sprintf(card_id_buf, "MAC%02x:%02x:%02x:%02x:%02x:%02x", + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); + + /* try to find the key word in the card file */ + if ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer, card_id_buf)) != NULL) + { + LETTER_CASE_TRANSLATE(start_ptr, card_id_buf); + + /* get the row ID (2 ASCII characters) */ + start_ptr -= 2; + card_id_buf[0] = *(start_ptr); + card_id_buf[1] = *(start_ptr+1); + card_id_buf[2] = 0x00; + + card_match_id = simple_strtol(card_id_buf, 0, 10); + } + break; + + case MC_SELECT_CARDTYPE: // CARDTYPE + card_nouse_id = -1; + + for(card_index=0; + card_index<MAX_NUM_OF_MULTIPLE_CARD; + card_index++) + { + sprintf(card_id_buf, "%02dCARDTYPE%s", + card_index, RFIC_word); + + if ((start_ptr = (PUCHAR)rtstrstruncasecmp(buffer, + card_id_buf)) != NULL) + { + LETTER_CASE_TRANSLATE(start_ptr, card_id_buf); + + if (MC_CardUsed[card_index] == 0) + { + /* current the card profile is not used */ + if ((*(UINT32 *)&MC_CardMac[card_index][0] == 0) && + (*(UINT16 *)&MC_CardMac[card_index][4] == 0)) + { + // find it and no previous card use it + card_match_id = card_index; + break; + } + else + { + // ever a card use it + if (card_nouse_id < 0) + card_nouse_id = card_index; + } + } + } + } + + // if not find a free one, use the available one + if (card_match_id < 0) + card_match_id = card_nouse_id; + break; + } + } + + if (card_match_id >= 0) + { + // make up search keyword + switch(card_select_method) + { + case MC_SELECT_CARDID: // CARDID + sprintf(card_id_buf, "%02dCARDID", card_match_id); + break; + + case MC_SELECT_MAC: // MAC + sprintf(card_id_buf, + "%02dmac%02x:%02x:%02x:%02x:%02x:%02x", + card_match_id, + mac[0], mac[1], mac[2], + mac[3], mac[4], mac[5]); + break; + + case MC_SELECT_CARDTYPE: // CARDTYPE + default: + sprintf(card_id_buf, "%02dcardtype%s", + card_match_id, RFIC_word); + break; + } + + DBGPRINT(RT_DEBUG_TRACE, ("Search Keyword = %s\n", card_id_buf)); + + // read card file path + if (RTMPGetKeyParameter(card_id_buf, tmpbuf, 256, buffer, TRUE)) + { + if (strlen(tmpbuf) < sizeof(pAd->MC_FileName)) + { + // backup card information + pAd->MC_RowID = card_match_id; /* base 0 */ + MC_CardUsed[card_match_id] = 1; + memcpy(MC_CardMac[card_match_id], mac, sizeof(mac)); + + // backup card file path + NdisMoveMemory(pAd->MC_FileName, tmpbuf , strlen(tmpbuf)); + pAd->MC_FileName[strlen(tmpbuf)] = '\0'; + flg_match_ok = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, + ("Card Profile Name = %s\n", pAd->MC_FileName)); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, + ("Card Profile Name length too large!\n")); + } + } + else + { + DBGPRINT(RT_DEBUG_ERROR, + ("Can not find search key word in card.dat!\n")); + } + + if ((flg_match_ok != TRUE) && + (card_match_id < MAX_NUM_OF_MULTIPLE_CARD)) + { + MC_CardUsed[card_match_id] = 0; + memset(MC_CardMac[card_match_id], 0, sizeof(mac)); + } + } // if (card_match_id >= 0) + } + + + // close file + retval = RtmpOSFileClose(srcf); + +free_resource: + RtmpOSFSInfoChange(&osFSInfo, FALSE); + kfree(buffer); + kfree(tmpbuf); + + return flg_match_ok; +} +#endif // MULTIPLE_CARD_SUPPORT // + + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_sanity.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_sanity.c new file mode 100644 index 000000000..333747222 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_sanity.c @@ -0,0 +1,1660 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + sanity.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John Chang 2004-09-01 add WMM support +*/ +#include "rt_config.h" + +extern UCHAR CISCO_OUI[]; + +extern UCHAR WPA_OUI[]; +extern UCHAR RSN_OUI[]; +extern UCHAR WME_INFO_ELEM[]; +extern UCHAR WME_PARM_ELEM[]; +extern UCHAR Ccx2QosInfo[]; +extern UCHAR RALINK_OUI[]; +extern UCHAR BROADCOM_OUI[]; +extern UCHAR WPS_OUI[]; + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN MlmeAddBAReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2) +{ + PMLME_ADDBA_REQ_STRUCT pInfo; + + pInfo = (MLME_ADDBA_REQ_STRUCT *)Msg; + + if ((MsgLen != sizeof(MLME_ADDBA_REQ_STRUCT))) + { + DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - message lenght not correct.\n")); + return FALSE; + } + + if ((pInfo->Wcid >= MAX_LEN_OF_MAC_TABLE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - The peer Mac is not associated yet.\n")); + return FALSE; + } + + /* + if ((pInfo->BaBufSize > MAX_RX_REORDERBUF) || (pInfo->BaBufSize < 2)) + { + DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - Rx Reordering buffer too big or too small\n")); + return FALSE; + } + */ + + if ((pInfo->pAddr[0]&0x01) == 0x01) + { + DBGPRINT(RT_DEBUG_TRACE, ("MlmeAddBAReqSanity fail - broadcast address not support BA\n")); + return FALSE; + } + + return TRUE; +} + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN MlmeDelBAReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen) +{ + MLME_DELBA_REQ_STRUCT *pInfo; + pInfo = (MLME_DELBA_REQ_STRUCT *)Msg; + + if ((MsgLen != sizeof(MLME_DELBA_REQ_STRUCT))) + { + DBGPRINT(RT_DEBUG_ERROR, ("MlmeDelBAReqSanity fail - message lenght not correct.\n")); + return FALSE; + } + + if ((pInfo->Wcid >= MAX_LEN_OF_MAC_TABLE)) + { + DBGPRINT(RT_DEBUG_ERROR, ("MlmeDelBAReqSanity fail - The peer Mac is not associated yet.\n")); + return FALSE; + } + + if ((pInfo->TID & 0xf0)) + { + DBGPRINT(RT_DEBUG_ERROR, ("MlmeDelBAReqSanity fail - The peer TID is incorrect.\n")); + return FALSE; + } + + if (NdisEqualMemory(pAd->MacTab.Content[pInfo->Wcid].Addr, pInfo->Addr, MAC_ADDR_LEN) == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("MlmeDelBAReqSanity fail - the peer addr dosen't exist.\n")); + return FALSE; + } + + return TRUE; +} + +BOOLEAN PeerAddBAReqActionSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2) +{ + PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg; + PFRAME_ADDBA_REQ pAddFrame; + pAddFrame = (PFRAME_ADDBA_REQ)(pMsg); + if (MsgLen < (sizeof(FRAME_ADDBA_REQ))) + { + DBGPRINT(RT_DEBUG_ERROR,("PeerAddBAReqActionSanity: ADDBA Request frame length size = %ld incorrect\n", MsgLen)); + return FALSE; + } + // we support immediate BA. +#ifdef UNALIGNMENT_SUPPORT + { + BA_PARM tmpBaParm; + + NdisMoveMemory((PUCHAR)(&tmpBaParm), (PUCHAR)(&pAddFrame->BaParm), sizeof(BA_PARM)); + *(USHORT *)(&tmpBaParm) = cpu2le16(*(USHORT *)(&tmpBaParm)); + NdisMoveMemory((PUCHAR)(&pAddFrame->BaParm), (PUCHAR)(&tmpBaParm), sizeof(BA_PARM)); + } +#else + *(USHORT *)(&pAddFrame->BaParm) = cpu2le16(*(USHORT *)(&pAddFrame->BaParm)); +#endif + pAddFrame->TimeOutValue = cpu2le16(pAddFrame->TimeOutValue); + pAddFrame->BaStartSeq.word = cpu2le16(pAddFrame->BaStartSeq.word); + + if (pAddFrame->BaParm.BAPolicy != IMMED_BA) + { + DBGPRINT(RT_DEBUG_ERROR,("PeerAddBAReqActionSanity: ADDBA Request Ba Policy[%d] not support\n", pAddFrame->BaParm.BAPolicy)); + DBGPRINT(RT_DEBUG_ERROR,("ADDBA Request. tid=%x, Bufsize=%x, AMSDUSupported=%x \n", pAddFrame->BaParm.TID, pAddFrame->BaParm.BufSize, pAddFrame->BaParm.AMSDUSupported)); + return FALSE; + } + + // we support immediate BA. + if (pAddFrame->BaParm.TID &0xfff0) + { + DBGPRINT(RT_DEBUG_ERROR,("PeerAddBAReqActionSanity: ADDBA Request incorrect TID = %d\n", pAddFrame->BaParm.TID)); + return FALSE; + } + COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2); + return TRUE; +} + +BOOLEAN PeerAddBARspActionSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen) +{ + //PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg; + PFRAME_ADDBA_RSP pAddFrame; + + pAddFrame = (PFRAME_ADDBA_RSP)(pMsg); + if (MsgLen < (sizeof(FRAME_ADDBA_RSP))) + { + DBGPRINT(RT_DEBUG_ERROR,("PeerAddBARspActionSanity: ADDBA Response frame length size = %ld incorrect\n", MsgLen)); + return FALSE; + } + // we support immediate BA. +#ifdef UNALIGNMENT_SUPPORT + { + BA_PARM tmpBaParm; + + NdisMoveMemory((PUCHAR)(&tmpBaParm), (PUCHAR)(&pAddFrame->BaParm), sizeof(BA_PARM)); + *(USHORT *)(&tmpBaParm) = cpu2le16(*(USHORT *)(&tmpBaParm)); + NdisMoveMemory((PUCHAR)(&pAddFrame->BaParm), (PUCHAR)(&tmpBaParm), sizeof(BA_PARM)); + } +#else + *(USHORT *)(&pAddFrame->BaParm) = cpu2le16(*(USHORT *)(&pAddFrame->BaParm)); +#endif + pAddFrame->StatusCode = cpu2le16(pAddFrame->StatusCode); + pAddFrame->TimeOutValue = cpu2le16(pAddFrame->TimeOutValue); + + if (pAddFrame->BaParm.BAPolicy != IMMED_BA) + { + DBGPRINT(RT_DEBUG_ERROR,("PeerAddBAReqActionSanity: ADDBA Response Ba Policy[%d] not support\n", pAddFrame->BaParm.BAPolicy)); + return FALSE; + } + + // we support immediate BA. + if (pAddFrame->BaParm.TID &0xfff0) + { + DBGPRINT(RT_DEBUG_ERROR,("PeerAddBARspActionSanity: ADDBA Response incorrect TID = %d\n", pAddFrame->BaParm.TID)); + return FALSE; + } + return TRUE; + +} + +BOOLEAN PeerDelBAActionSanity( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN VOID *pMsg, + IN ULONG MsgLen ) +{ + //PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg; + PFRAME_DELBA_REQ pDelFrame; + if (MsgLen != (sizeof(FRAME_DELBA_REQ))) + return FALSE; + + if (Wcid >= MAX_LEN_OF_MAC_TABLE) + return FALSE; + + pDelFrame = (PFRAME_DELBA_REQ)(pMsg); + + *(USHORT *)(&pDelFrame->DelbaParm) = cpu2le16(*(USHORT *)(&pDelFrame->DelbaParm)); + pDelFrame->ReasonCode = cpu2le16(pDelFrame->ReasonCode); + + if (pDelFrame->DelbaParm.TID &0xfff0) + return FALSE; + + return TRUE; +} + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN PeerBeaconAndProbeRspSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + IN UCHAR MsgChannel, + OUT PUCHAR pAddr2, + OUT PUCHAR pBssid, + OUT CHAR Ssid[], + OUT UCHAR *pSsidLen, + OUT UCHAR *pBssType, + OUT USHORT *pBeaconPeriod, + OUT UCHAR *pChannel, + OUT UCHAR *pNewChannel, + OUT LARGE_INTEGER *pTimestamp, + OUT CF_PARM *pCfParm, + OUT USHORT *pAtimWin, + OUT USHORT *pCapabilityInfo, + OUT UCHAR *pErp, + OUT UCHAR *pDtimCount, + OUT UCHAR *pDtimPeriod, + OUT UCHAR *pBcastFlag, + OUT UCHAR *pMessageToMe, + OUT UCHAR SupRate[], + OUT UCHAR *pSupRateLen, + OUT UCHAR ExtRate[], + OUT UCHAR *pExtRateLen, + OUT UCHAR *pCkipFlag, + OUT UCHAR *pAironetCellPowerLimit, + OUT PEDCA_PARM pEdcaParm, + OUT PQBSS_LOAD_PARM pQbssLoad, + OUT PQOS_CAPABILITY_PARM pQosCapability, + OUT ULONG *pRalinkIe, + OUT UCHAR *pHtCapabilityLen, +#ifdef CONFIG_STA_SUPPORT + OUT UCHAR *pPreNHtCapabilityLen, +#endif // CONFIG_STA_SUPPORT // + OUT HT_CAPABILITY_IE *pHtCapability, + OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo, + OUT UCHAR *AddHtInfoLen, + OUT ADD_HT_INFO_IE *AddHtInfo, + OUT UCHAR *NewExtChannelOffset, // Ht extension channel offset(above or below) + OUT USHORT *LengthVIE, + OUT PNDIS_802_11_VARIABLE_IEs pVIE) +{ + UCHAR *Ptr; +#ifdef CONFIG_STA_SUPPORT + UCHAR TimLen; +#endif // CONFIG_STA_SUPPORT // + PFRAME_802_11 pFrame; + PEID_STRUCT pEid; + UCHAR SubType; + UCHAR Sanity; + //UCHAR ECWMin, ECWMax; + //MAC_CSR9_STRUC Csr9; + ULONG Length = 0; + + // For some 11a AP which didn't have DS_IE, we use two conditions to decide the channel + // 1. If the AP is 11n enabled, then check the control channel. + // 2. If the AP didn't have any info about channel, use the channel we received this frame as the channel. (May inaccuracy!!) + UCHAR CtrlChannel = 0; + + // Add for 3 necessary EID field check + Sanity = 0; + + *pAtimWin = 0; + *pErp = 0; + *pDtimCount = 0; + *pDtimPeriod = 0; + *pBcastFlag = 0; + *pMessageToMe = 0; + *pExtRateLen = 0; + *pCkipFlag = 0; // Default of CkipFlag is 0 + *pAironetCellPowerLimit = 0xFF; // Default of AironetCellPowerLimit is 0xFF + *LengthVIE = 0; // Set the length of VIE to init value 0 + *pHtCapabilityLen = 0; // Set the length of VIE to init value 0 +#ifdef CONFIG_STA_SUPPORT + if (pAd->OpMode == OPMODE_STA) + *pPreNHtCapabilityLen = 0; // Set the length of VIE to init value 0 +#endif // CONFIG_STA_SUPPORT // + *AddHtInfoLen = 0; // Set the length of VIE to init value 0 + NdisZeroMemory(pExtCapInfo, sizeof(EXT_CAP_INFO_ELEMENT)); + *pRalinkIe = 0; + *pNewChannel = 0; + *NewExtChannelOffset = 0xff; //Default 0xff means no such IE + pCfParm->bValid = FALSE; // default: no IE_CF found + pQbssLoad->bValid = FALSE; // default: no IE_QBSS_LOAD found + pEdcaParm->bValid = FALSE; // default: no IE_EDCA_PARAMETER found + pQosCapability->bValid = FALSE; // default: no IE_QOS_CAPABILITY found + + pFrame = (PFRAME_802_11)Msg; + + // get subtype from header + SubType = (UCHAR)pFrame->Hdr.FC.SubType; + + // get Addr2 and BSSID from header + COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2); + COPY_MAC_ADDR(pBssid, pFrame->Hdr.Addr3); + +// hex_dump("Beacon", Msg, MsgLen); + + Ptr = pFrame->Octet; + Length += LENGTH_802_11; + + // get timestamp from payload and advance the pointer + NdisMoveMemory(pTimestamp, Ptr, TIMESTAMP_LEN); + + pTimestamp->u.LowPart = cpu2le32(pTimestamp->u.LowPart); + pTimestamp->u.HighPart = cpu2le32(pTimestamp->u.HighPart); + + Ptr += TIMESTAMP_LEN; + Length += TIMESTAMP_LEN; + + // get beacon interval from payload and advance the pointer + NdisMoveMemory(pBeaconPeriod, Ptr, 2); + Ptr += 2; + Length += 2; + + // get capability info from payload and advance the pointer + NdisMoveMemory(pCapabilityInfo, Ptr, 2); + Ptr += 2; + Length += 2; + + if (CAP_IS_ESS_ON(*pCapabilityInfo)) + *pBssType = BSS_INFRA; + else + *pBssType = BSS_ADHOC; + + pEid = (PEID_STRUCT) Ptr; + + // get variable fields from payload and advance the pointer + while ((Length + 2 + pEid->Len) <= MsgLen) + { + // + // Secure copy VIE to VarIE[MAX_VIE_LEN] didn't overflow. + // + if ((*LengthVIE + pEid->Len + 2) >= MAX_VIE_LEN) + { + DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - Variable IEs out of resource [len(=%d) > MAX_VIE_LEN(=%d)]\n", + (*LengthVIE + pEid->Len + 2), MAX_VIE_LEN)); + break; + } + + switch(pEid->Eid) + { + case IE_SSID: + // Already has one SSID EID in this beacon, ignore the second one + if (Sanity & 0x1) + break; + if(pEid->Len <= MAX_LEN_OF_SSID) + { + NdisMoveMemory(Ssid, pEid->Octet, pEid->Len); + *pSsidLen = pEid->Len; + Sanity |= 0x1; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_SSID (len=%d)\n",pEid->Len)); + return FALSE; + } + break; + + case IE_SUPP_RATES: + if(pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) + { + Sanity |= 0x2; + NdisMoveMemory(SupRate, pEid->Octet, pEid->Len); + *pSupRateLen = pEid->Len; + + // TODO: 2004-09-14 not a good design here, cause it exclude extra rates + // from ScanTab. We should report as is. And filter out unsupported + // rates in MlmeAux. + // Check against the supported rates + // RTMPCheckRates(pAd, SupRate, pSupRateLen); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_SUPP_RATES (len=%d)\n",pEid->Len)); + return FALSE; + } + break; + + case IE_HT_CAP: + if (pEid->Len >= SIZE_HT_CAP_IE) //Note: allow extension.!! + { + NdisMoveMemory(pHtCapability, pEid->Octet, sizeof(HT_CAPABILITY_IE)); + *pHtCapabilityLen = SIZE_HT_CAP_IE; // Nnow we only support 26 bytes. + + *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo)); +#ifdef UNALIGNMENT_SUPPORT + { + EXT_HT_CAP_INFO extHtCapInfo; + NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); + NdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + } +#else + *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo)); +#endif // UNALIGNMENT_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + *pPreNHtCapabilityLen = 0; // Now we only support 26 bytes. + + Ptr = (PUCHAR) pVIE; + NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2); + *LengthVIE += (pEid->Len + 2); + } +#endif // CONFIG_STA_SUPPORT // + } + else + { + DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - wrong IE_HT_CAP. pEid->Len = %d\n", pEid->Len)); + } + + break; + case IE_ADD_HT: + if (pEid->Len >= sizeof(ADD_HT_INFO_IE)) + { + // This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only + // copy first sizeof(ADD_HT_INFO_IE) + NdisMoveMemory(AddHtInfo, pEid->Octet, sizeof(ADD_HT_INFO_IE)); + *AddHtInfoLen = SIZE_ADD_HT_INFO_IE; + + CtrlChannel = AddHtInfo->ControlChan; + + *(USHORT *)(&AddHtInfo->AddHtInfo2) = cpu2le16(*(USHORT *)(&AddHtInfo->AddHtInfo2)); + *(USHORT *)(&AddHtInfo->AddHtInfo3) = cpu2le16(*(USHORT *)(&AddHtInfo->AddHtInfo3)); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + Ptr = (PUCHAR) pVIE; + NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2); + *LengthVIE += (pEid->Len + 2); + } +#endif // CONFIG_STA_SUPPORT // + } + else + { + DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - wrong IE_ADD_HT. \n")); + } + + break; + case IE_SECONDARY_CH_OFFSET: + if (pEid->Len == 1) + { + *NewExtChannelOffset = pEid->Octet[0]; + } + else + { + DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - wrong IE_SECONDARY_CH_OFFSET. \n")); + } + + break; + case IE_FH_PARM: + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity(IE_FH_PARM) \n")); + break; + + case IE_DS_PARM: + if(pEid->Len == 1) + { + *pChannel = *pEid->Octet; +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (ChannelSanity(pAd, *pChannel) == 0) + { + + return FALSE; + } + } +#endif // CONFIG_STA_SUPPORT // + Sanity |= 0x4; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_DS_PARM (len=%d)\n",pEid->Len)); + return FALSE; + } + break; + + case IE_CF_PARM: + if(pEid->Len == 6) + { + pCfParm->bValid = TRUE; + pCfParm->CfpCount = pEid->Octet[0]; + pCfParm->CfpPeriod = pEid->Octet[1]; + pCfParm->CfpMaxDuration = pEid->Octet[2] + 256 * pEid->Octet[3]; + pCfParm->CfpDurRemaining = pEid->Octet[4] + 256 * pEid->Octet[5]; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_CF_PARM\n")); + return FALSE; + } + break; + + case IE_IBSS_PARM: + if(pEid->Len == 2) + { + NdisMoveMemory(pAtimWin, pEid->Octet, pEid->Len); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_IBSS_PARM\n")); + return FALSE; + } + break; + +#ifdef CONFIG_STA_SUPPORT + case IE_TIM: + if(INFRA_ON(pAd) && SubType == SUBTYPE_BEACON) + { + GetTimBit((PCHAR)pEid, pAd->StaActive.Aid, &TimLen, pBcastFlag, pDtimCount, pDtimPeriod, pMessageToMe); + } + break; +#endif // CONFIG_STA_SUPPORT // + case IE_CHANNEL_SWITCH_ANNOUNCEMENT: + if(pEid->Len == 3) + { + *pNewChannel = pEid->Octet[1]; //extract new channel number + } + break; + + // New for WPA + // CCX v2 has the same IE, we need to parse that too + // Wifi WMM use the same IE vale, need to parse that too + // case IE_WPA: + case IE_VENDOR_SPECIFIC: + // Check Broadcom/Atheros 802.11n OUI version, for HT Capability IE. + // This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan. + /*if (NdisEqualMemory(pEid->Octet, BROADCOM_OUI, 3) && (pEid->Len >= 4)) + { + if ((pEid->Octet[3] == OUI_BROADCOM_HT) && (pEid->Len >= 30)) + { + { + NdisMoveMemory(pHtCapability, &pEid->Octet[4], sizeof(HT_CAPABILITY_IE)); + *pHtCapabilityLen = SIZE_HT_CAP_IE; // Nnow we only support 26 bytes. + } + } + if ((pEid->Octet[3] == OUI_BROADCOM_HT) && (pEid->Len >= 26)) + { + { + NdisMoveMemory(AddHtInfo, &pEid->Octet[4], sizeof(ADD_HT_INFO_IE)); + *AddHtInfoLen = SIZE_ADD_HT_INFO_IE; // Nnow we only support 26 bytes. + } + } + } + */ + // Check the OUI version, filter out non-standard usage + if (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3) && (pEid->Len == 7)) + { + //*pRalinkIe = pEid->Octet[3]; + if (pEid->Octet[3] != 0) + *pRalinkIe = pEid->Octet[3]; + else + *pRalinkIe = 0xf0000000; // Set to non-zero value (can't set bit0-2) to represent this is Ralink Chip. So at linkup, we will set ralinkchip flag. + } +#ifdef CONFIG_STA_SUPPORT +#ifdef DOT11_N_SUPPORT + // This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan. + + // Other vendors had production before IE_HT_CAP value is assigned. To backward support those old-firmware AP, + // Check broadcom-defiend pre-802.11nD1.0 OUI for HT related IE, including HT Capatilities IE and HT Information IE + else if ((*pHtCapabilityLen == 0) && NdisEqualMemory(pEid->Octet, PRE_N_HT_OUI, 3) && (pEid->Len >= 4) && (pAd->OpMode == OPMODE_STA)) + { + if ((pEid->Octet[3] == OUI_PREN_HT_CAP) && (pEid->Len >= 30) && (*pHtCapabilityLen == 0)) + { + NdisMoveMemory(pHtCapability, &pEid->Octet[4], sizeof(HT_CAPABILITY_IE)); + *pPreNHtCapabilityLen = SIZE_HT_CAP_IE; + } + + if ((pEid->Octet[3] == OUI_PREN_ADD_HT) && (pEid->Len >= 26)) + { + NdisMoveMemory(AddHtInfo, &pEid->Octet[4], sizeof(ADD_HT_INFO_IE)); + *AddHtInfoLen = SIZE_ADD_HT_INFO_IE; + } + } +#endif // DOT11_N_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + else if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) + { + // Copy to pVIE which will report to bssid list. + Ptr = (PUCHAR) pVIE; + NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2); + *LengthVIE += (pEid->Len + 2); + } + else if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24)) + { + PUCHAR ptr; + int i; + + // parsing EDCA parameters + pEdcaParm->bValid = TRUE; + pEdcaParm->bQAck = FALSE; // pEid->Octet[0] & 0x10; + pEdcaParm->bQueueRequest = FALSE; // pEid->Octet[0] & 0x20; + pEdcaParm->bTxopRequest = FALSE; // pEid->Octet[0] & 0x40; + pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f; + pEdcaParm->bAPSDCapable = (pEid->Octet[6] & 0x80) ? 1 : 0; + ptr = &pEid->Octet[8]; + for (i=0; i<4; i++) + { + UCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX + pEdcaParm->bACM[aci] = (((*ptr) & 0x10) == 0x10); // b5 is ACM + pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f; // b0~3 is AIFSN + pEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f; // b0~4 is Cwmin + pEdcaParm->Cwmax[aci] = *(ptr+1) >> 4; // b5~8 is Cwmax + pEdcaParm->Txop[aci] = *(ptr+2) + 256 * (*(ptr+3)); // in unit of 32-us + ptr += 4; // point to next AC + } + } + else if (NdisEqualMemory(pEid->Octet, WME_INFO_ELEM, 6) && (pEid->Len == 7)) + { + // parsing EDCA parameters + pEdcaParm->bValid = TRUE; + pEdcaParm->bQAck = FALSE; // pEid->Octet[0] & 0x10; + pEdcaParm->bQueueRequest = FALSE; // pEid->Octet[0] & 0x20; + pEdcaParm->bTxopRequest = FALSE; // pEid->Octet[0] & 0x40; + pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f; + pEdcaParm->bAPSDCapable = (pEid->Octet[6] & 0x80) ? 1 : 0; + + // use default EDCA parameter + pEdcaParm->bACM[QID_AC_BE] = 0; + pEdcaParm->Aifsn[QID_AC_BE] = 3; + pEdcaParm->Cwmin[QID_AC_BE] = CW_MIN_IN_BITS; + pEdcaParm->Cwmax[QID_AC_BE] = CW_MAX_IN_BITS; + pEdcaParm->Txop[QID_AC_BE] = 0; + + pEdcaParm->bACM[QID_AC_BK] = 0; + pEdcaParm->Aifsn[QID_AC_BK] = 7; + pEdcaParm->Cwmin[QID_AC_BK] = CW_MIN_IN_BITS; + pEdcaParm->Cwmax[QID_AC_BK] = CW_MAX_IN_BITS; + pEdcaParm->Txop[QID_AC_BK] = 0; + + pEdcaParm->bACM[QID_AC_VI] = 0; + pEdcaParm->Aifsn[QID_AC_VI] = 2; + pEdcaParm->Cwmin[QID_AC_VI] = CW_MIN_IN_BITS-1; + pEdcaParm->Cwmax[QID_AC_VI] = CW_MAX_IN_BITS; + pEdcaParm->Txop[QID_AC_VI] = 96; // AC_VI: 96*32us ~= 3ms + + pEdcaParm->bACM[QID_AC_VO] = 0; + pEdcaParm->Aifsn[QID_AC_VO] = 2; + pEdcaParm->Cwmin[QID_AC_VO] = CW_MIN_IN_BITS-2; + pEdcaParm->Cwmax[QID_AC_VO] = CW_MAX_IN_BITS-1; + pEdcaParm->Txop[QID_AC_VO] = 48; // AC_VO: 48*32us ~= 1.5ms + } + else if (NdisEqualMemory(pEid->Octet, WPS_OUI, 4)) + { + // Copy to pVIE which will report to bssid list. + Ptr = (PUCHAR) pVIE; + NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2); + *LengthVIE += (pEid->Len + 2); + } + + break; + + case IE_EXT_SUPP_RATES: + if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) + { + NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len); + *pExtRateLen = pEid->Len; + + // TODO: 2004-09-14 not a good design here, cause it exclude extra rates + // from ScanTab. We should report as is. And filter out unsupported + // rates in MlmeAux. + // Check against the supported rates + // RTMPCheckRates(pAd, ExtRate, pExtRateLen); + } + break; + + case IE_ERP: + if (pEid->Len == 1) + { + *pErp = (UCHAR)pEid->Octet[0]; + } + break; + + case IE_AIRONET_CKIP: + // 0. Check Aironet IE length, it must be larger or equal to 28 + // Cisco AP350 used length as 28 + // Cisco AP12XX used length as 30 + if (pEid->Len < (CKIP_NEGOTIATION_LENGTH - 2)) + break; + + // 1. Copy CKIP flag byte to buffer for process + *pCkipFlag = *(pEid->Octet + 8); + break; + + case IE_AP_TX_POWER: + // AP Control of Client Transmit Power + //0. Check Aironet IE length, it must be 6 + if (pEid->Len != 0x06) + break; + + // Get cell power limit in dBm + if (NdisEqualMemory(pEid->Octet, CISCO_OUI, 3) == 1) + *pAironetCellPowerLimit = *(pEid->Octet + 4); + break; + + // WPA2 & 802.11i RSN + case IE_RSN: + // There is no OUI for version anymore, check the group cipher OUI before copying + if (RTMPEqualMemory(pEid->Octet + 2, RSN_OUI, 3)) + { + // Copy to pVIE which will report to microsoft bssid list. + Ptr = (PUCHAR) pVIE; + NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2); + *LengthVIE += (pEid->Len + 2); + } + break; + +#ifdef CONFIG_STA_SUPPORT +#if defined (EXT_BUILD_CHANNEL_LIST) || defined (RT_CFG80211_SUPPORT) + case IE_COUNTRY: + Ptr = (PUCHAR) pVIE; + NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2); + *LengthVIE += (pEid->Len + 2); + break; +#endif // EXT_BUILD_CHANNEL_LIST // +#endif // CONFIG_STA_SUPPORT // + + case IE_QBSS_LOAD: + if (pEid->Len == 5) + { + pQbssLoad->bValid = TRUE; + pQbssLoad->StaNum = pEid->Octet[0] + pEid->Octet[1] * 256; + pQbssLoad->ChannelUtilization = pEid->Octet[2]; + pQbssLoad->RemainingAdmissionControl = pEid->Octet[3] + pEid->Octet[4] * 256; + + // Copy to pVIE + Ptr = (PUCHAR) pVIE; + NdisMoveMemory(Ptr + *LengthVIE, &pEid->Eid, pEid->Len + 2); + *LengthVIE += (pEid->Len + 2); + } + break; + + + + case IE_EXT_CAPABILITY: + if (pEid->Len >= 1) + { + NdisMoveMemory(pExtCapInfo,&pEid->Octet[0], sizeof(EXT_CAP_INFO_ELEMENT) /*4*/); +#ifdef RELEASE_EXCLUDE + DBGPRINT(RT_DEBUG_INFO, ("PeerBeaconAndProbeRspSanity - IE_EXT_CAPABILITY(%d)!\n", pEid->Len)); +#endif // RELEASE_EXCLUDE // + break; + } + + default: + break; + } + + Length = Length + 2 + pEid->Len; // Eid[1] + Len[1]+ content[Len] + pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); + } + + // For some 11a AP. it did not have the channel EID, patch here +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + UCHAR LatchRfChannel = MsgChannel; + if ((pAd->LatchRfRegs.Channel > 14) && ((Sanity & 0x4) == 0)) + { + if (CtrlChannel != 0) + *pChannel = CtrlChannel; + else + *pChannel = LatchRfChannel; + Sanity |= 0x4; + } + } +#endif // CONFIG_STA_SUPPORT // + + if (Sanity != 0x7) + { + DBGPRINT(RT_DEBUG_LOUD, ("PeerBeaconAndProbeRspSanity - missing field, Sanity=0x%02x\n", Sanity)); + return FALSE; + } + else + { + return TRUE; + } + +} + +#ifdef DOT11N_DRAFT3 +/* + ========================================================================== + Description: + MLME message sanity check for some IE addressed in 802.11n d3.03. + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN PeerBeaconAndProbeRspSanity2( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + IN OVERLAP_BSS_SCAN_IE *BssScan, + OUT UCHAR *RegClass) +{ + CHAR *Ptr; + PFRAME_802_11 pFrame; + PEID_STRUCT pEid; + ULONG Length = 0; + BOOLEAN brc; + + pFrame = (PFRAME_802_11)Msg; + + *RegClass = 0; + Ptr = pFrame->Octet; + Length += LENGTH_802_11; + + // get timestamp from payload and advance the pointer + Ptr += TIMESTAMP_LEN; + Length += TIMESTAMP_LEN; + + // get beacon interval from payload and advance the pointer + Ptr += 2; + Length += 2; + + // get capability info from payload and advance the pointer + Ptr += 2; + Length += 2; + + pEid = (PEID_STRUCT) Ptr; + brc = FALSE; + + RTMPZeroMemory(BssScan, sizeof(OVERLAP_BSS_SCAN_IE)); + // get variable fields from payload and advance the pointer + while ((Length + 2 + pEid->Len) <= MsgLen) + { + switch(pEid->Eid) + { + case IE_SUPP_REG_CLASS: + if(pEid->Len > 0) + { + *RegClass = *pEid->Octet; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_SUPP_REG_CLASS (len=%d)\n",pEid->Len)); + } + break; + case IE_OVERLAPBSS_SCAN_PARM: + if (pEid->Len == sizeof(OVERLAP_BSS_SCAN_IE)) + { + brc = TRUE; + RTMPMoveMemory(BssScan, pEid->Octet, sizeof(OVERLAP_BSS_SCAN_IE)); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - wrong IE_OVERLAPBSS_SCAN_PARM (len=%d)\n",pEid->Len)); + } + break; + + case IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT: + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAndProbeRspSanity - IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT\n")); + break; + + } + + Length = Length + 2 + pEid->Len; // Eid[1] + Len[1]+ content[Len] + pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); + } + + return brc; + +} +#endif // DOT11N_DRAFT3 // + +#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== + */ +BOOLEAN MlmeScanReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT UCHAR *pBssType, + OUT CHAR Ssid[], + OUT UCHAR *pSsidLen, + OUT UCHAR *pScanType) +{ + MLME_SCAN_REQ_STRUCT *Info; + + Info = (MLME_SCAN_REQ_STRUCT *)(Msg); + *pBssType = Info->BssType; + *pSsidLen = Info->SsidLen; + NdisMoveMemory(Ssid, Info->Ssid, *pSsidLen); + *pScanType = Info->ScanType; + + if ((*pBssType == BSS_INFRA || *pBssType == BSS_ADHOC || *pBssType == BSS_ANY) + && (*pScanType == SCAN_ACTIVE || *pScanType == SCAN_PASSIVE +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + || (*pScanType == SCAN_2040_BSS_COEXIST) +#endif //DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + )) + { + return TRUE; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("MlmeScanReqSanity fail - wrong BssType or ScanType\n")); + return FALSE; + } +} +#endif + +// IRQL = DISPATCH_LEVEL +UCHAR ChannelSanity( + IN PRTMP_ADAPTER pAd, + IN UCHAR channel) +{ + int i; + + for (i = 0; i < pAd->ChannelListNum; i ++) + { + if (channel == pAd->ChannelList[i].Channel) + return 1; + } + return 0; +} + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN PeerDeauthSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr1, + OUT PUCHAR pAddr2, + OUT PUCHAR pAddr3, + OUT USHORT *pReason) +{ + PFRAME_802_11 pFrame = (PFRAME_802_11)Msg; + + COPY_MAC_ADDR(pAddr1, pFrame->Hdr.Addr1); + COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2); + COPY_MAC_ADDR(pAddr3, pFrame->Hdr.Addr3); + NdisMoveMemory(pReason, &pFrame->Octet[0], 2); + + return TRUE; +} + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN PeerAuthSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr, + OUT USHORT *pAlg, + OUT USHORT *pSeq, + OUT USHORT *pStatus, + CHAR *pChlgText) +{ + PFRAME_802_11 pFrame = (PFRAME_802_11)Msg; + + COPY_MAC_ADDR(pAddr, pFrame->Hdr.Addr2); + NdisMoveMemory(pAlg, &pFrame->Octet[0], 2); + NdisMoveMemory(pSeq, &pFrame->Octet[2], 2); + NdisMoveMemory(pStatus, &pFrame->Octet[4], 2); + + if (*pAlg == AUTH_MODE_OPEN) + { + if (*pSeq == 1 || *pSeq == 2) + { + return TRUE; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerAuthSanity fail - wrong Seg#\n")); + return FALSE; + } + } + else if (*pAlg == AUTH_MODE_KEY) + { + if (*pSeq == 1 || *pSeq == 4) + { + return TRUE; + } + else if (*pSeq == 2 || *pSeq == 3) + { + NdisMoveMemory(pChlgText, &pFrame->Octet[8], CIPHER_TEXT_LEN); + return TRUE; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerAuthSanity fail - wrong Seg#\n")); + return FALSE; + } + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerAuthSanity fail - wrong algorithm\n")); + return FALSE; + } +} + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== + */ +BOOLEAN MlmeAuthReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr, + OUT ULONG *pTimeout, + OUT USHORT *pAlg) +{ + MLME_AUTH_REQ_STRUCT *pInfo; + + pInfo = (MLME_AUTH_REQ_STRUCT *)Msg; + COPY_MAC_ADDR(pAddr, pInfo->Addr); + *pTimeout = pInfo->Timeout; + *pAlg = pInfo->Alg; + + if (((*pAlg == AUTH_MODE_KEY) ||(*pAlg == AUTH_MODE_OPEN) + ) && + ((*pAddr & 0x01) == 0)) + { + return TRUE; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("MlmeAuthReqSanity fail - wrong algorithm\n")); + return FALSE; + } +} + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN MlmeAssocReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pApAddr, + OUT USHORT *pCapabilityInfo, + OUT ULONG *pTimeout, + OUT USHORT *pListenIntv) +{ + MLME_ASSOC_REQ_STRUCT *pInfo; + + pInfo = (MLME_ASSOC_REQ_STRUCT *)Msg; + *pTimeout = pInfo->Timeout; // timeout + COPY_MAC_ADDR(pApAddr, pInfo->Addr); // AP address + *pCapabilityInfo = pInfo->CapabilityInfo; // capability info + *pListenIntv = pInfo->ListenIntv; + + return TRUE; +} + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN PeerDisassocSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT USHORT *pReason) +{ + PFRAME_802_11 pFrame = (PFRAME_802_11)Msg; + + COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2); + NdisMoveMemory(pReason, &pFrame->Octet[0], 2); + + return TRUE; +} + +/* + ======================================================================== + Routine Description: + Sanity check NetworkType (11b, 11g or 11a) + + Arguments: + pBss - Pointer to BSS table. + + Return Value: + Ndis802_11DS .......(11b) + Ndis802_11OFDM24....(11g) + Ndis802_11OFDM5.....(11a) + + IRQL = DISPATCH_LEVEL + + ======================================================================== +*/ +NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity( + IN PBSS_ENTRY pBss) +{ + NDIS_802_11_NETWORK_TYPE NetWorkType; + UCHAR rate, i; + + NetWorkType = Ndis802_11DS; + + if (pBss->Channel <= 14) + { + // + // First check support Rate. + // + for (i = 0; i < pBss->SupRateLen; i++) + { + rate = pBss->SupRate[i] & 0x7f; // Mask out basic rate set bit + if ((rate == 2) || (rate == 4) || (rate == 11) || (rate == 22)) + { + continue; + } + else + { + // + // Otherwise (even rate > 108) means Ndis802_11OFDM24 + // + NetWorkType = Ndis802_11OFDM24; + break; + } + } + + // + // Second check Extend Rate. + // + if (NetWorkType != Ndis802_11OFDM24) + { + for (i = 0; i < pBss->ExtRateLen; i++) + { + rate = pBss->SupRate[i] & 0x7f; // Mask out basic rate set bit + if ((rate == 2) || (rate == 4) || (rate == 11) || (rate == 22)) + { + continue; + } + else + { + // + // Otherwise (even rate > 108) means Ndis802_11OFDM24 + // + NetWorkType = Ndis802_11OFDM24; + break; + } + } + } + } + else + { + NetWorkType = Ndis802_11OFDM5; + } + + if (pBss->HtCapabilityLen != 0) + { + if (NetWorkType == Ndis802_11OFDM5) + NetWorkType = Ndis802_11OFDM5_N; + else + NetWorkType = Ndis802_11OFDM24_N; + } + + return NetWorkType; +} + +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT +BOOLEAN MlmeDlsReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PRT_802_11_DLS *pDLS, + OUT PUSHORT pReason) +{ + MLME_DLS_REQ_STRUCT *pInfo; + + pInfo = (MLME_DLS_REQ_STRUCT *)Msg; + + *pDLS = pInfo->pDLS; + *pReason = pInfo->Reason; + + return TRUE; +} +#endif // QOS_DLS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +#ifdef QOS_DLS_SUPPORT +BOOLEAN PeerDlsReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pDA, + OUT PUCHAR pSA, + OUT USHORT *pCapabilityInfo, + OUT USHORT *pDlsTimeout, + OUT UCHAR *pRatesLen, + OUT UCHAR Rates[], + OUT UCHAR *pHtCapabilityLen, + OUT HT_CAPABILITY_IE *pHtCapability) +{ + CHAR *Ptr; + PFRAME_802_11 Fr = (PFRAME_802_11)Msg; + PEID_STRUCT eid_ptr; + + // to prevent caller from using garbage output value + *pCapabilityInfo = 0; + *pDlsTimeout = 0; + *pHtCapabilityLen = 0; + + Ptr = (PCHAR)Fr->Octet; + + // offset to destination MAC address (Category and Action field) + Ptr += 2; + + // get DA from payload and advance the pointer + NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN); + Ptr += MAC_ADDR_LEN; + + // get SA from payload and advance the pointer + NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN); + Ptr += MAC_ADDR_LEN; + + // get capability info from payload and advance the pointer + NdisMoveMemory(pCapabilityInfo, Ptr, 2); + Ptr += 2; + + // get capability info from payload and advance the pointer + NdisMoveMemory(pDlsTimeout, Ptr, 2); + Ptr += 2; + + // Category and Action field + DA + SA + capability + Timeout + eid_ptr = (PEID_STRUCT) &Fr->Octet[18]; + + while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((UCHAR*)Fr + MsgLen)) + { + switch(eid_ptr->Eid) + { + case IE_SUPP_RATES: + if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) && (eid_ptr->Len > 0)) + { + NdisMoveMemory(Rates, eid_ptr->Octet, eid_ptr->Len); + DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsReqSanity - IE_SUPP_RATES., Len=%d. Rates[0]=%x\n",eid_ptr->Len, Rates[0])); + DBGPRINT(RT_DEBUG_TRACE, ("Rates[1]=%x %x %x %x %x %x %x\n", Rates[1], Rates[2], Rates[3], Rates[4], Rates[5], Rates[6], Rates[7])); + *pRatesLen = eid_ptr->Len; + } + else + { + *pRatesLen = 8; + Rates[0] = 0x82; + Rates[1] = 0x84; + Rates[2] = 0x8b; + Rates[3] = 0x96; + Rates[4] = 0x12; + Rates[5] = 0x24; + Rates[6] = 0x48; + Rates[7] = 0x6c; + DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsReqSanity - wrong IE_SUPP_RATES., Len=%d\n",eid_ptr->Len)); + } + break; + + case IE_EXT_SUPP_RATES: + if (eid_ptr->Len + *pRatesLen <= MAX_LEN_OF_SUPPORTED_RATES) + { + NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, eid_ptr->Len); + *pRatesLen = (*pRatesLen) + eid_ptr->Len; + } + else + { + NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, MAX_LEN_OF_SUPPORTED_RATES - (*pRatesLen)); + *pRatesLen = MAX_LEN_OF_SUPPORTED_RATES; + } + break; + + case IE_HT_CAP: + if (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE)) + { + NdisMoveMemory(pHtCapability, eid_ptr->Octet, sizeof(HT_CAPABILITY_IE)); + + *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo)); +#ifdef UNALIGNMENT_SUPPORT + { + EXT_HT_CAP_INFO extHtCapInfo; + + NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); + NdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + } +#else + *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo)); +#endif // UNALIGNMENT_SUPPORT // + *pHtCapabilityLen = sizeof(HT_CAPABILITY_IE); + + DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsReqSanity - IE_HT_CAP\n")); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsReqSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\n", eid_ptr->Len)); + } + break; + + default: + break; + } + + eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len); + } + + return TRUE; +} + +BOOLEAN PeerDlsRspSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pDA, + OUT PUCHAR pSA, + OUT USHORT *pCapabilityInfo, + OUT USHORT *pStatus, + OUT UCHAR *pRatesLen, + OUT UCHAR Rates[], + OUT UCHAR *pHtCapabilityLen, + OUT HT_CAPABILITY_IE *pHtCapability) +{ + CHAR *Ptr; + PFRAME_802_11 Fr = (PFRAME_802_11)Msg; + PEID_STRUCT eid_ptr; + + // to prevent caller from using garbage output value + *pStatus = 0; + *pCapabilityInfo = 0; + *pHtCapabilityLen = 0; + + Ptr = (PCHAR)Fr->Octet; + + // offset to destination MAC address (Category and Action field) + Ptr += 2; + + // get status code from payload and advance the pointer + NdisMoveMemory(pStatus, Ptr, 2); + Ptr += 2; + + // get DA from payload and advance the pointer + NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN); + Ptr += MAC_ADDR_LEN; + + // get SA from payload and advance the pointer + NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN); + Ptr += MAC_ADDR_LEN; + + if (pStatus == 0) + { + // get capability info from payload and advance the pointer + NdisMoveMemory(pCapabilityInfo, Ptr, 2); + Ptr += 2; + } + + // Category and Action field + status code + DA + SA + capability + eid_ptr = (PEID_STRUCT) &Fr->Octet[18]; + + while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((UCHAR*)Fr + MsgLen)) + { + switch(eid_ptr->Eid) + { + case IE_SUPP_RATES: + if ((eid_ptr->Len <= MAX_LEN_OF_SUPPORTED_RATES) && (eid_ptr->Len > 0)) + { + NdisMoveMemory(Rates, eid_ptr->Octet, eid_ptr->Len); + DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsRspSanity - IE_SUPP_RATES., Len=%d. Rates[0]=%x\n",eid_ptr->Len, Rates[0])); + DBGPRINT(RT_DEBUG_TRACE, ("Rates[1]=%x %x %x %x %x %x %x\n", Rates[1], Rates[2], Rates[3], Rates[4], Rates[5], Rates[6], Rates[7])); + *pRatesLen = eid_ptr->Len; + } + else + { + *pRatesLen = 8; + Rates[0] = 0x82; + Rates[1] = 0x84; + Rates[2] = 0x8b; + Rates[3] = 0x96; + Rates[4] = 0x12; + Rates[5] = 0x24; + Rates[6] = 0x48; + Rates[7] = 0x6c; + DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsRspSanity - wrong IE_SUPP_RATES., Len=%d\n",eid_ptr->Len)); + } + break; + + case IE_EXT_SUPP_RATES: + if (eid_ptr->Len + *pRatesLen <= MAX_LEN_OF_SUPPORTED_RATES) + { + NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, eid_ptr->Len); + *pRatesLen = (*pRatesLen) + eid_ptr->Len; + } + else + { + NdisMoveMemory(&Rates[*pRatesLen], eid_ptr->Octet, MAX_LEN_OF_SUPPORTED_RATES - (*pRatesLen)); + *pRatesLen = MAX_LEN_OF_SUPPORTED_RATES; + } + break; + + case IE_HT_CAP: + if (eid_ptr->Len >= sizeof(HT_CAPABILITY_IE)) + { + NdisMoveMemory(pHtCapability, eid_ptr->Octet, sizeof(HT_CAPABILITY_IE)); + + *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo)); +#ifdef UNALIGNMENT_SUPPORT + { + EXT_HT_CAP_INFO extHtCapInfo; + + NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&pHtCapability->ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); + NdisMoveMemory((PUCHAR)(&pHtCapability->ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + } +#else + *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo)); +#endif // UNALIGNMENT_SUPPORT // + *pHtCapabilityLen = sizeof(HT_CAPABILITY_IE); + + DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsRspSanity - IE_HT_CAP\n")); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerDlsRspSanity - wrong IE_HT_CAP.eid_ptr->Len = %d\n", eid_ptr->Len)); + } + break; + + default: + break; + } + + eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len); + } + + return TRUE; +} + +BOOLEAN PeerDlsTearDownSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pDA, + OUT PUCHAR pSA, + OUT USHORT *pReason) +{ + CHAR *Ptr; + PFRAME_802_11 Fr = (PFRAME_802_11)Msg; + + // to prevent caller from using garbage output value + *pReason = 0; + + Ptr = (PCHAR)Fr->Octet; + + // offset to destination MAC address (Category and Action field) + Ptr += 2; + + // get DA from payload and advance the pointer + NdisMoveMemory(pDA, Ptr, MAC_ADDR_LEN); + Ptr += MAC_ADDR_LEN; + + // get SA from payload and advance the pointer + NdisMoveMemory(pSA, Ptr, MAC_ADDR_LEN); + Ptr += MAC_ADDR_LEN; + + // get reason code from payload and advance the pointer + NdisMoveMemory(pReason, Ptr, 2); + Ptr += 2; + + return TRUE; +} +#endif // QOS_DLS_SUPPORT // + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== + */ +BOOLEAN PeerProbeReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT CHAR Ssid[], + OUT UCHAR *SsidLen, + OUT BOOLEAN *bRssiRequested) +{ + PFRAME_802_11 Fr = (PFRAME_802_11)Msg; + UCHAR *Ptr; + UCHAR eid =0, eid_len = 0, *eid_data; + UINT total_ie_len = 0; + + // to prevent caller from using garbage output value + *SsidLen = 0; + + COPY_MAC_ADDR(pAddr2, &Fr->Hdr.Addr2); + + if (Fr->Octet[0] != IE_SSID || Fr->Octet[1] > MAX_LEN_OF_SSID) + { + DBGPRINT(RT_DEBUG_TRACE, ("APPeerProbeReqSanity fail - wrong SSID IE\n")); + return FALSE; + } + + *SsidLen = Fr->Octet[1]; + NdisMoveMemory(Ssid, &Fr->Octet[2], *SsidLen); + + + Ptr = Fr->Octet; + eid = Ptr[0]; + eid_len = Ptr[1]; + total_ie_len = eid_len + 2; + eid_data = Ptr+2; + + // get variable fields from payload and advance the pointer + while((eid_data + eid_len) <= ((UCHAR*)Fr + MsgLen)) + { + switch(eid) + { + case IE_VENDOR_SPECIFIC: + if (eid_len <= 4) + break; +#ifdef RSSI_FEEDBACK + if (bRssiRequested && NdisEqualMemory(eid_data, RALINK_OUI, 3) && (eid_len == 7)) + { + if (*(eid_data + 3/* skip RALINK_OUI */) & 0x8) + *bRssiRequested = TRUE; + break; + } +#endif // RSSI_FEEDBACK // + + + default: + break; + } + eid = Ptr[total_ie_len]; + eid_len = Ptr[total_ie_len + 1]; + eid_data = Ptr + total_ie_len + 2; + total_ie_len += (eid_len + 2); + } + + return TRUE; +} + + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_sync.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_sync.c new file mode 100644 index 000000000..f67b03b3f --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_sync.c @@ -0,0 +1,841 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_sync.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John Chang 2004-09-01 modified for rt2561/2661 +*/ +#include "rt_config.h" + +// 2.4 Ghz channel plan index in the TxPower arrays. +#define BG_BAND_REGION_0_START 0 // 1,2,3,4,5,6,7,8,9,10,11 +#define BG_BAND_REGION_0_SIZE 11 +#define BG_BAND_REGION_1_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13 +#define BG_BAND_REGION_1_SIZE 13 +#define BG_BAND_REGION_2_START 9 // 10,11 +#define BG_BAND_REGION_2_SIZE 2 +#define BG_BAND_REGION_3_START 9 // 10,11,12,13 +#define BG_BAND_REGION_3_SIZE 4 +#define BG_BAND_REGION_4_START 13 // 14 +#define BG_BAND_REGION_4_SIZE 1 +#define BG_BAND_REGION_5_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13,14 +#define BG_BAND_REGION_5_SIZE 14 +#define BG_BAND_REGION_6_START 2 // 3,4,5,6,7,8,9 +#define BG_BAND_REGION_6_SIZE 7 +#define BG_BAND_REGION_7_START 4 // 5,6,7,8,9,10,11,12,13 +#define BG_BAND_REGION_7_SIZE 9 +#define BG_BAND_REGION_31_START 0 // 1,2,3,4,5,6,7,8,9,10,11,12,13,14 +#define BG_BAND_REGION_31_SIZE 14 + +// 5 Ghz channel plan index in the TxPower arrays. +UCHAR A_BAND_REGION_0_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165}; +UCHAR A_BAND_REGION_1_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}; +UCHAR A_BAND_REGION_2_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64}; +UCHAR A_BAND_REGION_3_CHANNEL_LIST[]={52, 56, 60, 64, 149, 153, 157, 161}; +UCHAR A_BAND_REGION_4_CHANNEL_LIST[]={149, 153, 157, 161, 165}; +UCHAR A_BAND_REGION_5_CHANNEL_LIST[]={149, 153, 157, 161}; +UCHAR A_BAND_REGION_6_CHANNEL_LIST[]={36, 40, 44, 48}; +UCHAR A_BAND_REGION_7_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165, 169, 173}; +UCHAR A_BAND_REGION_8_CHANNEL_LIST[]={52, 56, 60, 64}; +UCHAR A_BAND_REGION_9_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165}; +UCHAR A_BAND_REGION_10_CHANNEL_LIST[]={36, 40, 44, 48, 149, 153, 157, 161, 165}; +UCHAR A_BAND_REGION_11_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161}; +UCHAR A_BAND_REGION_12_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}; +UCHAR A_BAND_REGION_13_CHANNEL_LIST[]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161}; +UCHAR A_BAND_REGION_14_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165}; +UCHAR A_BAND_REGION_15_CHANNEL_LIST[]={149, 153, 157, 161, 165, 169, 173}; +UCHAR A_BAND_REGION_16_CHANNEL_LIST[]={52, 56, 60, 64, 149, 153, 157, 161, 165}; + + +//BaSizeArray follows the 802.11n definition as MaxRxFactor. 2^(13+factor) bytes. When factor =0, it's about Ba buffer size =8. +UCHAR BaSizeArray[4] = {8,16,32,64}; + +/* + ========================================================================== + Description: + Update StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type, + and 3) PHY-mode user selected. + The outcome is used by driver when doing site survey. + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID BuildChannelList( + IN PRTMP_ADAPTER pAd) +{ + UCHAR i, j, index=0, num=0; + PUCHAR pChannelList = NULL; + + NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER)); + + // if not 11a-only mode, channel list starts from 2.4Ghz band + if ((pAd->CommonCfg.PhyMode != PHY_11A) +#ifdef DOT11_N_SUPPORT + && (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11N_5G) +#endif // DOT11_N_SUPPORT // + ) + { + switch (pAd->CommonCfg.CountryRegion & 0x7f) + { + case REGION_0_BG_BAND: // 1 -11 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_0_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_0_SIZE); + index += BG_BAND_REGION_0_SIZE; + break; + case REGION_1_BG_BAND: // 1 - 13 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_1_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_1_SIZE); + index += BG_BAND_REGION_1_SIZE; + break; + case REGION_2_BG_BAND: // 10 - 11 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_2_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_2_SIZE); + index += BG_BAND_REGION_2_SIZE; + break; + case REGION_3_BG_BAND: // 10 - 13 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_3_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_3_SIZE); + index += BG_BAND_REGION_3_SIZE; + break; + case REGION_4_BG_BAND: // 14 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_4_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_4_SIZE); + index += BG_BAND_REGION_4_SIZE; + break; + case REGION_5_BG_BAND: // 1 - 14 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_5_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_5_SIZE); + index += BG_BAND_REGION_5_SIZE; + break; + case REGION_6_BG_BAND: // 3 - 9 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_6_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_6_SIZE); + index += BG_BAND_REGION_6_SIZE; + break; + case REGION_7_BG_BAND: // 5 - 13 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_7_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_7_SIZE); + index += BG_BAND_REGION_7_SIZE; + break; + case REGION_31_BG_BAND: // 1 - 14 + NdisMoveMemory(&pAd->ChannelList[index], &pAd->TxPower[BG_BAND_REGION_31_START], sizeof(CHANNEL_TX_POWER) * BG_BAND_REGION_31_SIZE); + index += BG_BAND_REGION_31_SIZE; + break; + default: // Error. should never happen + break; + } + for (i=0; i<index; i++) + pAd->ChannelList[i].MaxTxPwr = 20; + } + + if ((pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) +#ifdef DOT11_N_SUPPORT + || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) + || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11N_5G) +#endif // DOT11_N_SUPPORT // + ) + { + switch (pAd->CommonCfg.CountryRegionForABand & 0x7f) + { + case REGION_0_A_BAND: + num = sizeof(A_BAND_REGION_0_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_0_CHANNEL_LIST; + break; + case REGION_1_A_BAND: + num = sizeof(A_BAND_REGION_1_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_1_CHANNEL_LIST; + break; + case REGION_2_A_BAND: + num = sizeof(A_BAND_REGION_2_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_2_CHANNEL_LIST; + break; + case REGION_3_A_BAND: + num = sizeof(A_BAND_REGION_3_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_3_CHANNEL_LIST; + break; + case REGION_4_A_BAND: + num = sizeof(A_BAND_REGION_4_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_4_CHANNEL_LIST; + break; + case REGION_5_A_BAND: + num = sizeof(A_BAND_REGION_5_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_5_CHANNEL_LIST; + break; + case REGION_6_A_BAND: + num = sizeof(A_BAND_REGION_6_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_6_CHANNEL_LIST; + break; + case REGION_7_A_BAND: + num = sizeof(A_BAND_REGION_7_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_7_CHANNEL_LIST; + break; + case REGION_8_A_BAND: + num = sizeof(A_BAND_REGION_8_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_8_CHANNEL_LIST; + break; + case REGION_9_A_BAND: + num = sizeof(A_BAND_REGION_9_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_9_CHANNEL_LIST; + break; + case REGION_10_A_BAND: + num = sizeof(A_BAND_REGION_10_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_10_CHANNEL_LIST; + break; + case REGION_11_A_BAND: + num = sizeof(A_BAND_REGION_11_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_11_CHANNEL_LIST; + break; + case REGION_12_A_BAND: + num = sizeof(A_BAND_REGION_12_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_12_CHANNEL_LIST; + break; + case REGION_13_A_BAND: + num = sizeof(A_BAND_REGION_13_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_13_CHANNEL_LIST; + break; + case REGION_14_A_BAND: + num = sizeof(A_BAND_REGION_14_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_14_CHANNEL_LIST; + break; + case REGION_15_A_BAND: + num = sizeof(A_BAND_REGION_15_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_15_CHANNEL_LIST; + break; + case REGION_16_A_BAND: + num = sizeof(A_BAND_REGION_16_CHANNEL_LIST)/sizeof(UCHAR); + pChannelList = A_BAND_REGION_16_CHANNEL_LIST; + break; + default: // Error. should never happen + DBGPRINT(RT_DEBUG_WARN,("countryregion=%d not support", pAd->CommonCfg.CountryRegionForABand)); + break; + } + + if (num != 0) + { + UCHAR RadarCh[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}; + for (i=0; i<num; i++) + { + for (j=0; j<MAX_NUM_OF_CHANNELS; j++) + { + if (pChannelList[i] == pAd->TxPower[j].Channel) + NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER)); + } + for (j=0; j<15; j++) + { + if (pChannelList[i] == RadarCh[j]) + pAd->ChannelList[index+i].DfsReq = TRUE; + } + pAd->ChannelList[index+i].MaxTxPwr = 20; + } + index += num; + } + } + + pAd->ChannelListNum = index; + DBGPRINT(RT_DEBUG_TRACE,("country code=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\n", + pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType, pAd->CommonCfg.PhyMode, pAd->ChannelListNum)); +#ifdef DBG + for (i=0;i<pAd->ChannelListNum;i++) + { + DBGPRINT_RAW(RT_DEBUG_TRACE,("BuildChannel # %d :: Pwr0 = %d, Pwr1 =%d, \n ", pAd->ChannelList[i].Channel, pAd->ChannelList[i].Power, pAd->ChannelList[i].Power2)); + } +#endif +} + +/* + ========================================================================== + Description: + This routine return the first channel number according to the country + code selection and RF IC selection (signal band or dual band). It is called + whenever driver need to start a site survey of all supported channels. + Return: + ch - the first channel number of current country code setting + + IRQL = PASSIVE_LEVEL + + ========================================================================== + */ +UCHAR FirstChannel( + IN PRTMP_ADAPTER pAd) +{ + return pAd->ChannelList[0].Channel; +} + +/* + ========================================================================== + Description: + This routine returns the next channel number. This routine is called + during driver need to start a site survey of all supported channels. + Return: + next_channel - the next channel number valid in current country code setting. + Note: + return 0 if no more next channel + ========================================================================== + */ +UCHAR NextChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR channel) +{ + int i; + UCHAR next_channel = 0; + + for (i = 0; i < (pAd->ChannelListNum - 1); i++) + { + if (channel == pAd->ChannelList[i].Channel) + { +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + // Only scan effected channel if this is a SCAN_2040_BSS_COEXIST + // 2009 PF#2: Nee to handle the second channel of AP fall into affected channel range. + if ((pAd->MlmeAux.ScanType == SCAN_2040_BSS_COEXIST) && (pAd->ChannelList[i+1].Channel >14)) + { + channel = pAd->ChannelList[i+1].Channel; + continue; + } + else +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + { + // Record this channel's idx in ChannelList array. + next_channel = pAd->ChannelList[i+1].Channel; + break; + } + } + + } + return next_channel; +} + +/* + ========================================================================== + Description: + This routine is for Cisco Compatible Extensions 2.X + Spec31. AP Control of Client Transmit Power + Return: + None + Note: + Required by Aironet dBm(mW) + 0dBm(1mW), 1dBm(5mW), 13dBm(20mW), 15dBm(30mW), + 17dBm(50mw), 20dBm(100mW) + + We supported + 3dBm(Lowest), 6dBm(10%), 9dBm(25%), 12dBm(50%), + 14dBm(75%), 15dBm(100%) + + The client station's actual transmit power shall be within +/- 5dB of + the minimum value or next lower value. + ========================================================================== + */ +VOID ChangeToCellPowerLimit( + IN PRTMP_ADAPTER pAd, + IN UCHAR AironetCellPowerLimit) +{ + //valud 0xFF means that hasn't found power limit information + //from the AP's Beacon/Probe response. + if (AironetCellPowerLimit == 0xFF) + return; + + if (AironetCellPowerLimit < 6) //Used Lowest Power Percentage. + pAd->CommonCfg.TxPowerPercentage = 6; + else if (AironetCellPowerLimit < 9) + pAd->CommonCfg.TxPowerPercentage = 10; + else if (AironetCellPowerLimit < 12) + pAd->CommonCfg.TxPowerPercentage = 25; + else if (AironetCellPowerLimit < 14) + pAd->CommonCfg.TxPowerPercentage = 50; + else if (AironetCellPowerLimit < 15) + pAd->CommonCfg.TxPowerPercentage = 75; + else + pAd->CommonCfg.TxPowerPercentage = 100; //else used maximum + + if (pAd->CommonCfg.TxPowerPercentage > pAd->CommonCfg.TxPowerDefault) + pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; + +} + +CHAR ConvertToRssi( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi, + IN UCHAR RssiNumber) +{ + UCHAR RssiOffset, LNAGain; + + // Rssi equals to zero should be an invalid value + if (Rssi == 0) + return -99; + + LNAGain = GET_LNA_GAIN(pAd); + if (pAd->LatchRfRegs.Channel > 14) + { + if (RssiNumber == 0) + RssiOffset = pAd->ARssiOffset0; + else if (RssiNumber == 1) + RssiOffset = pAd->ARssiOffset1; + else + RssiOffset = pAd->ARssiOffset2; + } + else + { + if (RssiNumber == 0) + RssiOffset = pAd->BGRssiOffset0; + else if (RssiNumber == 1) + RssiOffset = pAd->BGRssiOffset1; + else + RssiOffset = pAd->BGRssiOffset2; + } + + return (-12 - RssiOffset - LNAGain - Rssi); +} + +#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) +/* + ========================================================================== + Description: + Scan next channel + ========================================================================== + */ +VOID ScanNextChannel( + IN PRTMP_ADAPTER pAd) +{ + HEADER_802_11 Hdr80211; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + UCHAR SsidLen = 0, ScanType = pAd->MlmeAux.ScanType, BBPValue = 0; +#ifdef CONFIG_STA_SUPPORT + USHORT Status; + PHEADER_802_11 pHdr80211; +#endif // CONFIG_STA_SUPPORT // + UINT ScanTimeIn5gChannel = SHORT_CHANNEL_TIME; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (MONITOR_ON(pAd)) + return; + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef RALINK_ATE + // Nothing to do in ATE mode. + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + + if (pAd->MlmeAux.Channel == 0) + { + if ((pAd->CommonCfg.BBPCurrentBW == BW_40) && + ( +#ifdef CONFIG_STA_SUPPORT + INFRA_ON(pAd) || ADHOC_ON(pAd) || +#endif // CONFIG_STA_SUPPORT // + (0))) + { + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue &= (~0x18); + BBPValue |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",pAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr)); + } + else + { + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to channel %d, Total BSS[%02d]\n",pAd->CommonCfg.Channel, pAd->ScanTab.BssNr)); + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + + /* + If all peer Ad-hoc clients leave, driver would do LinkDown and LinkUp. + In LinkUp, CommonCfg.Ssid would copy SSID from MlmeAux. + To prevent SSID is zero or wrong in Beacon, need to recover MlmeAux.SSID here. + */ + if (ADHOC_ON(pAd)) + { + NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); + pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen; + NdisMoveMemory(pAd->MlmeAux.Ssid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen); + } + + // + // To prevent data lost. + // Send an NULL data with turned PSM bit on to current associated AP before SCAN progress. + // Now, we need to send an NULL data with turned PSM bit off to AP, when scan progress done + // + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd))) + { + NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); + if (NStatus == NDIS_STATUS_SUCCESS) + { + pHdr80211 = (PHEADER_802_11) pOutBuffer; + MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->CommonCfg.Bssid, pAd->CommonCfg.Bssid); + pHdr80211->Duration = 0; + pHdr80211->FC.Type = BTYPE_DATA; + pHdr80211->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE); + + // Send using priority queue + MiniportMMRequest(pAd, 0, pOutBuffer, sizeof(HEADER_802_11)); + DBGPRINT(RT_DEBUG_TRACE, ("MlmeScanReqAction -- Send PSM Data frame\n")); + MlmeFreeMemory(pAd, pOutBuffer); + RTMPusecDelay(5000); + } + } + + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_SUCCESS; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0); + + RTMPSendWirelessEvent(pAd, IW_SCAN_COMPLETED_EVENT_FLAG, NULL, BSS0, 0); + +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + RTEnqueueInternalCmd(pAd, CMDTHREAD_SCAN_END, NULL, 0); +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + } +#endif // CONFIG_STA_SUPPORT // + + + + } + else + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // BBP and RF are not accessible in PS mode, we has to wake them up first + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + AsicForceWakeup(pAd, TRUE); + + // leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON + if (pAd->StaCfg.Psm == PWR_SAVE) + { + RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE); + } + } +#endif // CONFIG_STA_SUPPORT // + + AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, TRUE); + AsicLockChannel(pAd, pAd->MlmeAux.Channel); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (pAd->MlmeAux.Channel > 14) + { + if ((pAd->CommonCfg.bIEEE80211H == 1) && RadarChannelCheck(pAd, pAd->MlmeAux.Channel)) + { + ScanType = SCAN_PASSIVE; + ScanTimeIn5gChannel = MIN_CHANNEL_TIME; + } + } + +#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier + // carrier detection + if (pAd->CommonCfg.CarrierDetect.Enable == TRUE) + { + ScanType = SCAN_PASSIVE; + ScanTimeIn5gChannel = MIN_CHANNEL_TIME; + } +#endif // CARRIER_DETECTION_SUPPORT // + } + +#endif // CONFIG_STA_SUPPORT // + + //Global country domain(ch1-11:active scan, ch12-14 passive scan) + if (((pAd->MlmeAux.Channel <= 14) && + (pAd->MlmeAux.Channel >= 12) && + ((pAd->CommonCfg.CountryRegion & 0x7f) == REGION_31_BG_BAND)) || + (CHAN_PropertyCheck(pAd, pAd->MlmeAux.Channel, CHANNEL_PASSIVE_SCAN) == TRUE)) + { + ScanType = SCAN_PASSIVE; + } + + // We need to shorten active scan time in order for WZC connect issue + // Chnage the channel scan time for CISCO stuff based on its IAPP announcement + if (ScanType == FAST_SCAN_ACTIVE) + RTMPSetTimer(&pAd->MlmeAux.ScanTimer, FAST_ACTIVE_SCAN_TIME); + else // must be SCAN_PASSIVE or SCAN_ACTIVE + { + if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) +#ifdef DOT11_N_SUPPORT + || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) +#endif // DOT11_N_SUPPORT // + ) + { + if (pAd->MlmeAux.Channel > 14) + RTMPSetTimer(&pAd->MlmeAux.ScanTimer, ScanTimeIn5gChannel); + else + RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MIN_CHANNEL_TIME); + } + else + RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MAX_CHANNEL_TIME); + } + + if ((ScanType == SCAN_ACTIVE) + || (ScanType == FAST_SCAN_ACTIVE) +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + || (ScanType == SCAN_2040_BSS_COEXIST) +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + ) + { + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - ScanNextChannel() allocate memory fail\n")); +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_FAIL_NO_RESOURCE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0); + } +#endif // CONFIG_STA_SUPPORT // + + return; + } + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + if (ScanType == SCAN_2040_BSS_COEXIST) + { + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - SCAN_2040_BSS_COEXIST !! Prepare to send Probe Request\n")); + } +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + + // There is no need to send broadcast probe request if active scan is in effect. + if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE) + ) + SsidLen = pAd->MlmeAux.SsidLen; + else + SsidLen = 0; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR); +#endif // CONFIG_STA_SUPPORT // + + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &Hdr80211, + 1, &SsidIe, + 1, &SsidLen, + SsidLen, pAd->MlmeAux.Ssid, + 1, &SupRateIe, + 1, &pAd->CommonCfg.SupRateLen, + pAd->CommonCfg.SupRateLen, pAd->CommonCfg.SupRate, + END_OF_ARGS); + + if (pAd->CommonCfg.ExtRateLen) + { + ULONG Tmp; + MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp, + 1, &ExtRateIe, + 1, &pAd->CommonCfg.ExtRateLen, + pAd->CommonCfg.ExtRateLen, pAd->CommonCfg.ExtRate, + END_OF_ARGS); + FrameLen += Tmp; + } + +#ifdef DOT11_N_SUPPORT + if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) + { + ULONG Tmp; + UCHAR HtLen; + UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; +#ifdef RT_BIG_ENDIAN + HT_CAPABILITY_IE HtCapabilityTmp; +#endif + if (pAd->bBroadComHT == TRUE) + { + HtLen = pAd->MlmeAux.HtCapabilityLen + 4; +#ifdef RT_BIG_ENDIAN + NdisMoveMemory(&HtCapabilityTmp, &pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); + *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); +#ifdef UNALIGNMENT_SUPPORT + { + EXT_HT_CAP_INFO extHtCapInfo; + + NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); + NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + } +#else + *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); +#endif // UNALIGNMENT_SUPPORT // + + MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp, + 1, &WpaIe, + 1, &HtLen, + 4, &BROADCOM[0], + pAd->MlmeAux.HtCapabilityLen, &HtCapabilityTmp, + END_OF_ARGS); +#else + MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp, + 1, &WpaIe, + 1, &HtLen, + 4, &BROADCOM[0], + pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability, + END_OF_ARGS); +#endif // RT_BIG_ENDIAN // + } + else + { + HtLen = pAd->MlmeAux.HtCapabilityLen; +#ifdef RT_BIG_ENDIAN + NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, SIZE_HT_CAP_IE); + *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); +#ifdef UNALIGNMENT_SUPPORT + { + EXT_HT_CAP_INFO extHtCapInfo; + + NdisMoveMemory((PUCHAR)(&extHtCapInfo), (PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + *(USHORT *)(&extHtCapInfo) = cpu2le16(*(USHORT *)(&extHtCapInfo)); + NdisMoveMemory((PUCHAR)(&HtCapabilityTmp.ExtHtCapInfo), (PUCHAR)(&extHtCapInfo), sizeof(EXT_HT_CAP_INFO)); + } +#else + *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = cpu2le16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); +#endif // UNALIGNMENT_SUPPORT // + + MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp, + 1, &HtCapIe, + 1, &HtLen, + HtLen, &HtCapabilityTmp, + END_OF_ARGS); +#else + MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp, + 1, &HtCapIe, + 1, &HtLen, + HtLen, &pAd->CommonCfg.HtCapability, + END_OF_ARGS); +#endif // RT_BIG_ENDIAN // + } + FrameLen += Tmp; + +#ifdef DOT11N_DRAFT3 + if ((pAd->MlmeAux.Channel <= 14) && (pAd->CommonCfg.bBssCoexEnable == TRUE)) + { + ULONG Tmp; + HtLen = 1; + MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp, + 1, &ExtHtCapIe, + 1, &HtLen, + 1, &pAd->CommonCfg.BSSCoexist2040.word, + END_OF_ARGS); + + FrameLen += Tmp; + } +#endif // DOT11N_DRAFT3 // + } +#endif // DOT11_N_SUPPORT // + + +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && + (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) && + (pAd->StaCfg.WpsProbeReqIeLen != 0)) + { + ULONG WpsTmpLen = 0; + + MakeOutgoingFrame(pOutBuffer + FrameLen, &WpsTmpLen, + pAd->StaCfg.WpsProbeReqIeLen, pAd->StaCfg.pWpsProbeReqIe, + END_OF_ARGS); + + FrameLen += WpsTmpLen; + } +#endif // WPA_SUPPLICANT_SUPPORT // + + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // + // To prevent data lost. + // Send an NULL data with turned PSM bit on to current associated AP when SCAN in the channel where + // associated AP located. + // + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && + (INFRA_ON(pAd)) && + (pAd->CommonCfg.Channel == pAd->MlmeAux.Channel)) + { + NdisZeroMemory(pOutBuffer, MGMT_DMA_BUFFER_SIZE); + pHdr80211 = (PHEADER_802_11) pOutBuffer; + MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->CommonCfg.Bssid, pAd->CommonCfg.Bssid); + pHdr80211->Duration = 0; + pHdr80211->FC.Type = BTYPE_DATA; + pHdr80211->FC.PwrMgmt = PWR_ACTIVE; + + // Send using priority queue + MiniportMMRequest(pAd, 0, pOutBuffer, sizeof(HEADER_802_11)); + DBGPRINT(RT_DEBUG_TRACE, ("ScanNextChannel():Send PWA NullData frame to notify the associated AP!\n")); + } + } +#endif // CONFIG_STA_SUPPORT // + + MlmeFreeMemory(pAd, pOutBuffer); + } + + // For SCAN_CISCO_PASSIVE, do nothing and silently wait for beacon or other probe reponse + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + pAd->Mlme.SyncMachine.CurrState = SCAN_LISTEN; +#endif // CONFIG_STA_SUPPORT // + + } +} +#endif + +VOID MgtProbReqMacHeaderInit( + IN PRTMP_ADAPTER pAd, + IN OUT PHEADER_802_11 pHdr80211, + IN UCHAR SubType, + IN UCHAR ToDs, + IN PUCHAR pDA, + IN PUCHAR pBssid) +{ + NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11)); + + pHdr80211->FC.Type = BTYPE_MGMT; + pHdr80211->FC.SubType = SubType; + if (SubType == SUBTYPE_ACK) + pHdr80211->FC.Type = BTYPE_CNTL; + pHdr80211->FC.ToDs = ToDs; + COPY_MAC_ADDR(pHdr80211->Addr1, pDA); + COPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress); + COPY_MAC_ADDR(pHdr80211->Addr3, pBssid); +} + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_tkip.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_tkip.c new file mode 100644 index 000000000..9561d75b8 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_tkip.c @@ -0,0 +1,1015 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + cmm_tkip.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Paul Wu 02-25-02 Initial +*/ + +#include "rt_config.h" + +// Rotation functions on 32 bit values +#define ROL32( A, n ) \ + ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) +#define ROR32( A, n ) ROL32( (A), 32-(n) ) + +UINT Tkip_Sbox_Lower[256] = +{ + 0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54, + 0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A, + 0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B, + 0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B, + 0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F, + 0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F, + 0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5, + 0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F, + 0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB, + 0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97, + 0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED, + 0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A, + 0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94, + 0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3, + 0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04, + 0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D, + 0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39, + 0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95, + 0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83, + 0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76, + 0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4, + 0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B, + 0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0, + 0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18, + 0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51, + 0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85, + 0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12, + 0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9, + 0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7, + 0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A, + 0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8, + 0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A +}; + +UINT Tkip_Sbox_Upper[256] = +{ + 0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91, + 0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC, + 0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB, + 0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B, + 0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83, + 0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A, + 0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F, + 0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA, + 0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B, + 0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13, + 0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6, + 0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85, + 0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11, + 0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B, + 0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1, + 0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF, + 0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E, + 0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6, + 0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B, + 0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD, + 0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8, + 0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2, + 0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49, + 0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10, + 0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97, + 0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F, + 0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C, + 0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27, + 0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33, + 0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5, + 0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0, + 0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C +}; + +// +// Expanded IV for TKIP function. +// +typedef struct GNU_PACKED _IV_CONTROL_ +{ + union GNU_PACKED + { + struct GNU_PACKED + { + UCHAR rc0; + UCHAR rc1; + UCHAR rc2; + + union GNU_PACKED + { + struct GNU_PACKED + { +#ifdef RT_BIG_ENDIAN + UCHAR KeyID:2; + UCHAR ExtIV:1; + UCHAR Rsvd:5; +#else + UCHAR Rsvd:5; + UCHAR ExtIV:1; + UCHAR KeyID:2; +#endif + } field; + UCHAR Byte; + } CONTROL; + } field; + + ULONG word; + } IV16; + + ULONG IV32; +} TKIP_IV, *PTKIP_IV; + + +/* + ======================================================================== + + Routine Description: + Convert from UCHAR[] to ULONG in a portable way + + Arguments: + pMICKey pointer to MIC Key + + Return Value: + None + + Note: + + ======================================================================== +*/ +ULONG RTMPTkipGetUInt32( + IN PUCHAR pMICKey) +{ + ULONG res = 0; + INT i; + + for (i = 0; i < 4; i++) + { + res |= (*pMICKey++) << (8 * i); + } + + return res; +} + +/* + ======================================================================== + + Routine Description: + Convert from ULONG to UCHAR[] in a portable way + + Arguments: + pDst pointer to destination for convert ULONG to UCHAR[] + val the value for convert + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPTkipPutUInt32( + IN OUT PUCHAR pDst, + IN ULONG val) +{ + INT i; + + for(i = 0; i < 4; i++) + { + *pDst++ = (UCHAR) (val & 0xff); + val >>= 8; + } +} + +/* + ======================================================================== + + Routine Description: + Set the MIC Key. + + Arguments: + pAd Pointer to our adapter + pMICKey pointer to MIC Key + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPTkipSetMICKey( + IN PTKIP_KEY_INFO pTkip, + IN PUCHAR pMICKey) +{ + // Set the key + pTkip->K0 = RTMPTkipGetUInt32(pMICKey); + pTkip->K1 = RTMPTkipGetUInt32(pMICKey + 4); + // and reset the message + pTkip->L = pTkip->K0; + pTkip->R = pTkip->K1; + pTkip->nBytesInM = 0; + pTkip->M = 0; +} + +/* + ======================================================================== + + Routine Description: + Calculate the MIC Value. + + Arguments: + pAd Pointer to our adapter + uChar Append this uChar + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPTkipAppendByte( + IN PTKIP_KEY_INFO pTkip, + IN UCHAR uChar) +{ + // Append the byte to our word-sized buffer + pTkip->M |= (uChar << (8* pTkip->nBytesInM)); + pTkip->nBytesInM++; + // Process the word if it is full. + if( pTkip->nBytesInM >= 4 ) + { + pTkip->L ^= pTkip->M; + pTkip->R ^= ROL32( pTkip->L, 17 ); + pTkip->L += pTkip->R; + pTkip->R ^= ((pTkip->L & 0xff00ff00) >> 8) | ((pTkip->L & 0x00ff00ff) << 8); + pTkip->L += pTkip->R; + pTkip->R ^= ROL32( pTkip->L, 3 ); + pTkip->L += pTkip->R; + pTkip->R ^= ROR32( pTkip->L, 2 ); + pTkip->L += pTkip->R; + // Clear the buffer + pTkip->M = 0; + pTkip->nBytesInM = 0; + } +} + +/* + ======================================================================== + + Routine Description: + Calculate the MIC Value. + + Arguments: + pAd Pointer to our adapter + pSrc Pointer to source data for Calculate MIC Value + Len Indicate the length of the source data + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPTkipAppend( + IN PTKIP_KEY_INFO pTkip, + IN PUCHAR pSrc, + IN UINT nBytes) +{ + // This is simple + while(nBytes > 0) + { + RTMPTkipAppendByte(pTkip, *pSrc++); + nBytes--; + } +} + +/* + ======================================================================== + + Routine Description: + Get the MIC Value. + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + the MIC Value is store in pAd->PrivateInfo.MIC + ======================================================================== +*/ +VOID RTMPTkipGetMIC( + IN PTKIP_KEY_INFO pTkip) +{ + // Append the minimum padding + RTMPTkipAppendByte(pTkip, 0x5a ); + RTMPTkipAppendByte(pTkip, 0 ); + RTMPTkipAppendByte(pTkip, 0 ); + RTMPTkipAppendByte(pTkip, 0 ); + RTMPTkipAppendByte(pTkip, 0 ); + // and then zeroes until the length is a multiple of 4 + while( pTkip->nBytesInM != 0 ) + { + RTMPTkipAppendByte(pTkip, 0 ); + } + // The appendByte function has already computed the result. + RTMPTkipPutUInt32(pTkip->MIC, pTkip->L); + RTMPTkipPutUInt32(pTkip->MIC + 4, pTkip->R); +} + +/* + ======================================================================== + + Routine Description: + Init Tkip function. + + Arguments: + pAd Pointer to our adapter + pTKey Pointer to the Temporal Key (TK), TK shall be 128bits. + KeyId TK Key ID + pTA Pointer to transmitter address + pMICKey pointer to MIC Key + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPInitTkipEngine( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pKey, + IN UCHAR KeyId, + IN PUCHAR pTA, + IN PUCHAR pMICKey, + IN PUCHAR pTSC, + OUT PULONG pIV16, + OUT PULONG pIV32) +{ + TKIP_IV tkipIv; + + // Prepare 8 bytes TKIP encapsulation for MPDU + NdisZeroMemory(&tkipIv, sizeof(TKIP_IV)); + tkipIv.IV16.field.rc0 = *(pTSC + 1); + tkipIv.IV16.field.rc1 = (tkipIv.IV16.field.rc0 | 0x20) & 0x7f; + tkipIv.IV16.field.rc2 = *pTSC; + tkipIv.IV16.field.CONTROL.field.ExtIV = 1; // 0: non-extended IV, 1: an extended IV + tkipIv.IV16.field.CONTROL.field.KeyID = KeyId; +// tkipIv.IV32 = *(PULONG)(pTSC + 2); + NdisMoveMemory(&tkipIv.IV32, (pTSC + 2), 4); // Copy IV + + *pIV16 = tkipIv.IV16.word; + *pIV32 = tkipIv.IV32; +} + +/* + ======================================================================== + + Routine Description: + Init MIC Value calculation function which include set MIC key & + calculate first 16 bytes (DA + SA + priority + 0) + + Arguments: + pAd Pointer to our adapter + pTKey Pointer to the Temporal Key (TK), TK shall be 128bits. + pDA Pointer to DA address + pSA Pointer to SA address + pMICKey pointer to MIC Key + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID RTMPInitMICEngine( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pKey, + IN PUCHAR pDA, + IN PUCHAR pSA, + IN UCHAR UserPriority, + IN PUCHAR pMICKey) +{ + ULONG Priority = UserPriority; + + // Init MIC value calculation + RTMPTkipSetMICKey(&pAd->PrivateInfo.Tx, pMICKey); + // DA + RTMPTkipAppend(&pAd->PrivateInfo.Tx, pDA, MAC_ADDR_LEN); + // SA + RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSA, MAC_ADDR_LEN); + // Priority + 3 bytes of 0 + RTMPTkipAppend(&pAd->PrivateInfo.Tx, (PUCHAR)&Priority, 4); +} + +/* + ======================================================================== + + Routine Description: + Compare MIC value of received MSDU + + Arguments: + pAd Pointer to our adapter + pSrc Pointer to the received Plain text data + pDA Pointer to DA address + pSA Pointer to SA address + pMICKey pointer to MIC Key + Len the length of the received plain text data exclude MIC value + + Return Value: + TRUE MIC value matched + FALSE MIC value mismatched + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +BOOLEAN RTMPTkipCompareMICValue( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pSrc, + IN PUCHAR pDA, + IN PUCHAR pSA, + IN PUCHAR pMICKey, + IN UCHAR UserPriority, + IN UINT Len) +{ + UCHAR OldMic[8]; + ULONG Priority = UserPriority; + + // Init MIC value calculation + RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey); + // DA + RTMPTkipAppend(&pAd->PrivateInfo.Rx, pDA, MAC_ADDR_LEN); + // SA + RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSA, MAC_ADDR_LEN); + // Priority + 3 bytes of 0 + RTMPTkipAppend(&pAd->PrivateInfo.Rx, (PUCHAR)&Priority, 4); + + // Calculate MIC value from plain text data + RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSrc, Len); + + // Get MIC valude from received frame + NdisMoveMemory(OldMic, pSrc + Len, 8); + + // Get MIC value from decrypted plain data + RTMPTkipGetMIC(&pAd->PrivateInfo.Rx); + + // Move MIC value from MSDU, this steps should move to data path. + // Since the MIC value might cross MPDUs. + if(!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8)) + { + DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTMPTkipCompareMICValue(): TKIP MIC Error !\n")); //MIC error. + + + return (FALSE); + } + return (TRUE); +} + +/* + ======================================================================== + + Routine Description: + Compare MIC value of received MSDU + + Arguments: + pAd Pointer to our adapter + pLLC LLC header + pSrc Pointer to the received Plain text data + pDA Pointer to DA address + pSA Pointer to SA address + pMICKey pointer to MIC Key + Len the length of the received plain text data exclude MIC value + + Return Value: + TRUE MIC value matched + FALSE MIC value mismatched + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +BOOLEAN RTMPTkipCompareMICValueWithLLC( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pLLC, + IN PUCHAR pSrc, + IN PUCHAR pDA, + IN PUCHAR pSA, + IN PUCHAR pMICKey, + IN UINT Len) +{ + UCHAR OldMic[8]; + ULONG Priority = 0; + + // Init MIC value calculation + RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey); + // DA + RTMPTkipAppend(&pAd->PrivateInfo.Rx, pDA, MAC_ADDR_LEN); + // SA + RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSA, MAC_ADDR_LEN); + // Priority + 3 bytes of 0 + RTMPTkipAppend(&pAd->PrivateInfo.Rx, (PUCHAR)&Priority, 4); + + // Start with LLC header + RTMPTkipAppend(&pAd->PrivateInfo.Rx, pLLC, 8); + + // Calculate MIC value from plain text data + RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSrc, Len); + + // Get MIC valude from received frame + NdisMoveMemory(OldMic, pSrc + Len, 8); + + // Get MIC value from decrypted plain data + RTMPTkipGetMIC(&pAd->PrivateInfo.Rx); + + // Move MIC value from MSDU, this steps should move to data path. + // Since the MIC value might cross MPDUs. + if(!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8)) + { + DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTMPTkipCompareMICValueWithLLC(): TKIP MIC Error !\n")); //MIC error. + + + return (FALSE); + } + return (TRUE); +} +/* + ======================================================================== + + Routine Description: + Copy frame from waiting queue into relative ring buffer and set + appropriate ASIC register to kick hardware transmit function + + Arguments: + pAd Pointer to our adapter + PNDIS_PACKET Pointer to Ndis Packet for MIC calculation + pEncap Pointer to LLC encap data + LenEncap Total encap length, might be 0 which indicates no encap + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPCalculateMICValue( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PUCHAR pEncap, + IN PCIPHER_KEY pKey, + IN UCHAR apidx) +{ + PACKET_INFO PacketInfo; + PUCHAR pSrcBufVA; + UINT SrcBufLen; + PUCHAR pSrc; + UCHAR UserPriority; + UCHAR vlan_offset = 0; + + RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); + + UserPriority = RTMP_GET_PACKET_UP(pPacket); + pSrc = pSrcBufVA; + + // determine if this is a vlan packet + if (((*(pSrc + 12) << 8) + *(pSrc + 13)) == 0x8100) + vlan_offset = 4; + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + { + RTMPInitMICEngine( + pAd, + pKey->Key, + pSrc, + pSrc + 6, + UserPriority, + pKey->TxMic); + } + + + if (pEncap != NULL) + { + // LLC encapsulation + RTMPTkipAppend(&pAd->PrivateInfo.Tx, pEncap, 6); + // Protocol Type + RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc + 12 + vlan_offset, 2); + } + SrcBufLen -= (14 + vlan_offset); + pSrc += (14 + vlan_offset); + do + { + if (SrcBufLen > 0) + { + RTMPTkipAppend(&pAd->PrivateInfo.Tx, pSrc, SrcBufLen); + } + + break; // No need handle next packet + + } while (TRUE); // End of copying payload + + // Compute the final MIC Value + RTMPTkipGetMIC(&pAd->PrivateInfo.Tx); +} + + +/************************************************************/ +/* tkip_sbox() */ +/* Returns a 16 bit value from a 64K entry table. The Table */ +/* is synthesized from two 256 entry byte wide tables. */ +/************************************************************/ + +UINT tkip_sbox(UINT index) +{ + UINT index_low; + UINT index_high; + UINT left, right; + + index_low = (index % 256); + index_high = ((index >> 8) % 256); + + left = Tkip_Sbox_Lower[index_low] + (Tkip_Sbox_Upper[index_low] * 256); + right = Tkip_Sbox_Upper[index_high] + (Tkip_Sbox_Lower[index_high] * 256); + + return (left ^ right); +} + +UINT rotr1(UINT a) +{ + unsigned int b; + + if ((a & 0x01) == 0x01) + { + b = (a >> 1) | 0x8000; + } + else + { + b = (a >> 1) & 0x7fff; + } + b = b % 65536; + return b; +} + +VOID RTMPTkipMixKey( + UCHAR *key, + UCHAR *ta, + ULONG pnl, /* Least significant 16 bits of PN */ + ULONG pnh, /* Most significant 32 bits of PN */ + UCHAR *rc4key, + UINT *p1k) +{ + + UINT tsc0; + UINT tsc1; + UINT tsc2; + + UINT ppk0; + UINT ppk1; + UINT ppk2; + UINT ppk3; + UINT ppk4; + UINT ppk5; + + INT i; + INT j; + + tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */ + tsc1 = (unsigned int)(pnh % 65536); + tsc2 = (unsigned int)(pnl % 65536); /* lsb */ + + /* Phase 1, step 1 */ + p1k[0] = tsc1; + p1k[1] = tsc0; + p1k[2] = (UINT)(ta[0] + (ta[1]*256)); + p1k[3] = (UINT)(ta[2] + (ta[3]*256)); + p1k[4] = (UINT)(ta[4] + (ta[5]*256)); + + /* Phase 1, step 2 */ + for (i=0; i<8; i++) + { + j = 2*(i & 1); + p1k[0] = (p1k[0] + tkip_sbox( (p1k[4] ^ ((256*key[1+j]) + key[j])) % 65536 )) % 65536; + p1k[1] = (p1k[1] + tkip_sbox( (p1k[0] ^ ((256*key[5+j]) + key[4+j])) % 65536 )) % 65536; + p1k[2] = (p1k[2] + tkip_sbox( (p1k[1] ^ ((256*key[9+j]) + key[8+j])) % 65536 )) % 65536; + p1k[3] = (p1k[3] + tkip_sbox( (p1k[2] ^ ((256*key[13+j]) + key[12+j])) % 65536 )) % 65536; + p1k[4] = (p1k[4] + tkip_sbox( (p1k[3] ^ (((256*key[1+j]) + key[j]))) % 65536 )) % 65536; + p1k[4] = (p1k[4] + i) % 65536; + } + + /* Phase 2, Step 1 */ + ppk0 = p1k[0]; + ppk1 = p1k[1]; + ppk2 = p1k[2]; + ppk3 = p1k[3]; + ppk4 = p1k[4]; + ppk5 = (p1k[4] + tsc2) % 65536; + + /* Phase2, Step 2 */ + ppk0 = ppk0 + tkip_sbox( (ppk5 ^ ((256*key[1]) + key[0])) % 65536); + ppk1 = ppk1 + tkip_sbox( (ppk0 ^ ((256*key[3]) + key[2])) % 65536); + ppk2 = ppk2 + tkip_sbox( (ppk1 ^ ((256*key[5]) + key[4])) % 65536); + ppk3 = ppk3 + tkip_sbox( (ppk2 ^ ((256*key[7]) + key[6])) % 65536); + ppk4 = ppk4 + tkip_sbox( (ppk3 ^ ((256*key[9]) + key[8])) % 65536); + ppk5 = ppk5 + tkip_sbox( (ppk4 ^ ((256*key[11]) + key[10])) % 65536); + + ppk0 = ppk0 + rotr1(ppk5 ^ ((256*key[13]) + key[12])); + ppk1 = ppk1 + rotr1(ppk0 ^ ((256*key[15]) + key[14])); + ppk2 = ppk2 + rotr1(ppk1); + ppk3 = ppk3 + rotr1(ppk2); + ppk4 = ppk4 + rotr1(ppk3); + ppk5 = ppk5 + rotr1(ppk4); + + /* Phase 2, Step 3 */ + /* Phase 2, Step 3 */ + + tsc0 = (unsigned int)((pnh >> 16) % 65536); /* msb */ + tsc1 = (unsigned int)(pnh % 65536); + tsc2 = (unsigned int)(pnl % 65536); /* lsb */ + + rc4key[0] = (tsc2 >> 8) % 256; + rc4key[1] = (((tsc2 >> 8) % 256) | 0x20) & 0x7f; + rc4key[2] = tsc2 % 256; + rc4key[3] = ((ppk5 ^ ((256*key[1]) + key[0])) >> 1) % 256; + + rc4key[4] = ppk0 % 256; + rc4key[5] = (ppk0 >> 8) % 256; + + rc4key[6] = ppk1 % 256; + rc4key[7] = (ppk1 >> 8) % 256; + + rc4key[8] = ppk2 % 256; + rc4key[9] = (ppk2 >> 8) % 256; + + rc4key[10] = ppk3 % 256; + rc4key[11] = (ppk3 >> 8) % 256; + + rc4key[12] = ppk4 % 256; + rc4key[13] = (ppk4 >> 8) % 256; + + rc4key[14] = ppk5 % 256; + rc4key[15] = (ppk5 >> 8) % 256; +} + + +// +// TRUE: Success! +// FALSE: Decrypt Error! +// +// +// TRUE: Success! +// FALSE: Decrypt Error! +// +BOOLEAN RTMPSoftDecryptTKIP( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHdr, + IN UCHAR UserPriority, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + IN UINT16 *DataByteCnt) +{ + PHEADER_802_11 pFrame; + UINT8 frame_type; + UINT8 frame_subtype; + UINT8 from_ds; + UINT8 to_ds; + UINT8 a4_exists; + UINT8 qc_exists; + UCHAR TA[MAC_ADDR_LEN]; + UCHAR DA[MAC_ADDR_LEN]; + UCHAR SA[MAC_ADDR_LEN]; + UCHAR RC4Key[16]; + UINT p1k[5]; //for mix_key; + ULONG pnl;/* Least significant 16 bits of PN */ + ULONG pnh;/* Most significant 32 bits of PN */ + ARC4_CTX_STRUC ARC4_CTX; + PUCHAR plaintext_ptr; + UINT32 plaintext_len; + PUCHAR ciphertext_ptr; + UINT32 ciphertext_len; + UINT crc32 = 0; + UINT trailfcs = 0; + UCHAR MIC[8]; + UCHAR TrailMIC[8]; + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE); +#endif + + if (pKey->KeyLen == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : the key is empty)\n", __FUNCTION__)); + return FALSE; + } + + /* Indicate type and subtype of Frame Control field */ + frame_type = (((*pHdr) >> 2) & 0x03); + frame_subtype = (((*pHdr) >> 4) & 0x0f); + + /* Indicate the fromDS and ToDS */ + from_ds = ((*(pHdr + 1)) & 0x2) >> 1; + to_ds = ((*(pHdr + 1)) & 0x1); + + /* decide if the Address 4 exist or QoS exist */ + a4_exists = (from_ds & to_ds); + qc_exists = ((frame_subtype == SUBTYPE_QDATA) || + (frame_subtype == SUBTYPE_QDATA_CFACK) || + (frame_subtype == SUBTYPE_QDATA_CFPOLL) || + (frame_subtype == SUBTYPE_QDATA_CFACK_CFPOLL)); + + /* pointer to 802.11 header */ + pFrame = (PHEADER_802_11)pHdr; + + /* Assign DA, SA and TA for TKIP calculation */ + if (to_ds == 0 && from_ds == 1) + { + NdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN); + NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); //BSSID + NdisMoveMemory(SA, pFrame->Addr3, MAC_ADDR_LEN); + } + else if (to_ds == 0 && from_ds == 0 ) + { + NdisMoveMemory(DA, pFrame->Addr1, MAC_ADDR_LEN); + NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); + NdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN); + } + else if (to_ds == 1 && from_ds == 0) + { + NdisMoveMemory(SA, pFrame->Addr2, MAC_ADDR_LEN); + NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); + NdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN); + } + else if (to_ds == 1 && from_ds == 1) + { + NdisMoveMemory(TA, pFrame->Addr2, MAC_ADDR_LEN); + NdisMoveMemory(DA, pFrame->Addr3, MAC_ADDR_LEN); + NdisMoveMemory(SA, pFrame->Octet, MAC_ADDR_LEN); + } + + pnl = (*(pData)) << 8 | (*(pData + 2)); + pnh = *((PULONG)(pData + 4)); + pnh = cpu2le32(pnh); + RTMPTkipMixKey(pKey->Key, TA, pnl, pnh, RC4Key, p1k); + + /* skip 8-bytes TKIP IV/EIV header */ + ciphertext_ptr = pData + LEN_TKIP_IV_HDR; + ciphertext_len = *DataByteCnt - LEN_TKIP_IV_HDR; + + /* WEP Decapsulation */ + /* Generate an RC4 key stream */ + ARC4_INIT(&ARC4_CTX, &RC4Key[0], 16); + + /* Decrypt the TKIP MPDU by ARC4. + It shall include plaintext, MIC and ICV. + The result output would overwrite the original TKIP IV/EIV header position */ + ARC4_Compute(&ARC4_CTX, ciphertext_ptr, ciphertext_len, pData); + + /* Point to the decrypted data frame and its length shall exclude ICV length */ + plaintext_ptr = pData; + plaintext_len = ciphertext_len - LEN_ICV; + + /* Extract peer's ICV */ + NdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV); + + /* Re-computes the ICV and + bit-wise compares with the peer's ICV. */ + crc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len); + crc32 ^= 0xffffffff; /* complement */ + + if(crc32 != cpu2le32(trailfcs)) + { + DBGPRINT(RT_DEBUG_ERROR, ("! WEP Data CRC Error !\n")); //CRC error. + return FALSE; + } + + /* Extract peer's MIC and subtract MIC length from total data length */ + plaintext_len -= LEN_TKIP_MIC; + NdisMoveMemory(TrailMIC, plaintext_ptr + plaintext_len, LEN_TKIP_MIC); + RTMPInitMICEngine(pAd, pKey->Key, DA, SA, UserPriority, pKey->RxMic); + RTMPTkipAppend(&pAd->PrivateInfo.Tx, plaintext_ptr, plaintext_len); + RTMPTkipGetMIC(&pAd->PrivateInfo.Tx); + NdisMoveMemory(MIC, pAd->PrivateInfo.Tx.MIC, LEN_TKIP_MIC); + + if (!NdisEqualMemory(MIC, TrailMIC, LEN_TKIP_MIC)) + { + DBGPRINT(RT_DEBUG_ERROR, ("! TKIP MIC Error !\n")); //MIC error. + //RTMPReportMicError(pAd, &pWpaKey[KeyID]); // marked by AlbertY @ 20060630 + return FALSE; + } + + /* Update the total data length */ + *DataByteCnt = plaintext_len; + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, pHdr, DIR_READ, FALSE); +#endif + return TRUE; +} + + +/* + ======================================================================== + + Routine Description: + Use RC4 to protect the Key Data field of EAPoL frame. + It's defined in IEEE 802.11i-2004 p.84 + + Arguments: + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID TKIP_GTK_KEY_WRAP( + IN UCHAR *key, + IN UCHAR *iv, + IN UCHAR *input_text, + IN UINT32 input_len, + OUT UCHAR *output_text) +{ + UCHAR ekey[LEN_KEY_DESC_IV + LEN_PTK_KEK]; + ARC4_CTX_STRUC ARC4_CTX; + + /* The encryption key is generated by concatenating the + EAPOL-Key IV field and the KEK. */ + NdisMoveMemory(ekey, iv, LEN_KEY_DESC_IV); + NdisMoveMemory(&ekey[LEN_KEY_DESC_IV], key, LEN_PTK_KEK); + + /* RC4 stream cipher initialization with the KEK */ + ARC4_INIT(&ARC4_CTX, &ekey[0], LEN_KEY_DESC_IV + LEN_PTK_KEK); + + /* The first 256 octets of the RC4 key stream shall be discarded */ + ARC4_Discard_KeyLength(&ARC4_CTX, 256); + + /* encryption begins using the 257th key stream octet */ + ARC4_Compute(&ARC4_CTX, input_text, input_len, output_text); + +} + +VOID TKIP_GTK_KEY_UNWRAP( + IN UCHAR *key, + IN UCHAR *iv, + IN UCHAR *input_text, + IN UINT32 input_len, + OUT UCHAR *output_text) +{ + TKIP_GTK_KEY_WRAP(key, iv, input_text, input_len, output_text); +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_wep.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_wep.c new file mode 100644 index 000000000..24458e4ef --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_wep.c @@ -0,0 +1,342 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_wep.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Paul Wu 10-28-02 Initial +*/ + +#include "rt_config.h" + +UINT FCSTAB_32[256] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +/* + ======================================================================== + + Routine Description: + Calculate a new FCS given the current FCS and the new data. + + Arguments: + Fcs the original FCS value + Cp pointer to the data which will be calculate the FCS + Len the length of the data + + Return Value: + UINT - FCS 32 bits + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +UINT RTMP_CALC_FCS32( + IN UINT Fcs, + IN PUCHAR Cp, + IN INT Len) +{ + while (Len--) + Fcs = (((Fcs) >> 8) ^ FCSTAB_32[((Fcs) ^ (*Cp++)) & 0xff]); + + return (Fcs); +} + +/* + ======================================================================== + + Routine Description: + Init WEP function. + + Arguments: + pAd Pointer to our adapter + pKey Pointer to the WEP KEY + KeyId WEP Key ID + KeyLen the length of WEP KEY + pDest Pointer to the destination which Encryption data will store in. + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPInitWepEngine( + IN PUCHAR pIv, + IN PUCHAR pKey, + IN UCHAR KeyLen, + OUT ARC4_CTX_STRUC *pARC4_CTX) +{ + UCHAR seed[16]; + UINT8 seed_len; + + /* WEP seed construction */ + NdisZeroMemory(seed, 16); + NdisMoveMemory(seed, pIv, 3); + NdisMoveMemory(&seed[3], pKey, KeyLen); + seed_len = 3 + KeyLen; + + /* RC4 uses a pseudo-random number generator (PRNG) + to generate a key stream */ + ARC4_INIT(pARC4_CTX, &seed[0], seed_len); +} + +/* + ======================================================================== + + Routine Description: + Construct WEP IV header. + + Arguments: + + Return Value: + + Note: + It's a 4-octets header. + + ======================================================================== +*/ +VOID RTMPConstructWEPIVHdr( + IN UINT8 key_idx, + IN UCHAR *pn, + OUT UCHAR *iv_hdr) +{ + NdisZeroMemory(iv_hdr, LEN_WEP_IV_HDR); + + NdisMoveMemory(iv_hdr, pn, LEN_WEP_TSC); + + /* Append key index */ + iv_hdr[3] = (key_idx << 6); +} + +/* + ======================================================================== + + Routine Description: + WEP MPDU cryptographic encapsulation + + Arguments: + pAdapter Pointer to our adapter + pSrc Pointer to the received data + Len the length of the received data + + Return Value: + + Note: + + ======================================================================== +*/ +BOOLEAN RTMPSoftEncryptWEP( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pIvHdr, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + IN ULONG DataByteCnt) +{ + ARC4_CTX_STRUC ARC4_CTX; + UINT FCSCRC32; + + if (pKey->KeyLen == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The key is empty !\n", __FUNCTION__)); + return FALSE; + } + + /* Initialize WEP key stream */ + RTMPInitWepEngine(pIvHdr, + pKey->Key, + pKey->KeyLen, + &ARC4_CTX); + + /* WEP computes the ICV over the plaintext data */ + FCSCRC32 = RTMP_CALC_FCS32(PPPINITFCS32, pData, DataByteCnt); + FCSCRC32 ^= 0xffffffff; /* complement */ + FCSCRC32 = cpu2le32(FCSCRC32); + + /* Append 4-bytes ICV after the MPDU data */ + NdisMoveMemory(pData + DataByteCnt, (PUCHAR)&FCSCRC32, LEN_ICV); + + /* Encrypt the MPDU plaintext data and ICV using ARC4 with a seed */ + ARC4_Compute(&ARC4_CTX, pData, DataByteCnt + LEN_ICV, pData); + + return TRUE; +} + + +/* + ======================================================================== + + Routine Description: + Decrypt received WEP data + + Arguments: + pAdapter Pointer to our adapter + pSrc Pointer to the received data + Len the length of the received data + + Return Value: + TRUE Decrypt WEP data success + FALSE Decrypt WEP data failed + + Note: + + ======================================================================== +*/ +BOOLEAN RTMPSoftDecryptWEP( + IN PRTMP_ADAPTER pAd, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + INOUT UINT16 *DataByteCnt) +{ + ARC4_CTX_STRUC ARC4_CTX; + PUCHAR plaintext_ptr; + UINT16 plaintext_len; + PUCHAR ciphertext_ptr; + UINT16 ciphertext_len; + UINT trailfcs; + UINT crc32; + + if (pKey->KeyLen == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The key is not available !\n", __FUNCTION__)); + return FALSE; + } + + /* Initialize WEP key stream */ + RTMPInitWepEngine(pData, + pKey->Key, + pKey->KeyLen, + &ARC4_CTX); + + /* Skip the WEP IV header (4-bytes) */ + ciphertext_ptr = pData + LEN_WEP_IV_HDR; + ciphertext_len = *DataByteCnt - LEN_WEP_IV_HDR; + + /* Decrypt the WEP MPDU. It shall include plaintext and ICV. + The result output would overwrite the original WEP IV header position */ + ARC4_Compute(&ARC4_CTX, + ciphertext_ptr, + ciphertext_len, + pData); + + /* Point to the decrypted data frame and its length shall exclude ICV length */ + plaintext_ptr = pData; + plaintext_len = ciphertext_len - LEN_ICV; + + /* Extract peer's the ICV */ + NdisMoveMemory(&trailfcs, plaintext_ptr + plaintext_len, LEN_ICV); + + /* WEP recomputes the ICV and + bit-wise compares it with the decrypted ICV from the MPDU. */ + crc32 = RTMP_CALC_FCS32(PPPINITFCS32, plaintext_ptr, plaintext_len); + crc32 ^= 0xffffffff; /* complement */ + + if(crc32 != cpu2le32(trailfcs)) + { + DBGPRINT(RT_DEBUG_ERROR, ("! WEP Data CRC Error !\n")); //CRC error. + return FALSE; + } + + /* Update the total data length */ + *DataByteCnt = plaintext_len; + + return TRUE; +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_wpa.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_wpa.c new file mode 100644 index 000000000..97f150be3 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/cmm_wpa.c @@ -0,0 +1,4081 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + wpa.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Jan Lee 03-07-22 Initial + Paul Lin 03-11-28 Modify for supplicant +*/ +#include "rt_config.h" + +// WPA OUI +UCHAR OUI_WPA[3] = {0x00, 0x50, 0xF2}; +UCHAR OUI_WPA_NONE_AKM[4] = {0x00, 0x50, 0xF2, 0x00}; +UCHAR OUI_WPA_VERSION[4] = {0x00, 0x50, 0xF2, 0x01}; +UCHAR OUI_WPA_WEP40[4] = {0x00, 0x50, 0xF2, 0x01}; +UCHAR OUI_WPA_TKIP[4] = {0x00, 0x50, 0xF2, 0x02}; +UCHAR OUI_WPA_CCMP[4] = {0x00, 0x50, 0xF2, 0x04}; +UCHAR OUI_WPA_WEP104[4] = {0x00, 0x50, 0xF2, 0x05}; +UCHAR OUI_WPA_8021X_AKM[4] = {0x00, 0x50, 0xF2, 0x01}; +UCHAR OUI_WPA_PSK_AKM[4] = {0x00, 0x50, 0xF2, 0x02}; +// WPA2 OUI +UCHAR OUI_WPA2[3] = {0x00, 0x0F, 0xAC}; +UCHAR OUI_WPA2_WEP40[4] = {0x00, 0x0F, 0xAC, 0x01}; +UCHAR OUI_WPA2_TKIP[4] = {0x00, 0x0F, 0xAC, 0x02}; +UCHAR OUI_WPA2_CCMP[4] = {0x00, 0x0F, 0xAC, 0x04}; +UCHAR OUI_WPA2_8021X_AKM[4] = {0x00, 0x0F, 0xAC, 0x01}; +UCHAR OUI_WPA2_PSK_AKM[4] = {0x00, 0x0F, 0xAC, 0x02}; +UCHAR OUI_WPA2_WEP104[4] = {0x00, 0x0F, 0xAC, 0x05}; + + + +static VOID ConstructEapolKeyData( + IN PMAC_TABLE_ENTRY pEntry, + IN UCHAR GroupKeyWepStatus, + IN UCHAR keyDescVer, + IN UCHAR MsgType, + IN UCHAR DefaultKeyIdx, + IN UCHAR *GTK, + IN UCHAR *RSNIE, + IN UCHAR RSNIE_LEN, + OUT PEAPOL_PACKET pMsg); + +static VOID WpaEAPPacketAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +static VOID WpaEAPOLASFAlertAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +static VOID WpaEAPOLLogoffAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +static VOID WpaEAPOLStartAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +static VOID WpaEAPOLKeyAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +/* + ========================================================================== + Description: + association state machine init, including state transition and timer init + Parameters: + S - pointer to the association state machine + ========================================================================== + */ +VOID WpaStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + OUT STATE_MACHINE_FUNC Trans[]) +{ + StateMachineInit(S, (STATE_MACHINE_FUNC *)Trans, MAX_WPA_PTK_STATE, MAX_WPA_MSG, (STATE_MACHINE_FUNC)Drop, WPA_PTK, WPA_MACHINE_BASE); + + StateMachineSetAction(S, WPA_PTK, MT2_EAPPacket, (STATE_MACHINE_FUNC)WpaEAPPacketAction); + StateMachineSetAction(S, WPA_PTK, MT2_EAPOLStart, (STATE_MACHINE_FUNC)WpaEAPOLStartAction); + StateMachineSetAction(S, WPA_PTK, MT2_EAPOLLogoff, (STATE_MACHINE_FUNC)WpaEAPOLLogoffAction); + StateMachineSetAction(S, WPA_PTK, MT2_EAPOLKey, (STATE_MACHINE_FUNC)WpaEAPOLKeyAction); + StateMachineSetAction(S, WPA_PTK, MT2_EAPOLASFAlert, (STATE_MACHINE_FUNC)WpaEAPOLASFAlertAction); +} + +/* + ========================================================================== + Description: + this is state machine function. + When receiving EAP packets which is for 802.1x authentication use. + Not use in PSK case + Return: + ========================================================================== +*/ +VOID WpaEAPPacketAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ +} + +VOID WpaEAPOLASFAlertAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ +} + +VOID WpaEAPOLLogoffAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ +} + +/* + ========================================================================== + Description: + Start 4-way HS when rcv EAPOL_START which may create by our driver in assoc.c + Return: + ========================================================================== +*/ +VOID WpaEAPOLStartAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + MAC_TABLE_ENTRY *pEntry; + PHEADER_802_11 pHeader; + + DBGPRINT(RT_DEBUG_TRACE, ("WpaEAPOLStartAction ===> \n")); + + pHeader = (PHEADER_802_11)Elem->Msg; + + //For normaol PSK, we enqueue an EAPOL-Start command to trigger the process. + if (Elem->MsgLen == 6) + pEntry = MacTableLookup(pAd, Elem->Msg); + else + { + pEntry = MacTableLookup(pAd, pHeader->Addr2); + } + + if (pEntry) + { + DBGPRINT(RT_DEBUG_TRACE, (" PortSecured(%d), WpaState(%d), AuthMode(%d), PMKID_CacheIdx(%d) \n", pEntry->PortSecured, pEntry->WpaState, pEntry->AuthMode, pEntry->PMKID_CacheIdx)); + + if ((pEntry->PortSecured == WPA_802_1X_PORT_NOT_SECURED) + && (pEntry->WpaState < AS_PTKSTART) + && ((pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) || ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) && (pEntry->PMKID_CacheIdx != ENTRY_NOT_FOUND)))) + { + pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP; + pEntry->WpaState = AS_INITPSK; + pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; + NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter)); + pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR; + + WPAStart4WayHS(pAd, pEntry, PEER_MSG1_RETRY_EXEC_INTV); + } + } +} + +/* + ========================================================================== + Description: + This is state machine function. + When receiving EAPOL packets which is for 802.1x key management. + Use both in WPA, and WPAPSK case. + In this function, further dispatch to different functions according to the received packet. 3 categories are : + 1. normal 4-way pairwisekey and 2-way groupkey handshake + 2. MIC error (Countermeasures attack) report packet from STA. + 3. Request for pairwise/group key update from STA + Return: + ========================================================================== +*/ +VOID WpaEAPOLKeyAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + MAC_TABLE_ENTRY *pEntry; + PHEADER_802_11 pHeader; + PEAPOL_PACKET pEapol_packet; + KEY_INFO peerKeyInfo; + UINT eapol_len; + + DBGPRINT(RT_DEBUG_TRACE, ("WpaEAPOLKeyAction ===>\n")); + + pHeader = (PHEADER_802_11)Elem->Msg; + pEapol_packet = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H]; + eapol_len = CONV_ARRARY_TO_UINT16(pEapol_packet->Body_Len) + LENGTH_EAPOL_H; + + NdisZeroMemory((PUCHAR)&peerKeyInfo, sizeof(peerKeyInfo)); + NdisMoveMemory((PUCHAR)&peerKeyInfo, (PUCHAR)&pEapol_packet->KeyDesc.KeyInfo, sizeof(KEY_INFO)); + + + *((USHORT *)&peerKeyInfo) = cpu2le16(*((USHORT *)&peerKeyInfo)); + + do + { + pEntry = MacTableLookup(pAd, pHeader->Addr2); + + if (!pEntry || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry))) + break; + + if (pEntry->AuthMode < Ndis802_11AuthModeWPA) + break; + + DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPoL-Key frame from STA %02X-%02X-%02X-%02X-%02X-%02X\n", PRINT_MAC(pEntry->Addr))); + + if (eapol_len > Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H) + { + DBGPRINT(RT_DEBUG_ERROR, ("The length of EAPoL packet is invalid \n")); + break; + } + + if (((pEapol_packet->ProVer != EAPOL_VER) && (pEapol_packet->ProVer != EAPOL_VER2)) || + ((pEapol_packet->KeyDesc.Type != WPA1_KEY_DESC) && (pEapol_packet->KeyDesc.Type != WPA2_KEY_DESC))) + { + DBGPRINT(RT_DEBUG_ERROR, ("Key descripter does not match with WPA rule\n")); + break; + } + + // The value 1 shall be used for all EAPOL-Key frames to and from a STA when + // neither the group nor pairwise ciphers are CCMP for Key Descriptor 1. + if ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) && (peerKeyInfo.KeyDescVer != KEY_DESC_TKIP)) + { + DBGPRINT(RT_DEBUG_ERROR, ("Key descripter version not match(TKIP) \n")); + break; + } + // The value 2 shall be used for all EAPOL-Key frames to and from a STA when + // either the pairwise or the group cipher is AES-CCMP for Key Descriptor 2. + else if ((pEntry->WepStatus == Ndis802_11Encryption3Enabled) && (peerKeyInfo.KeyDescVer != KEY_DESC_AES)) + { + DBGPRINT(RT_DEBUG_ERROR, ("Key descripter version not match(AES) \n")); + break; + } + + // Check if this STA is in class 3 state and the WPA state is started + if ((pEntry->Sst == SST_ASSOC) && (pEntry->WpaState >= AS_INITPSK)) + { + // Check the Key Ack (bit 7) of the Key Information to determine the Authenticator + // or not. + // An EAPOL-Key frame that is sent by the Supplicant in response to an EAPOL- + // Key frame from the Authenticator must not have the Ack bit set. + if (peerKeyInfo.KeyAck == 1) + { + // The frame is snet by Authenticator. + // So the Supplicant side shall handle this. + + if ((peerKeyInfo.Secure == 0) && (peerKeyInfo.Request == 0) && + (peerKeyInfo.Error == 0) && (peerKeyInfo.KeyType == PAIRWISEKEY)) + { + // Process 1. the message 1 of 4-way HS in WPA or WPA2 + // EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1) + // 2. the message 3 of 4-way HS in WPA + // EAPOL-Key(0,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3) + if (peerKeyInfo.KeyMic == 0) + PeerPairMsg1Action(pAd, pEntry, Elem); + else + PeerPairMsg3Action(pAd, pEntry, Elem); + } + else if ((peerKeyInfo.Secure == 1) && + (peerKeyInfo.KeyMic == 1) && + (peerKeyInfo.Request == 0) && + (peerKeyInfo.Error == 0)) + { + // Process 1. the message 3 of 4-way HS in WPA2 + // EAPOL-Key(1,1,1,1,P,0,KeyRSC,ANonce,MIC,DataKD_M3) + // 2. the message 1 of group KS in WPA or WPA2 + // EAPOL-Key(1,1,1,0,G,0,Key RSC,0, MIC,GTK[N]) + if (peerKeyInfo.KeyType == PAIRWISEKEY) + PeerPairMsg3Action(pAd, pEntry, Elem); + else + PeerGroupMsg1Action(pAd, pEntry, Elem); + } + } + else + { + // The frame is snet by Supplicant. + // So the Authenticator side shall handle this. + if ((peerKeyInfo.Request == 0) && + (peerKeyInfo.Error == 0) && + (peerKeyInfo.KeyMic == 1)) + { + if (peerKeyInfo.Secure == 0 && peerKeyInfo.KeyType == PAIRWISEKEY) + { + // EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,Data) + // Process 1. message 2 of 4-way HS in WPA or WPA2 + // 2. message 4 of 4-way HS in WPA + if (CONV_ARRARY_TO_UINT16(pEapol_packet->KeyDesc.KeyDataLen) == 0) + { + PeerPairMsg4Action(pAd, pEntry, Elem); + } + else + { + PeerPairMsg2Action(pAd, pEntry, Elem); + } + } + else if (peerKeyInfo.Secure == 1 && peerKeyInfo.KeyType == PAIRWISEKEY) + { + // EAPOL-Key(1,1,0,0,P,0,0,0,MIC,0) + // Process message 4 of 4-way HS in WPA2 + PeerPairMsg4Action(pAd, pEntry, Elem); + } + else if (peerKeyInfo.Secure == 1 && peerKeyInfo.KeyType == GROUPKEY) + { + // EAPOL-Key(1,1,0,0,G,0,0,0,MIC,0) + // Process message 2 of Group key HS in WPA or WPA2 + PeerGroupMsg2Action(pAd, pEntry, &Elem->Msg[LENGTH_802_11], (Elem->MsgLen - LENGTH_802_11)); + } + } + } + } + }while(FALSE); +} + +/* + ======================================================================== + + Routine Description: + Copy frame from waiting queue into relative ring buffer and set + appropriate ASIC register to kick hardware encryption before really + sent out to air. + + Arguments: + pAd Pointer to our adapter + PNDIS_PACKET Pointer to outgoing Ndis frame + NumberOfFrag Number of fragment required + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID RTMPToWirelessSta( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PUCHAR pHeader802_3, + IN UINT HdrLen, + IN PUCHAR pData, + IN UINT DataLen, + IN BOOLEAN bClearFrame) +{ + PNDIS_PACKET pPacket; + NDIS_STATUS Status; + + if ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry) + )) + return; + + do { + // build a NDIS packet + Status = RTMPAllocateNdisPacket(pAd, &pPacket, pHeader802_3, HdrLen, pData, DataLen); + if (Status != NDIS_STATUS_SUCCESS) + break; + + + if (bClearFrame) + RTMP_SET_PACKET_CLEAR_EAP_FRAME(pPacket, 1); + else + RTMP_SET_PACKET_CLEAR_EAP_FRAME(pPacket, 0); + { + RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS); + + RTMP_SET_PACKET_NET_DEVICE_MBSSID(pPacket, MAIN_MBSSID); // set a default value + if(pEntry->apidx != 0) + RTMP_SET_PACKET_NET_DEVICE_MBSSID(pPacket, pEntry->apidx); + + RTMP_SET_PACKET_WCID(pPacket, (UCHAR)pEntry->Aid); + RTMP_SET_PACKET_MOREDATA(pPacket, FALSE); + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // send out the packet + Status = STASendPacket(pAd, pPacket); + if (Status == NDIS_STATUS_SUCCESS) + { + UCHAR Index; + + // Dequeue one frame from TxSwQueue0..3 queue and process it + // There are three place calling dequeue for TX ring. + // 1. Here, right after queueing the frame. + // 2. At the end of TxRingTxDone service routine. + // 3. Upon NDIS call RTMPSendPackets + if((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) && + (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS))) + { + for(Index = 0; Index < 5; Index ++) + if(pAd->TxSwQueue[Index].Number > 0) + RTMPDeQueuePacket(pAd, FALSE, Index, MAX_TX_PROCESS); + } + } + } +#endif // CONFIG_STA_SUPPORT // + + } while (FALSE); +} + +/* + ========================================================================== + Description: + Check the validity of the received EAPoL frame + Return: + TRUE if all parameters are OK, + FALSE otherwise + ========================================================================== + */ +BOOLEAN PeerWpaMessageSanity( + IN PRTMP_ADAPTER pAd, + IN PEAPOL_PACKET pMsg, + IN ULONG MsgLen, + IN UCHAR MsgType, + IN MAC_TABLE_ENTRY *pEntry) +{ + UCHAR mic[LEN_KEY_DESC_MIC], digest[80], KEYDATA[MAX_LEN_OF_RSNIE]; + BOOLEAN bReplayDiff = FALSE; + BOOLEAN bWPA2 = FALSE; + KEY_INFO EapolKeyInfo; + UCHAR GroupKeyIndex = 0; + + + NdisZeroMemory(mic, sizeof(mic)); + NdisZeroMemory(digest, sizeof(digest)); + NdisZeroMemory(KEYDATA, sizeof(KEYDATA)); + NdisZeroMemory((PUCHAR)&EapolKeyInfo, sizeof(EapolKeyInfo)); + + NdisMoveMemory((PUCHAR)&EapolKeyInfo, (PUCHAR)&pMsg->KeyDesc.KeyInfo, sizeof(KEY_INFO)); + + *((USHORT *)&EapolKeyInfo) = cpu2le16(*((USHORT *)&EapolKeyInfo)); + + // Choose WPA2 or not + if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)) + bWPA2 = TRUE; + + // 0. Check MsgType + if ((MsgType > EAPOL_GROUP_MSG_2) || (MsgType < EAPOL_PAIR_MSG_1)) + { + DBGPRINT(RT_DEBUG_ERROR, ("The message type is invalid(%d)! \n", MsgType)); + return FALSE; + } + + // 1. Replay counter check + if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1) // For supplicant + { + // First validate replay counter, only accept message with larger replay counter. + // Let equal pass, some AP start with all zero replay counter + UCHAR ZeroReplay[LEN_KEY_DESC_REPLAY]; + + NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY); + if ((RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY) != 1) && + (RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, ZeroReplay, LEN_KEY_DESC_REPLAY) != 0)) + { + bReplayDiff = TRUE; + } + } + else if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2) // For authenticator + { + // check Replay Counter coresponds to MSG from authenticator, otherwise discard + if (!NdisEqualMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY)) + { + bReplayDiff = TRUE; + } + } + + // Replay Counter different condition + if (bReplayDiff) + { + // send wireless event - for replay counter different + RTMPSendWirelessEvent(pAd, IW_REPLAY_COUNTER_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); + + if (MsgType < EAPOL_GROUP_MSG_1) + { + DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in pairwise msg %d of 4-way handshake!\n", MsgType)); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4))); + } + + hex_dump("Receive replay counter ", pMsg->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY); + hex_dump("Current replay counter ", pEntry->R_Counter, LEN_KEY_DESC_REPLAY); + return FALSE; + } + + // 2. Verify MIC except Pairwise Msg1 + if (MsgType != EAPOL_PAIR_MSG_1) + { + UCHAR rcvd_mic[LEN_KEY_DESC_MIC]; + UINT eapol_len = CONV_ARRARY_TO_UINT16(pMsg->Body_Len) + 4; + + // Record the received MIC for check later + NdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC); + NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC); + + if (EapolKeyInfo.KeyDescVer == KEY_DESC_TKIP) // TKIP + { + RT_HMAC_MD5(pEntry->PTK, LEN_PTK_KCK, (PUCHAR)pMsg, eapol_len, mic, MD5_DIGEST_SIZE); + } + else if (EapolKeyInfo.KeyDescVer == KEY_DESC_AES) // AES + { + RT_HMAC_SHA1(pEntry->PTK, LEN_PTK_KCK, (PUCHAR)pMsg, eapol_len, digest, SHA1_DIGEST_SIZE); + NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC); + } + + if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC)) + { + // send wireless event - for MIC different + RTMPSendWirelessEvent(pAd, IW_MIC_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); + + if (MsgType < EAPOL_GROUP_MSG_1) + { + DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in pairwise msg %d of 4-way handshake!\n", MsgType)); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4))); + } + + hex_dump("Received MIC", rcvd_mic, LEN_KEY_DESC_MIC); + hex_dump("Desired MIC", mic, LEN_KEY_DESC_MIC); + + return FALSE; + } + } + + // 1. Decrypt the Key Data field if GTK is included. + // 2. Extract the context of the Key Data field if it exist. + // The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is clear. + // The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted. + if (CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen) > 0) + { + // Decrypt this field + if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1)) + { + if( + (EapolKeyInfo.KeyDescVer == KEY_DESC_AES)) + { + UINT aes_unwrap_len = 0; + + // AES + AES_Key_Unwrap(pMsg->KeyDesc.KeyData, + CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen), + &pEntry->PTK[LEN_PTK_KCK], LEN_PTK_KEK, + KEYDATA, &aes_unwrap_len); + SET_UINT16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, aes_unwrap_len); + } + else + { + TKIP_GTK_KEY_UNWRAP(&pEntry->PTK[LEN_PTK_KCK], + pMsg->KeyDesc.KeyIv, + pMsg->KeyDesc.KeyData, + CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen), + KEYDATA); + } + + if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1)) + GroupKeyIndex = EapolKeyInfo.KeyIndex; + + } + else if ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2)) + { + NdisMoveMemory(KEYDATA, pMsg->KeyDesc.KeyData, CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen)); + } + else + { + + return TRUE; + } + + // Parse Key Data field to + // 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2) + // 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA2 + // 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2) + if (!RTMPParseEapolKeyData(pAd, KEYDATA, + CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen), + GroupKeyIndex, MsgType, bWPA2, pEntry)) + { + return FALSE; + } + } + + return TRUE; + +} + + +/* + ========================================================================== + Description: + This is a function to initilize 4-way handshake + + Return: + + ========================================================================== +*/ +VOID WPAStart4WayHS( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN ULONG TimeInterval) +{ + UCHAR Header802_3[14]; + UCHAR *mpool; + PEAPOL_PACKET pEapolFrame; + PUINT8 pBssid = NULL; + UCHAR group_cipher = Ndis802_11WEPDisabled; + + DBGPRINT(RT_DEBUG_TRACE, ("===> WPAStart4WayHS\n")); + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS)) + { + DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]WPAStart4WayHS : The interface is closed...\n")); + return; + } + + + if (pBssid == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]WPAStart4WayHS : No corresponding Authenticator.\n")); + return; + } + + // Check the status + if ((pEntry->WpaState > AS_PTKSTART) || (pEntry->WpaState < AS_INITPMK)) + { + DBGPRINT(RT_DEBUG_ERROR, ("[ERROR]WPAStart4WayHS : Not expect calling\n")); + return; + } + + + // Increment replay counter by 1 + ADD_ONE_To_64BIT_VAR(pEntry->R_Counter); + + // Randomly generate ANonce + GenRandom(pAd, (UCHAR *)pBssid, pEntry->ANonce); + + // Allocate memory for output + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return; + } + + pEapolFrame = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); + + // Construct EAPoL message - Pairwise Msg 1 + // EAPOL-Key(0,0,1,0,P,0,0,ANonce,0,DataKD_M1) + ConstructEapolMsg(pEntry, + group_cipher, + EAPOL_PAIR_MSG_1, + 0, // Default key index + pEntry->ANonce, + NULL, // TxRSC + NULL, // GTK + NULL, // RSNIE + 0, // RSNIE length + pEapolFrame); + + + // Make outgoing frame + MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL); + RTMPToWirelessSta(pAd, pEntry, Header802_3, + LENGTH_802_3, (PUCHAR)pEapolFrame, + CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, + (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE); + + // Trigger Retry Timer + RTMPModTimer(&pEntry->RetryTimer, TimeInterval); + + // Update State + pEntry->WpaState = AS_PTKSTART; + + os_free_mem(NULL, mpool); + + DBGPRINT(RT_DEBUG_TRACE, ("<=== WPAStart4WayHS: send Msg1 of 4-way \n")); + +} + +/* + ======================================================================== + + Routine Description: + Process Pairwise key Msg-1 of 4-way handshaking and send Msg-2 + + Arguments: + pAd Pointer to our adapter + Elem Message body + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID PeerPairMsg1Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR PTK[80]; + UCHAR Header802_3[14]; + PEAPOL_PACKET pMsg1; + UINT MsgLen; + UCHAR *mpool; + PEAPOL_PACKET pEapolFrame; + PUINT8 pCurrentAddr = NULL; + PUINT8 pmk_ptr = NULL; + UCHAR group_cipher = Ndis802_11WEPDisabled; + PUINT8 rsnie_ptr = NULL; + UCHAR rsnie_len = 0; + + DBGPRINT(RT_DEBUG_TRACE, ("===> PeerPairMsg1Action \n")); + + if ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry))) + return; + + if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG)) + return; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pCurrentAddr = pAd->CurrentAddress; + pmk_ptr = pAd->StaCfg.PMK; + group_cipher = pAd->StaCfg.GroupCipher; + rsnie_ptr = pAd->StaCfg.RSN_IE; + rsnie_len = pAd->StaCfg.RSNIE_Len; + } +#endif // CONFIG_STA_SUPPORT // + + // Store the received frame + pMsg1 = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H]; + MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H; + + // Sanity Check peer Pairwise message 1 - Replay Counter + if (PeerWpaMessageSanity(pAd, pMsg1, MsgLen, EAPOL_PAIR_MSG_1, pEntry) == FALSE) + return; + + // Store Replay counter, it will use to verify message 3 and construct message 2 + NdisMoveMemory(pEntry->R_Counter, pMsg1->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY); + + // Store ANonce + NdisMoveMemory(pEntry->ANonce, pMsg1->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE); + + // Generate random SNonce + GenRandom(pAd, (UCHAR *)pCurrentAddr, pEntry->SNonce); + + { + // Calculate PTK(ANonce, SNonce) + WpaDerivePTK(pAd, + pmk_ptr, + pEntry->ANonce, + pEntry->Addr, + pEntry->SNonce, + pCurrentAddr, + PTK, + LEN_PTK); + + // Save key to PTK entry + NdisMoveMemory(pEntry->PTK, PTK, LEN_PTK); + } + + // Update WpaState + pEntry->WpaState = AS_PTKINIT_NEGOTIATING; + + // Allocate memory for output + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return; + } + + pEapolFrame = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); + + // Construct EAPoL message - Pairwise Msg 2 + // EAPOL-Key(0,1,0,0,P,0,0,SNonce,MIC,DataKD_M2) + ConstructEapolMsg(pEntry, + group_cipher, + EAPOL_PAIR_MSG_2, + 0, // DefaultKeyIdx + pEntry->SNonce, + NULL, // TxRsc + NULL, // GTK + (UCHAR *)rsnie_ptr, + rsnie_len, + pEapolFrame); + + // Make outgoing frame + MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL); + + RTMPToWirelessSta(pAd, pEntry, + Header802_3, sizeof(Header802_3), (PUCHAR)pEapolFrame, + CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, TRUE); + + os_free_mem(NULL, mpool); + + DBGPRINT(RT_DEBUG_TRACE, ("<=== PeerPairMsg1Action: send Msg2 of 4-way \n")); +} + + +/* + ========================================================================== + Description: + When receiving the second packet of 4-way pairwisekey handshake. + Return: + ========================================================================== +*/ +VOID PeerPairMsg2Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR PTK[80]; + BOOLEAN Cancelled; + PHEADER_802_11 pHeader; + UCHAR *mpool; + PEAPOL_PACKET pEapolFrame; + PEAPOL_PACKET pMsg2; + UINT MsgLen; + UCHAR Header802_3[LENGTH_802_3]; + UCHAR TxTsc[6]; + PUINT8 pBssid = NULL; + PUINT8 pmk_ptr = NULL; + PUINT8 gtk_ptr = NULL; + UCHAR default_key = 0; + UCHAR group_cipher = Ndis802_11WEPDisabled; + PUINT8 rsnie_ptr = NULL; + UCHAR rsnie_len = 0; + + DBGPRINT(RT_DEBUG_TRACE, ("===> PeerPairMsg2Action \n")); + + if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry)) + return; + + if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG)) + return; + + // check Entry in valid State + if (pEntry->WpaState < AS_PTKSTART) + return; + + + + // pointer to 802.11 header + pHeader = (PHEADER_802_11)Elem->Msg; + + // skip 802.11_header(24-byte) and LLC_header(8) + pMsg2 = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H]; + MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H; + + // Store SNonce + NdisMoveMemory(pEntry->SNonce, pMsg2->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE); + + { + // Derive PTK + WpaDerivePTK(pAd, + (UCHAR *)pmk_ptr, + pEntry->ANonce, // ANONCE + (UCHAR *)pBssid, + pEntry->SNonce, // SNONCE + pEntry->Addr, + PTK, + LEN_PTK); + + NdisMoveMemory(pEntry->PTK, PTK, LEN_PTK); + } + + // Sanity Check peer Pairwise message 2 - Replay Counter, MIC, RSNIE + if (PeerWpaMessageSanity(pAd, pMsg2, MsgLen, EAPOL_PAIR_MSG_2, pEntry) == FALSE) + return; + + do + { + // Allocate memory for input + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return; + } + + pEapolFrame = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); + + // delete retry timer + RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled); + + // Change state + pEntry->WpaState = AS_PTKINIT_NEGOTIATING; + + // Increment replay counter by 1 + ADD_ONE_To_64BIT_VAR(pEntry->R_Counter); + + // Construct EAPoL message - Pairwise Msg 3 + ConstructEapolMsg(pEntry, + group_cipher, + EAPOL_PAIR_MSG_3, + default_key, + pEntry->ANonce, + TxTsc, + (UCHAR *)gtk_ptr, + (UCHAR *)rsnie_ptr, + rsnie_len, + pEapolFrame); + + // Make outgoing frame + MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL); + RTMPToWirelessSta(pAd, pEntry, Header802_3, LENGTH_802_3, + (PUCHAR)pEapolFrame, + CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, + (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) ? FALSE : TRUE); + + pEntry->ReTryCounter = PEER_MSG3_RETRY_TIMER_CTR; + RTMPSetTimer(&pEntry->RetryTimer, PEER_MSG3_RETRY_EXEC_INTV); + + // Update State + pEntry->WpaState = AS_PTKINIT_NEGOTIATING; + + os_free_mem(NULL, mpool); + + }while(FALSE); + + DBGPRINT(RT_DEBUG_TRACE, ("<=== PeerPairMsg2Action: send Msg3 of 4-way \n")); +} + +/* + ======================================================================== + + Routine Description: + Process Pairwise key Msg 3 of 4-way handshaking and send Msg 4 + + Arguments: + pAd Pointer to our adapter + Elem Message body + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID PeerPairMsg3Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem) +{ + PHEADER_802_11 pHeader; + UCHAR Header802_3[14]; + UCHAR *mpool; + PEAPOL_PACKET pEapolFrame; + PEAPOL_PACKET pMsg3; + UINT MsgLen; + PUINT8 pCurrentAddr = NULL; + UCHAR group_cipher = Ndis802_11WEPDisabled; + + DBGPRINT(RT_DEBUG_TRACE, ("===> PeerPairMsg3Action \n")); + + if ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry))) + return; + + if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG)) + return; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pCurrentAddr = pAd->CurrentAddress; + group_cipher = pAd->StaCfg.GroupCipher; + + } +#endif // CONFIG_STA_SUPPORT // + + // Record 802.11 header & the received EAPOL packet Msg3 + pHeader = (PHEADER_802_11) Elem->Msg; + pMsg3 = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H]; + MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H; + + // Sanity Check peer Pairwise message 3 - Replay Counter, MIC, RSNIE + if (PeerWpaMessageSanity(pAd, pMsg3, MsgLen, EAPOL_PAIR_MSG_3, pEntry) == FALSE) + return; + + // Save Replay counter, it will use construct message 4 + NdisMoveMemory(pEntry->R_Counter, pMsg3->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY); + + // Double check ANonce + if (!NdisEqualMemory(pEntry->ANonce, pMsg3->KeyDesc.KeyNonce, LEN_KEY_DESC_NONCE)) + { + return; + } + + // Allocate memory for output + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return; + } + + pEapolFrame = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); + + // Construct EAPoL message - Pairwise Msg 4 + ConstructEapolMsg(pEntry, + group_cipher, + EAPOL_PAIR_MSG_4, + 0, // group key index not used in message 4 + NULL, // Nonce not used in message 4 + NULL, // TxRSC not used in message 4 + NULL, // GTK not used in message 4 + NULL, // RSN IE not used in message 4 + 0, + pEapolFrame); + + // Update WpaState + pEntry->WpaState = AS_PTKINITDONE; + + // Update pairwise key +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + NdisMoveMemory(pAd->StaCfg.PTK, pEntry->PTK, LEN_PTK); + WPAInstallPairwiseKey(pAd, + BSS0, + pEntry, + FALSE); + NdisMoveMemory(&pAd->SharedKey[BSS0][0], &pEntry->PairwiseKey, sizeof(CIPHER_KEY)); + } +#endif // CONFIG_STA_SUPPORT // + + // open 802.1x port control and privacy filter + if (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK || + pEntry->AuthMode == Ndis802_11AuthModeWPA2) + { + pEntry->PortSecured = WPA_802_1X_PORT_SECURED; + pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; + +#ifdef CONFIG_STA_SUPPORT + STA_PORT_SECURED(pAd); + // Indicate Connected for GUI + pAd->IndicateMediaState = NdisMediaStateConnected; +#endif // CONFIG_STA_SUPPORT // + DBGPRINT(RT_DEBUG_TRACE, ("PeerPairMsg3Action: AuthMode(%s) PairwiseCipher(%s) GroupCipher(%s) \n", + GetAuthMode(pEntry->AuthMode), + GetEncryptType(pEntry->WepStatus), + GetEncryptType(group_cipher))); + } + else + { + } + + // Init 802.3 header and send out + MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL); + RTMPToWirelessSta(pAd, pEntry, + Header802_3, sizeof(Header802_3), + (PUCHAR)pEapolFrame, + CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, TRUE); + + os_free_mem(NULL, mpool); + + DBGPRINT(RT_DEBUG_TRACE, ("<=== PeerPairMsg3Action: send Msg4 of 4-way \n")); +} + +/* + ========================================================================== + Description: + When receiving the last packet of 4-way pairwisekey handshake. + Initilize 2-way groupkey handshake following. + Return: + ========================================================================== +*/ +VOID PeerPairMsg4Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem) +{ + PEAPOL_PACKET pMsg4; + PHEADER_802_11 pHeader; + UINT MsgLen; + BOOLEAN Cancelled; + UCHAR group_cipher = Ndis802_11WEPDisabled; + + DBGPRINT(RT_DEBUG_TRACE, ("===> PeerPairMsg4Action\n")); + + do + { + if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry)) + break; + + if (Elem->MsgLen < (LENGTH_802_11 + LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG ) ) + break; + + if (pEntry->WpaState < AS_PTKINIT_NEGOTIATING) + break; + + + // pointer to 802.11 header + pHeader = (PHEADER_802_11)Elem->Msg; + + // skip 802.11_header(24-byte) and LLC_header(8) + pMsg4 = (PEAPOL_PACKET)&Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H]; + MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H; + + // Sanity Check peer Pairwise message 4 - Replay Counter, MIC + if (PeerWpaMessageSanity(pAd, pMsg4, MsgLen, EAPOL_PAIR_MSG_4, pEntry) == FALSE) + break; + + /* 3. Install pairwise key */ + WPAInstallPairwiseKey(pAd, pEntry->apidx, pEntry, TRUE); + + /* 4. upgrade state */ + pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; + pEntry->WpaState = AS_PTKINITDONE; + pEntry->PortSecured = WPA_802_1X_PORT_SECURED; + + + if (pEntry->AuthMode == Ndis802_11AuthModeWPA2 || + pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) + { + pEntry->GTKState = REKEY_ESTABLISHED; + RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled); + + + // send wireless event - for set key done WPA2 + RTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA2_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); + + DBGPRINT(RT_DEBUG_OFF, ("AP SETKEYS DONE - WPA2, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\n\n", + pEntry->AuthMode, GetAuthMode(pEntry->AuthMode), + pEntry->WepStatus, GetEncryptType(pEntry->WepStatus), + group_cipher, + GetEncryptType(group_cipher))); + } + else + { + // 5. init Group 2-way handshake if necessary. + WPAStart2WayGroupHS(pAd, pEntry); + + pEntry->ReTryCounter = GROUP_MSG1_RETRY_TIMER_CTR; + RTMPModTimer(&pEntry->RetryTimer, PEER_MSG3_RETRY_EXEC_INTV); + } + }while(FALSE); + +} + +/* + ========================================================================== + Description: + This is a function to send the first packet of 2-way groupkey handshake + Return: + + ========================================================================== +*/ +VOID WPAStart2WayGroupHS( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry) +{ + UCHAR Header802_3[14]; + UCHAR TxTsc[6]; + UCHAR *mpool; + PEAPOL_PACKET pEapolFrame; + UCHAR group_cipher = Ndis802_11WEPDisabled; + UCHAR default_key = 0; + PUINT8 gnonce_ptr = NULL; + PUINT8 gtk_ptr = NULL; + PUINT8 pBssid = NULL; + + DBGPRINT(RT_DEBUG_TRACE, ("===> WPAStart2WayGroupHS\n")); + + if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry)) + return; + + + // Allocate memory for output + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return; + } + + pEapolFrame = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); + + // Increment replay counter by 1 + ADD_ONE_To_64BIT_VAR(pEntry->R_Counter); + + // Construct EAPoL message - Group Msg 1 + ConstructEapolMsg(pEntry, + group_cipher, + EAPOL_GROUP_MSG_1, + default_key, + (UCHAR *)gnonce_ptr, + TxTsc, + (UCHAR *)gtk_ptr, + NULL, + 0, + pEapolFrame); + + // Make outgoing frame + MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pBssid, EAPOL); + RTMPToWirelessSta(pAd, pEntry, + Header802_3, LENGTH_802_3, + (PUCHAR)pEapolFrame, + CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, FALSE); + + os_free_mem(NULL, mpool); + + DBGPRINT(RT_DEBUG_TRACE, ("<=== WPAStart2WayGroupHS : send out Group Message 1 \n")); + + return; +} + +/* + ======================================================================== + + Routine Description: + Process Group key 2-way handshaking + + Arguments: + pAd Pointer to our adapter + Elem Message body + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID PeerGroupMsg1Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Header802_3[14]; + UCHAR *mpool; + PEAPOL_PACKET pEapolFrame; + PEAPOL_PACKET pGroup; + UINT MsgLen; + UCHAR default_key = 0; + UCHAR group_cipher = Ndis802_11WEPDisabled; + PUINT8 pCurrentAddr = NULL; + + DBGPRINT(RT_DEBUG_TRACE, ("===> PeerGroupMsg1Action \n")); + + if ((!pEntry) || (!IS_ENTRY_CLIENT(pEntry) && !IS_ENTRY_APCLI(pEntry))) + return; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pCurrentAddr = pAd->CurrentAddress; + group_cipher = pAd->StaCfg.GroupCipher; + default_key = pAd->StaCfg.DefaultKeyId; + } +#endif // CONFIG_STA_SUPPORT // + + // Process Group Message 1 frame. skip 802.11 header(24) & LLC_SNAP header(8) + pGroup = (PEAPOL_PACKET) &Elem->Msg[LENGTH_802_11 + LENGTH_802_1_H]; + MsgLen = Elem->MsgLen - LENGTH_802_11 - LENGTH_802_1_H; + + // Sanity Check peer group message 1 - Replay Counter, MIC, RSNIE + if (PeerWpaMessageSanity(pAd, pGroup, MsgLen, EAPOL_GROUP_MSG_1, pEntry) == FALSE) + return; + + // delete retry timer + + // Save Replay counter, it will use to construct message 2 + NdisMoveMemory(pEntry->R_Counter, pGroup->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY); + + // Allocate memory for output + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return; + } + + pEapolFrame = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pEapolFrame, TX_EAPOL_BUFFER); + + + // Construct EAPoL message - Group Msg 2 + ConstructEapolMsg(pEntry, + group_cipher, + EAPOL_GROUP_MSG_2, + default_key, + NULL, // Nonce not used + NULL, // TxRSC not used + NULL, // GTK not used + NULL, // RSN IE not used + 0, + pEapolFrame); + + // open 802.1x port control and privacy filter + pEntry->PortSecured = WPA_802_1X_PORT_SECURED; + pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; + +#ifdef CONFIG_STA_SUPPORT + STA_PORT_SECURED(pAd); + // Indicate Connected for GUI + pAd->IndicateMediaState = NdisMediaStateConnected; +#endif // CONFIG_STA_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("PeerGroupMsg1Action: AuthMode(%s) PairwiseCipher(%s) GroupCipher(%s) \n", + GetAuthMode(pEntry->AuthMode), + GetEncryptType(pEntry->WepStatus), + GetEncryptType(group_cipher))); + + // init header and Fill Packet and send Msg 2 to authenticator + MAKE_802_3_HEADER(Header802_3, pEntry->Addr, pCurrentAddr, EAPOL); + +#ifdef CONFIG_STA_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && INFRA_ON(pAd) && + OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) && + (pAd->MlmeAux.Channel == pAd->CommonCfg.Channel)) + { + /* Now stop the scanning and need to send the rekey packet out */ + pAd->MlmeAux.Channel = 0; + } +#endif // CONFIG_STA_SUPPORT // + + RTMPToWirelessSta(pAd, pEntry, + Header802_3, sizeof(Header802_3), + (PUCHAR)pEapolFrame, + CONV_ARRARY_TO_UINT16(pEapolFrame->Body_Len) + 4, FALSE); + + os_free_mem(NULL, mpool); + + DBGPRINT(RT_DEBUG_TRACE, ("<=== PeerGroupMsg1Action: send group message 2\n")); +} + + +VOID EnqueueStartForPSKExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + MAC_TABLE_ENTRY *pEntry = (PMAC_TABLE_ENTRY) FunctionContext; + + if ((pEntry) && IS_ENTRY_CLIENT(pEntry) && (pEntry->WpaState < AS_PTKSTART)) + { + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pEntry->pAd; + + switch (pEntry->EnqueueEapolStartTimerRunning) + { + case EAPOL_START_PSK: + DBGPRINT(RT_DEBUG_TRACE, ("Enqueue EAPoL-Start-PSK for sta(%02x:%02x:%02x:%02x:%02x:%02x) \n", PRINT_MAC(pEntry->Addr))); + + MlmeEnqueue(pAd, WPA_STATE_MACHINE, MT2_EAPOLStart, 6, &pEntry->Addr, 0); + break; + default: + break; + + } + } + pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE; + +} + + +VOID MlmeDeAuthAction( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN USHORT Reason, + IN BOOLEAN bDataFrameFirst) +{ + PUCHAR pOutBuffer = NULL; + ULONG FrameLen = 0; + HEADER_802_11 DeAuthHdr; + NDIS_STATUS NStatus; + + if (pEntry) + { + // Send out a Deauthentication request frame + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); + if (NStatus != NDIS_STATUS_SUCCESS) + return; + + // send wireless event - for send disassication + RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); + + DBGPRINT(RT_DEBUG_TRACE, ("Send DEAUTH frame with ReasonCode(%d) to %02x:%02x:%02x:%02x:%02x:%02x \n",Reason, PRINT_MAC(pEntry->Addr))); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + MgtMacHeaderInit(pAd, &DeAuthHdr, SUBTYPE_DEAUTH, 0, pEntry->Addr, pAd->CommonCfg.Bssid); + } +#endif // CONFIG_STA_SUPPORT // + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &DeAuthHdr, + 2, &Reason, + END_OF_ARGS); + + + + if (bDataFrameFirst) + MiniportMMRequest(pAd, MGMT_USE_QUEUE_FLAG, pOutBuffer, FrameLen); + else + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + // ApLogEvent(pAd, pEntry->Addr, EVENT_DISASSOCIATED); + MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); + } +} + + +/* + ========================================================================== + Description: + When receiving the last packet of 2-way groupkey handshake. + Return: + ========================================================================== +*/ +VOID PeerGroupMsg2Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN VOID *Msg, + IN UINT MsgLen) +{ + UINT Len; + PUCHAR pData; + BOOLEAN Cancelled; + PEAPOL_PACKET pMsg2; + UCHAR group_cipher = Ndis802_11WEPDisabled; + + DBGPRINT(RT_DEBUG_TRACE, ("===> PeerGroupMsg2Action \n")); + + if ((!pEntry) || !IS_ENTRY_CLIENT(pEntry)) + return; + + if (MsgLen < (LENGTH_802_1_H + LENGTH_EAPOL_H + MIN_LEN_OF_EAPOL_KEY_MSG)) + return; + + if (pEntry->WpaState != AS_PTKINITDONE) + return; + + + do + { + + + pData = (PUCHAR)Msg; + pMsg2 = (PEAPOL_PACKET) (pData + LENGTH_802_1_H); + Len = MsgLen - LENGTH_802_1_H; + + // Sanity Check peer group message 2 - Replay Counter, MIC + if (PeerWpaMessageSanity(pAd, pMsg2, Len, EAPOL_GROUP_MSG_2, pEntry) == FALSE) + break; + + // 3. upgrade state + + RTMPCancelTimer(&pEntry->RetryTimer, &Cancelled); + pEntry->GTKState = REKEY_ESTABLISHED; + + if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + // send wireless event - for set key done WPA2 + RTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA2_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); + + DBGPRINT(RT_DEBUG_OFF, ("AP SETKEYS DONE - WPA2, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\n\n", + pEntry->AuthMode, GetAuthMode(pEntry->AuthMode), + pEntry->WepStatus, GetEncryptType(pEntry->WepStatus), + group_cipher, GetEncryptType(group_cipher))); + } + else + { + // send wireless event - for set key done WPA + RTMPSendWirelessEvent(pAd, IW_SET_KEY_DONE_WPA1_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); + + DBGPRINT(RT_DEBUG_OFF, ("AP SETKEYS DONE - WPA1, AuthMode(%d)=%s, WepStatus(%d)=%s, GroupWepStatus(%d)=%s\n\n", + pEntry->AuthMode, GetAuthMode(pEntry->AuthMode), + pEntry->WepStatus, GetEncryptType(pEntry->WepStatus), + group_cipher, GetEncryptType(group_cipher))); + } + }while(FALSE); +} + +/* + ======================================================================== + + Routine Description: + Classify WPA EAP message type + + Arguments: + EAPType Value of EAP message type + MsgType Internal Message definition for MLME state machine + + Return Value: + TRUE Found appropriate message type + FALSE No appropriate message type + + IRQL = DISPATCH_LEVEL + + Note: + All these constants are defined in wpa_cmm.h + For supplicant, there is only EAPOL Key message avaliable + + ======================================================================== +*/ +BOOLEAN WpaMsgTypeSubst( + IN UCHAR EAPType, + OUT INT *MsgType) +{ + switch (EAPType) + { + case EAPPacket: + *MsgType = MT2_EAPPacket; + break; + case EAPOLStart: + *MsgType = MT2_EAPOLStart; + break; + case EAPOLLogoff: + *MsgType = MT2_EAPOLLogoff; + break; + case EAPOLKey: + *MsgType = MT2_EAPOLKey; + break; + case EAPOLASFAlert: + *MsgType = MT2_EAPOLASFAlert; + break; + default: + return FALSE; + } + return TRUE; +} + +/** + * inc_iv_byte - Increment arbitrary length byte array + * @counter: Pointer to byte array + * @len: Length of the counter in bytes + * + * This function increments the least byte of the counter by one and continues + * rolling over to more significant bytes if the byte was incremented from + * 0xff to 0x00. + */ +void inc_iv_byte(UCHAR *iv, UINT len, UINT cnt) +{ + int pos = 0; + int carry = 0; + UCHAR pre_iv; + + while (pos < len) + { + pre_iv = iv[pos]; + + if (carry == 1) + iv[pos] ++; + else + iv[pos] += cnt; + + if (iv[pos] > pre_iv) + break; + + carry = 1; + pos++; + } + + if (pos >= len) + DBGPRINT(RT_DEBUG_WARN, ("!!! inc_iv_byte overflow !!!\n")); +} + + + +/* + ======================================================================== + + Routine Description: + The pseudo-random function(PRF) that hashes various inputs to + derive a pseudo-random value. To add liveness to the pseudo-random + value, a nonce should be one of the inputs. + + It is used to generate PTK, GTK or some specific random value. + + Arguments: + UCHAR *key, - the key material for HMAC_SHA1 use + INT key_len - the length of key + UCHAR *prefix - a prefix label + INT prefix_len - the length of the label + UCHAR *data - a specific data with variable length + INT data_len - the length of a specific data + INT len - the output lenght + + Return Value: + UCHAR *output - the calculated result + + Note: + 802.11i-2004 Annex H.3 + + ======================================================================== +*/ +VOID PRF( + IN UCHAR *key, + IN INT key_len, + IN UCHAR *prefix, + IN INT prefix_len, + IN UCHAR *data, + IN INT data_len, + OUT UCHAR *output, + IN INT len) +{ + INT i; + UCHAR *input; + INT currentindex = 0; + INT total_len; + + // Allocate memory for input + os_alloc_mem(NULL, (PUCHAR *)&input, 1024); + + if (input == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!PRF: no memory!!!\n")); + return; + } + + // Generate concatenation input + NdisMoveMemory(input, prefix, prefix_len); + + // Concatenate a single octet containing 0 + input[prefix_len] = 0; + + // Concatenate specific data + NdisMoveMemory(&input[prefix_len + 1], data, data_len); + total_len = prefix_len + 1 + data_len; + + // Concatenate a single octet containing 0 + // This octet shall be update later + input[total_len] = 0; + total_len++; + + // Iterate to calculate the result by hmac-sha-1 + // Then concatenate to last result + for (i = 0; i < (len + 19) / 20; i++) + { + RT_HMAC_SHA1(key, key_len, input, total_len, &output[currentindex], SHA1_DIGEST_SIZE); + currentindex += 20; + + // update the last octet + input[total_len - 1]++; + } + os_free_mem(NULL, input); +} + +/* +* F(P, S, c, i) = U1 xor U2 xor ... Uc +* U1 = PRF(P, S || Int(i)) +* U2 = PRF(P, U1) +* Uc = PRF(P, Uc-1) +*/ + +static void F(char *password, unsigned char *ssid, int ssidlength, int iterations, int count, unsigned char *output) +{ + unsigned char digest[36], digest1[SHA1_DIGEST_SIZE]; + int i, j; + + /* U1 = PRF(P, S || int(i)) */ + memcpy(digest, ssid, ssidlength); + digest[ssidlength] = (unsigned char)((count>>24) & 0xff); + digest[ssidlength+1] = (unsigned char)((count>>16) & 0xff); + digest[ssidlength+2] = (unsigned char)((count>>8) & 0xff); + digest[ssidlength+3] = (unsigned char)(count & 0xff); + RT_HMAC_SHA1((unsigned char*) password, (int) strlen(password), digest, ssidlength+4, digest1, SHA1_DIGEST_SIZE); // for WPA update + + /* output = U1 */ + memcpy(output, digest1, SHA1_DIGEST_SIZE); + + for (i = 1; i < iterations; i++) + { + /* Un = PRF(P, Un-1) */ + RT_HMAC_SHA1((unsigned char*) password, (int) strlen(password), digest1, SHA1_DIGEST_SIZE, digest, SHA1_DIGEST_SIZE); // for WPA update + memcpy(digest1, digest, SHA1_DIGEST_SIZE); + + /* output = output xor Un */ + for (j = 0; j < SHA1_DIGEST_SIZE; j++) + { + output[j] ^= digest[j]; + } + } +} + +/* +* password - ascii string up to 63 characters in length +* ssid - octet string up to 32 octets +* ssidlength - length of ssid in octets +* output must be 40 octets in length and outputs 256 bits of key +*/ +int RtmpPasswordHash(PSTRING password, PUCHAR ssid, INT ssidlength, PUCHAR output) +{ + if ((strlen(password) > 63) || (ssidlength > 32)) + return 0; + + F(password, ssid, ssidlength, 4096, 1, output); + F(password, ssid, ssidlength, 4096, 2, &output[SHA1_DIGEST_SIZE]); + return 1; +} + +/* + ======================================================================== + + Routine Description: + The key derivation function(KDF) is defined in IEEE 802.11r/D9.0, 8.5.1.5.2 + + Arguments: + + Return Value: + + Note: + Output �� KDF-Length (K, label, Context) where + Input: K, a 256-bit key derivation key + label, a string identifying the purpose of the keys derived using this KDF + Context, a bit string that provides context to identify the derived key + Length, the length of the derived key in bits + Output: a Length-bit derived key + + result �� "" + iterations �� (Length+255)/256 + do i = 1 to iterations + result �� result || HMAC-SHA256(K, i || label || Context || Length) + od + return first Length bits of result, and securely delete all unused bits + + In this algorithm, i and Length are encoded as 16-bit unsigned integers. + + ======================================================================== +*/ +VOID KDF( + IN PUINT8 key, + IN INT key_len, + IN PUINT8 label, + IN INT label_len, + IN PUINT8 data, + IN INT data_len, + OUT PUINT8 output, + IN USHORT len) +{ + USHORT i; + UCHAR *input; + INT currentindex = 0; + INT total_len; + UINT len_in_bits = (len << 3); + + os_alloc_mem(NULL, (PUCHAR *)&input, 1024); + + if (input == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!KDF: no memory!!!\n")); + return; + } /* End of if */ + + NdisZeroMemory(input, 1024); + + // Initial concatenated value (i || label || Context || Length) + // concatenate 16-bit unsigned integer, its initial value is 1. + input[0] = 1; + input[1] = 0; + total_len = 2; + + // concatenate a prefix string + NdisMoveMemory(&input[total_len], label, label_len); + total_len += label_len; + + // concatenate the context + NdisMoveMemory(&input[total_len], data, data_len); + total_len += data_len; + + // concatenate the length in bits (16-bit unsigned integer) + input[total_len] = (len_in_bits & 0xFF); + input[total_len + 1] = (len_in_bits & 0xFF00) >> 8; + total_len += 2; + + for (i = 1; i <= ((len_in_bits + 255) / 256); i++) + { + // HMAC-SHA256 derives output + RT_HMAC_SHA256((UCHAR *)key, key_len, input, total_len, (UCHAR *)&output[currentindex], 32); + + currentindex += 32; // next concatenation location + input[0]++; // increment octet count + + } + os_free_mem(NULL, input); +} + +/* + ======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + + ======================================================================== +*/ +VOID RTMPDerivePMKID( + IN PUINT8 pAaddr, + IN PUINT8 pSpaddr, + IN PUINT8 pKey, + IN PUINT8 pAkm_oui, + OUT PUINT8 pPMKID) +{ + UCHAR digest[80], text_buf[20]; + UINT8 text_len; + + // Concatenate the text for PMKID calculation + NdisMoveMemory(&text_buf[0], "PMK Name", 8); + NdisMoveMemory(&text_buf[8], pAaddr, MAC_ADDR_LEN); + NdisMoveMemory(&text_buf[14], pSpaddr, MAC_ADDR_LEN); + text_len = 20; + + { + RT_HMAC_SHA1(pKey, PMK_LEN, text_buf, text_len, digest, SHA1_DIGEST_SIZE); + } + + /* Truncate the first 128-bit of output result */ + NdisMoveMemory(pPMKID, digest, LEN_PMKID); + +} + + + +/* + ======================================================================== + + Routine Description: + It utilizes PRF-384 or PRF-512 to derive session-specific keys from a PMK. + It shall be called by 4-way handshake processing. + + Arguments: + pAd - pointer to our pAdapter context + PMK - pointer to PMK + ANonce - pointer to ANonce + AA - pointer to Authenticator Address + SNonce - pointer to SNonce + SA - pointer to Supplicant Address + len - indicate the length of PTK (octet) + + Return Value: + Output pointer to the PTK + + Note: + Refer to IEEE 802.11i-2004 8.5.1.2 + + ======================================================================== +*/ +VOID WpaDerivePTK( + IN PRTMP_ADAPTER pAd, + IN UCHAR *PMK, + IN UCHAR *ANonce, + IN UCHAR *AA, + IN UCHAR *SNonce, + IN UCHAR *SA, + OUT UCHAR *output, + IN UINT len) +{ + UCHAR concatenation[76]; + UINT CurrPos = 0; + UCHAR temp[32]; + UCHAR Prefix[] = {'P', 'a', 'i', 'r', 'w', 'i', 's', 'e', ' ', 'k', 'e', 'y', ' ', + 'e', 'x', 'p', 'a', 'n', 's', 'i', 'o', 'n'}; + + // initiate the concatenation input + NdisZeroMemory(temp, sizeof(temp)); + NdisZeroMemory(concatenation, 76); + + // Get smaller address + if (RTMPCompareMemory(SA, AA, 6) == 1) + NdisMoveMemory(concatenation, AA, 6); + else + NdisMoveMemory(concatenation, SA, 6); + CurrPos += 6; + + // Get larger address + if (RTMPCompareMemory(SA, AA, 6) == 1) + NdisMoveMemory(&concatenation[CurrPos], SA, 6); + else + NdisMoveMemory(&concatenation[CurrPos], AA, 6); + + // store the larger mac address for backward compatible of + // ralink proprietary STA-key issue + NdisMoveMemory(temp, &concatenation[CurrPos], MAC_ADDR_LEN); + CurrPos += 6; + + // Get smaller Nonce + if (RTMPCompareMemory(ANonce, SNonce, 32) == 0) + NdisMoveMemory(&concatenation[CurrPos], temp, 32); // patch for ralink proprietary STA-key issue + else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1) + NdisMoveMemory(&concatenation[CurrPos], SNonce, 32); + else + NdisMoveMemory(&concatenation[CurrPos], ANonce, 32); + CurrPos += 32; + + // Get larger Nonce + if (RTMPCompareMemory(ANonce, SNonce, 32) == 0) + NdisMoveMemory(&concatenation[CurrPos], temp, 32); // patch for ralink proprietary STA-key issue + else if (RTMPCompareMemory(ANonce, SNonce, 32) == 1) + NdisMoveMemory(&concatenation[CurrPos], ANonce, 32); + else + NdisMoveMemory(&concatenation[CurrPos], SNonce, 32); + CurrPos += 32; + + hex_dump("PMK", PMK, LEN_PMK); + hex_dump("concatenation=", concatenation, 76); + + // Use PRF to generate PTK + PRF(PMK, LEN_PMK, Prefix, 22, concatenation, 76, output, len); + +} + +VOID WpaDeriveGTK( + IN UCHAR *GMK, + IN UCHAR *GNonce, + IN UCHAR *AA, + OUT UCHAR *output, + IN UINT len) +{ + UCHAR concatenation[76]; + UINT CurrPos=0; + UCHAR Prefix[19]; + UCHAR temp[80]; + + NdisMoveMemory(&concatenation[CurrPos], AA, 6); + CurrPos += 6; + + NdisMoveMemory(&concatenation[CurrPos], GNonce , 32); + CurrPos += 32; + + Prefix[0] = 'G'; + Prefix[1] = 'r'; + Prefix[2] = 'o'; + Prefix[3] = 'u'; + Prefix[4] = 'p'; + Prefix[5] = ' '; + Prefix[6] = 'k'; + Prefix[7] = 'e'; + Prefix[8] = 'y'; + Prefix[9] = ' '; + Prefix[10] = 'e'; + Prefix[11] = 'x'; + Prefix[12] = 'p'; + Prefix[13] = 'a'; + Prefix[14] = 'n'; + Prefix[15] = 's'; + Prefix[16] = 'i'; + Prefix[17] = 'o'; + Prefix[18] = 'n'; + + PRF(GMK, PMK_LEN, Prefix, 19, concatenation, 38 , temp, len); + NdisMoveMemory(output, temp, len); +} + +/* + ======================================================================== + + Routine Description: + Generate random number by software. + + Arguments: + pAd - pointer to our pAdapter context + macAddr - pointer to local MAC address + + Return Value: + + Note: + 802.1ii-2004 Annex H.5 + + ======================================================================== +*/ +VOID GenRandom( + IN PRTMP_ADAPTER pAd, + IN UCHAR *macAddr, + OUT UCHAR *random) +{ + INT i, curr; + UCHAR local[80], KeyCounter[32]; + UCHAR result[80]; + ULONG CurrentTime; + UCHAR prefix[] = {'I', 'n', 'i', 't', ' ', 'C', 'o', 'u', 'n', 't', 'e', 'r'}; + + // Zero the related information + NdisZeroMemory(result, 80); + NdisZeroMemory(local, 80); + NdisZeroMemory(KeyCounter, 32); + + for (i = 0; i < 32; i++) + { + // copy the local MAC address + COPY_MAC_ADDR(local, macAddr); + curr = MAC_ADDR_LEN; + + // concatenate the current time + NdisGetSystemUpTime(&CurrentTime); + NdisMoveMemory(&local[curr], &CurrentTime, sizeof(CurrentTime)); + curr += sizeof(CurrentTime); + + // concatenate the last result + NdisMoveMemory(&local[curr], result, 32); + curr += 32; + + // concatenate a variable + NdisMoveMemory(&local[curr], &i, 2); + curr += 2; + + // calculate the result + PRF(KeyCounter, 32, prefix,12, local, curr, result, 32); + } + + NdisMoveMemory(random, result, 32); +} + +/* + ======================================================================== + + Routine Description: + Build cipher suite in RSN-IE. + It only shall be called by RTMPMakeRSNIE. + + Arguments: + pAd - pointer to our pAdapter context + ElementID - indicate the WPA1 or WPA2 + WepStatus - indicate the encryption type + bMixCipher - a boolean to indicate the pairwise cipher and group + cipher are the same or not + + Return Value: + + Note: + + ======================================================================== +*/ +static VOID RTMPMakeRsnIeCipher( + IN PRTMP_ADAPTER pAd, + IN UCHAR ElementID, + IN UINT WepStatus, + IN BOOLEAN bMixCipher, + IN UCHAR FlexibleCipher, + OUT PUCHAR pRsnIe, + OUT UCHAR *rsn_len) +{ + UCHAR PairwiseCnt; + + *rsn_len = 0; + + // decide WPA2 or WPA1 + if (ElementID == Wpa2Ie) + { + RSNIE2 *pRsnie_cipher = (RSNIE2*)pRsnIe; + + // Assign the verson as 1 + pRsnie_cipher->version = 1; + + switch (WepStatus) + { + // TKIP mode + case Ndis802_11Encryption2Enabled: + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4); + pRsnie_cipher->ucount = 1; + NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_TKIP, 4); + *rsn_len = sizeof(RSNIE2); + break; + + // AES mode + case Ndis802_11Encryption3Enabled: + if (bMixCipher) + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4); + else + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_CCMP, 4); + pRsnie_cipher->ucount = 1; + NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_CCMP, 4); + *rsn_len = sizeof(RSNIE2); + break; + + // TKIP-AES mix mode + case Ndis802_11Encryption4Enabled: + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_TKIP, 4); + + PairwiseCnt = 1; + // Insert WPA2 TKIP as the first pairwise cipher + if (MIX_CIPHER_WPA2_TKIP_ON(FlexibleCipher)) + { + NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_TKIP, 4); + // Insert WPA2 AES as the secondary pairwise cipher + if (MIX_CIPHER_WPA2_AES_ON(FlexibleCipher)) + { + NdisMoveMemory(pRsnie_cipher->ucast[0].oui + 4, OUI_WPA2_CCMP, 4); + PairwiseCnt = 2; + } + } + else + { + // Insert WPA2 AES as the first pairwise cipher + NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA2_CCMP, 4); + } + + pRsnie_cipher->ucount = PairwiseCnt; + *rsn_len = sizeof(RSNIE2) + (4 * (PairwiseCnt - 1)); + break; + } + +#ifdef CONFIG_STA_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && + (pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) && + (pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled)) + { + UINT GroupCipher = pAd->StaCfg.GroupCipher; + switch(GroupCipher) + { + case Ndis802_11GroupWEP40Enabled: + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_WEP40, 4); + break; + case Ndis802_11GroupWEP104Enabled: + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA2_WEP104, 4); + break; + } + } +#endif // CONFIG_STA_SUPPORT // + + // swap for big-endian platform + pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version); + pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount); + } + else + { + RSNIE *pRsnie_cipher = (RSNIE*)pRsnIe; + + // Assign OUI and version + NdisMoveMemory(pRsnie_cipher->oui, OUI_WPA_VERSION, 4); + pRsnie_cipher->version = 1; + + switch (WepStatus) + { + // TKIP mode + case Ndis802_11Encryption2Enabled: + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4); + pRsnie_cipher->ucount = 1; + NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_TKIP, 4); + *rsn_len = sizeof(RSNIE); + break; + + // AES mode + case Ndis802_11Encryption3Enabled: + if (bMixCipher) + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4); + else + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_CCMP, 4); + pRsnie_cipher->ucount = 1; + NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_CCMP, 4); + *rsn_len = sizeof(RSNIE); + break; + + // TKIP-AES mix mode + case Ndis802_11Encryption4Enabled: + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_TKIP, 4); + + PairwiseCnt = 1; + // Insert WPA TKIP as the first pairwise cipher + if (MIX_CIPHER_WPA_TKIP_ON(FlexibleCipher)) + { + NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_TKIP, 4); + // Insert WPA AES as the secondary pairwise cipher + if (MIX_CIPHER_WPA_AES_ON(FlexibleCipher)) + { + NdisMoveMemory(pRsnie_cipher->ucast[0].oui + 4, OUI_WPA_CCMP, 4); + PairwiseCnt = 2; + } + } + else + { + // Insert WPA AES as the first pairwise cipher + NdisMoveMemory(pRsnie_cipher->ucast[0].oui, OUI_WPA_CCMP, 4); + } + + pRsnie_cipher->ucount = PairwiseCnt; + *rsn_len = sizeof(RSNIE) + (4 * (PairwiseCnt - 1)); + break; + } + +#ifdef CONFIG_STA_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && + (pAd->StaCfg.GroupCipher != Ndis802_11Encryption2Enabled) && + (pAd->StaCfg.GroupCipher != Ndis802_11Encryption3Enabled)) + { + UINT GroupCipher = pAd->StaCfg.GroupCipher; + switch(GroupCipher) + { + case Ndis802_11GroupWEP40Enabled: + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP40, 4); + break; + case Ndis802_11GroupWEP104Enabled: + NdisMoveMemory(pRsnie_cipher->mcast, OUI_WPA_WEP104, 4); + break; + } + } +#endif // CONFIG_STA_SUPPORT // + + // swap for big-endian platform + pRsnie_cipher->version = cpu2le16(pRsnie_cipher->version); + pRsnie_cipher->ucount = cpu2le16(pRsnie_cipher->ucount); + } +} + +/* + ======================================================================== + + Routine Description: + Build AKM suite in RSN-IE. + It only shall be called by RTMPMakeRSNIE. + + Arguments: + pAd - pointer to our pAdapter context + ElementID - indicate the WPA1 or WPA2 + AuthMode - indicate the authentication mode + apidx - indicate the interface index + + Return Value: + + Note: + + ======================================================================== +*/ +static VOID RTMPMakeRsnIeAKM( + IN PRTMP_ADAPTER pAd, + IN UCHAR ElementID, + IN UINT AuthMode, + IN UCHAR apidx, + OUT PUCHAR pRsnIe, + OUT UCHAR *rsn_len) +{ + RSNIE_AUTH *pRsnie_auth; + UCHAR AkmCnt = 1; // default as 1 + + pRsnie_auth = (RSNIE_AUTH*)(pRsnIe + (*rsn_len)); + + // decide WPA2 or WPA1 + if (ElementID == Wpa2Ie) + { + + switch (AuthMode) + { + case Ndis802_11AuthModeWPA2: + case Ndis802_11AuthModeWPA1WPA2: + NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_8021X_AKM, 4); + break; + + case Ndis802_11AuthModeWPA2PSK: + case Ndis802_11AuthModeWPA1PSKWPA2PSK: + NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA2_PSK_AKM, 4); + break; + default: + AkmCnt = 0; + break; + + } + } + else + { + switch (AuthMode) + { + case Ndis802_11AuthModeWPA: + case Ndis802_11AuthModeWPA1WPA2: + NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_8021X_AKM, 4); + break; + + case Ndis802_11AuthModeWPAPSK: + case Ndis802_11AuthModeWPA1PSKWPA2PSK: + NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_PSK_AKM, 4); + break; + + case Ndis802_11AuthModeWPANone: + NdisMoveMemory(pRsnie_auth->auth[0].oui, OUI_WPA_NONE_AKM, 4); + break; + default: + AkmCnt = 0; + break; + } + } + + pRsnie_auth->acount = AkmCnt; + pRsnie_auth->acount = cpu2le16(pRsnie_auth->acount); + + // update current RSNIE length + (*rsn_len) += (sizeof(RSNIE_AUTH) + (4 * (AkmCnt - 1))); + +} + +/* + ======================================================================== + + Routine Description: + Build capability in RSN-IE. + It only shall be called by RTMPMakeRSNIE. + + Arguments: + pAd - pointer to our pAdapter context + ElementID - indicate the WPA1 or WPA2 + apidx - indicate the interface index + + Return Value: + + Note: + + ======================================================================== +*/ +static VOID RTMPMakeRsnIeCap( + IN PRTMP_ADAPTER pAd, + IN UCHAR ElementID, + IN UCHAR apidx, + OUT PUCHAR pRsnIe, + OUT UCHAR *rsn_len) +{ + RSN_CAPABILITIES *pRSN_Cap; + + // it could be ignored in WPA1 mode + if (ElementID == WpaIe) + return; + + pRSN_Cap = (RSN_CAPABILITIES*)(pRsnIe + (*rsn_len)); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + } +#endif // CONFIG_STA_SUPPORT // + + pRSN_Cap->word = cpu2le16(pRSN_Cap->word); + + (*rsn_len) += sizeof(RSN_CAPABILITIES); // update current RSNIE length + +} + +/* + ======================================================================== + + Routine Description: + Build PMKID in RSN-IE. + It only shall be called by RTMPMakeRSNIE. + + Arguments: + pAd - pointer to our pAdapter context + ElementID - indicate the WPA1 or WPA2 + apidx - indicate the interface index + + Return Value: + + Note: + + ======================================================================== +*/ + +/* + ======================================================================== + + Routine Description: + Build RSN IE context. It is not included element-ID and length. + + Arguments: + pAd - pointer to our pAdapter context + AuthMode - indicate the authentication mode + WepStatus - indicate the encryption type + apidx - indicate the interface index + + Return Value: + + Note: + + ======================================================================== +*/ +VOID RTMPMakeRSNIE( + IN PRTMP_ADAPTER pAd, + IN UINT AuthMode, + IN UINT WepStatus, + IN UCHAR apidx) +{ + PUCHAR pRsnIe = NULL; // primary RSNIE + UCHAR *rsnielen_cur_p = 0; // the length of the primary RSNIE + UCHAR *rsnielen_ex_cur_p = 0; // the length of the secondary RSNIE + UCHAR PrimaryRsnie; + BOOLEAN bMixCipher = FALSE; // indicate the pairwise and group cipher are different + UCHAR p_offset; + WPA_MIX_PAIR_CIPHER FlexibleCipher = MIX_CIPHER_NOTUSE; // it provide the more flexible cipher combination in WPA-WPA2 and TKIPAES mode + + rsnielen_cur_p = NULL; + rsnielen_ex_cur_p = NULL; + + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) + { + if (AuthMode < Ndis802_11AuthModeWPA) + return; + } + else +#endif // WPA_SUPPLICANT_SUPPORT // + { + // Support WPAPSK or WPA2PSK in STA-Infra mode + // Support WPANone in STA-Adhoc mode + if ((AuthMode != Ndis802_11AuthModeWPAPSK) && + (AuthMode != Ndis802_11AuthModeWPA2PSK) && + (AuthMode != Ndis802_11AuthModeWPANone) + ) + return; + } + + DBGPRINT(RT_DEBUG_TRACE,("==> RTMPMakeRSNIE(STA)\n")); + + // Zero RSNIE context + pAd->StaCfg.RSNIE_Len = 0; + NdisZeroMemory(pAd->StaCfg.RSN_IE, MAX_LEN_OF_RSNIE); + + // Pointer to RSNIE + rsnielen_cur_p = &pAd->StaCfg.RSNIE_Len; + pRsnIe = pAd->StaCfg.RSN_IE; + + bMixCipher = pAd->StaCfg.bMixCipher; + } +#endif // CONFIG_STA_SUPPORT // + } + + // indicate primary RSNIE as WPA or WPA2 + if ((AuthMode == Ndis802_11AuthModeWPA) || + (AuthMode == Ndis802_11AuthModeWPAPSK) || + (AuthMode == Ndis802_11AuthModeWPANone) || + (AuthMode == Ndis802_11AuthModeWPA1WPA2) || + (AuthMode == Ndis802_11AuthModeWPA1PSKWPA2PSK)) + PrimaryRsnie = WpaIe; + else + PrimaryRsnie = Wpa2Ie; + + { + // Build the primary RSNIE + // 1. insert cipher suite + RTMPMakeRsnIeCipher(pAd, PrimaryRsnie, WepStatus, bMixCipher, FlexibleCipher, pRsnIe, &p_offset); + + // 2. insert AKM + RTMPMakeRsnIeAKM(pAd, PrimaryRsnie, AuthMode, apidx, pRsnIe, &p_offset); + + // 3. insert capability + RTMPMakeRsnIeCap(pAd, PrimaryRsnie, apidx, pRsnIe, &p_offset); + + } + + // 4. update the RSNIE length + *rsnielen_cur_p = p_offset; + + hex_dump("The primary RSNIE", pRsnIe, (*rsnielen_cur_p)); + + +} + +/* + ========================================================================== + Description: + Check whether the received frame is EAP frame. + + Arguments: + pAd - pointer to our pAdapter context + pEntry - pointer to active entry + pData - the received frame + DataByteCount - the received frame's length + FromWhichBSSID - indicate the interface index + + Return: + TRUE - This frame is EAP frame + FALSE - otherwise + ========================================================================== +*/ +BOOLEAN RTMPCheckWPAframe( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PUCHAR pData, + IN ULONG DataByteCount, + IN UCHAR FromWhichBSSID) +{ + ULONG Body_len; + BOOLEAN Cancelled; + + + if(DataByteCount < (LENGTH_802_1_H + LENGTH_EAPOL_H)) + return FALSE; + + + // Skip LLC header + if (NdisEqualMemory(SNAP_802_1H, pData, 6) || + // Cisco 1200 AP may send packet with SNAP_BRIDGE_TUNNEL + NdisEqualMemory(SNAP_BRIDGE_TUNNEL, pData, 6)) + { + pData += 6; + } + // Skip 2-bytes EAPoL type + if (NdisEqualMemory(EAPOL, pData, 2)) +// if (*(UINT16 *)EAPOL == *(UINT16 *)pData) + { + pData += 2; + } + else + return FALSE; + + switch (*(pData+1)) + { + case EAPPacket: + Body_len = (*(pData+2)<<8) | (*(pData+3)); + DBGPRINT(RT_DEBUG_TRACE, ("Receive EAP-Packet frame, TYPE = 0, Length = %ld\n", Body_len)); + break; + case EAPOLStart: + DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPOL-Start frame, TYPE = 1 \n")); + if (pEntry->EnqueueEapolStartTimerRunning != EAPOL_START_DISABLE) + { + DBGPRINT(RT_DEBUG_TRACE, ("Cancel the EnqueueEapolStartTimerRunning \n")); + RTMPCancelTimer(&pEntry->EnqueueStartForPSKTimer, &Cancelled); + pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE; + } + break; + case EAPOLLogoff: + DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPOLLogoff frame, TYPE = 2 \n")); + break; + case EAPOLKey: + Body_len = (*(pData+2)<<8) | (*(pData+3)); + DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPOL-Key frame, TYPE = 3, Length = %ld\n", Body_len)); + break; + case EAPOLASFAlert: + DBGPRINT(RT_DEBUG_TRACE, ("Receive EAPOLASFAlert frame, TYPE = 4 \n")); + break; + default: + return FALSE; + + } + return TRUE; +} + +/* + ========================================================================== + Description: + Report the EAP message type + + Arguments: + msg - EAPOL_PAIR_MSG_1 + EAPOL_PAIR_MSG_2 + EAPOL_PAIR_MSG_3 + EAPOL_PAIR_MSG_4 + EAPOL_GROUP_MSG_1 + EAPOL_GROUP_MSG_2 + + Return: + message type string + + ========================================================================== +*/ +PSTRING GetEapolMsgType(CHAR msg) +{ + if(msg == EAPOL_PAIR_MSG_1) + return "Pairwise Message 1"; + else if(msg == EAPOL_PAIR_MSG_2) + return "Pairwise Message 2"; + else if(msg == EAPOL_PAIR_MSG_3) + return "Pairwise Message 3"; + else if(msg == EAPOL_PAIR_MSG_4) + return "Pairwise Message 4"; + else if(msg == EAPOL_GROUP_MSG_1) + return "Group Message 1"; + else if(msg == EAPOL_GROUP_MSG_2) + return "Group Message 2"; + else + return "Invalid Message"; +} + + +/* + ======================================================================== + + Routine Description: + Check Sanity RSN IE of EAPoL message + + Arguments: + + Return Value: + + + ======================================================================== +*/ +BOOLEAN RTMPCheckRSNIE( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pData, + IN UCHAR DataLen, + IN MAC_TABLE_ENTRY *pEntry, + OUT UCHAR *Offset) +{ + PUCHAR pVIE; + UCHAR len; + PEID_STRUCT pEid; + BOOLEAN result = FALSE; + + pVIE = pData; + len = DataLen; + *Offset = 0; + + while (len > sizeof(RSNIE2)) + { + pEid = (PEID_STRUCT) pVIE; + // WPA RSN IE + if ((pEid->Eid == IE_WPA) && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4))) + { + if ((pEntry->AuthMode == Ndis802_11AuthModeWPA || pEntry->AuthMode == Ndis802_11AuthModeWPAPSK) && + (NdisEqualMemory(pVIE, pEntry->RSN_IE, pEntry->RSNIE_Len)) && + (pEntry->RSNIE_Len == (pEid->Len + 2))) + { + result = TRUE; + } + + *Offset += (pEid->Len + 2); + } + // WPA2 RSN IE, doesn't need to check RSNIE Capabilities field + else if ((pEid->Eid == IE_RSN) && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3))) + { + if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2 || pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK) && + (pEid->Eid == pEntry->RSN_IE[0]) && + ((pEid->Len + 2) >= pEntry->RSNIE_Len) && + (NdisEqualMemory(pEid->Octet, &pEntry->RSN_IE[2], pEntry->RSNIE_Len - 4))) + { + + result = TRUE; + } + + *Offset += (pEid->Len + 2); + } + else + { + break; + } + + pVIE += (pEid->Len + 2); + len -= (pEid->Len + 2); + } + + + return result; + +} + + +/* + ======================================================================== + + Routine Description: + Parse KEYDATA field. KEYDATA[] May contain 2 RSN IE and optionally GTK. + GTK is encaptulated in KDE format at p.83 802.11i D10 + + Arguments: + + Return Value: + + Note: + 802.11i D10 + + ======================================================================== +*/ +BOOLEAN RTMPParseEapolKeyData( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pKeyData, + IN UCHAR KeyDataLen, + IN UCHAR GroupKeyIndex, + IN UCHAR MsgType, + IN BOOLEAN bWPA2, + IN MAC_TABLE_ENTRY *pEntry) +{ + PUCHAR pMyKeyData = pKeyData; + UCHAR KeyDataLength = KeyDataLen; + UCHAR GTK[MAX_LEN_GTK]; + UCHAR GTKLEN = 0; + UCHAR DefaultIdx = 0; + UCHAR skip_offset = 0; + + // Verify The RSN IE contained in pairewise_msg_2 && pairewise_msg_3 and skip it + if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_3) + { + // Check RSN IE whether it is WPA2/WPA2PSK + if (!RTMPCheckRSNIE(pAd, pKeyData, KeyDataLen, pEntry, &skip_offset)) + { + // send wireless event - for RSN IE different + RTMPSendWirelessEvent(pAd, IW_RSNIE_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0); + + DBGPRINT(RT_DEBUG_ERROR, ("RSN_IE Different in msg %d of 4-way handshake!\n", MsgType)); + hex_dump("Receive RSN_IE ", pKeyData, KeyDataLen); + hex_dump("Desired RSN_IE ", pEntry->RSN_IE, pEntry->RSNIE_Len); + + return FALSE; + } + else + { + if (bWPA2 && MsgType == EAPOL_PAIR_MSG_3) + { + //WpaShowAllsuite(pMyKeyData, skip_offset); + + // skip RSN IE + pMyKeyData += skip_offset; + KeyDataLength -= skip_offset; + DBGPRINT(RT_DEBUG_TRACE, ("RTMPParseEapolKeyData ==> WPA2/WPA2PSK RSN IE matched in Msg 3, Length(%d) \n", skip_offset)); + } + else + return TRUE; + } + } + + DBGPRINT(RT_DEBUG_TRACE,("RTMPParseEapolKeyData ==> KeyDataLength %d without RSN_IE \n", KeyDataLength)); + //hex_dump("remain data", pMyKeyData, KeyDataLength); + + + // Parse KDE format in pairwise_msg_3_WPA2 && group_msg_1_WPA2 + if (bWPA2 && (MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1)) + { + PEID_STRUCT pEid; + + pEid = (PEID_STRUCT) pMyKeyData; + skip_offset = 0; + while ((skip_offset + 2 + pEid->Len) <= KeyDataLength) + { + switch(pEid->Eid) + { + case WPA_KDE_TYPE: + { + PKDE_HDR pKDE; + + pKDE = (PKDE_HDR)pEid; + if (NdisEqualMemory(pKDE->OUI, OUI_WPA2, 3)) + { + if (pKDE->DataType == KDE_GTK) + { + PGTK_KDE pKdeGtk; + + pKdeGtk = (PGTK_KDE) &pKDE->octet[0]; + DefaultIdx = pKdeGtk->Kid; + + /* Get GTK length - refer to IEEE 802.11i-2004 p.82 */ + GTKLEN = pKDE->Len -6; + if (GTKLEN < LEN_AES_TK) + { + DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key length is too short (%d) \n", GTKLEN)); + return FALSE; + } + NdisMoveMemory(GTK, pKdeGtk->GTK, GTKLEN); + DBGPRINT(RT_DEBUG_TRACE, ("GTK in KDE format ,DefaultKeyID=%d, KeyLen=%d \n", DefaultIdx, GTKLEN)); + } + } + } + break; + } + skip_offset = skip_offset + 2 + pEid->Len; + pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); + } + + // skip KDE Info + pMyKeyData += skip_offset; + KeyDataLength -= skip_offset; + } + else if (!bWPA2 && MsgType == EAPOL_GROUP_MSG_1) + { + DefaultIdx = GroupKeyIndex; + GTKLEN = KeyDataLength; + NdisMoveMemory(GTK, pMyKeyData, KeyDataLength); + DBGPRINT(RT_DEBUG_TRACE, ("GTK without KDE, DefaultKeyID=%d, KeyLen=%d \n", DefaultIdx, GTKLEN)); + } + + // Sanity check - shared key index must be 0 ~ 3 + if (DefaultIdx > 3) + { + DBGPRINT(RT_DEBUG_ERROR, ("ERROR: GTK Key index(%d) is invalid in %s %s \n", DefaultIdx, ((bWPA2) ? "WPA2" : "WPA"), GetEapolMsgType(MsgType))); + return FALSE; + } + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (ADHOC_ON(pAd)) { + if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled) { + NdisZeroMemory(&pEntry->RxGTK, sizeof(CIPHER_KEY)); + NdisMoveMemory(pEntry->RxGTK.Key, GTK, LEN_TK); + pEntry->RxGTK.CipherAlg = CIPHER_AES; + pEntry->RxGTK.KeyLen= LEN_TK; + } + } else { + // set key material, TxMic and RxMic + NdisMoveMemory(pAd->StaCfg.GTK, GTK, GTKLEN); + pAd->StaCfg.DefaultKeyId = DefaultIdx; + + WPAInstallSharedKey(pAd, + pAd->StaCfg.GroupCipher, + BSS0, + pAd->StaCfg.DefaultKeyId, + MCAST_WCID, + FALSE, + pAd->StaCfg.GTK); + } + } +#endif // CONFIG_STA_SUPPORT // + + return TRUE; + +} + +/* + ======================================================================== + + Routine Description: + Construct KDE common format + Its format is below, + + +--------------------+ + | Type (0xdd) | 1 octet + +--------------------+ + | Length | 1 octet + +--------------------+ + | OUI | 3 octets + +--------------------+ + | Data Type | 1 octet + +--------------------+ + + Arguments: + + Return Value: + + Note: + It's defined in IEEE 802.11-2007 Figure 8-25. + + ======================================================================== +*/ +VOID WPA_ConstructKdeHdr( + IN UINT8 data_type, + IN UINT8 data_len, + OUT PUCHAR pBuf) +{ + PKDE_HDR pHdr; + + pHdr = (PKDE_HDR)pBuf; + + NdisZeroMemory(pHdr, sizeof(KDE_HDR)); + + pHdr->Type = WPA_KDE_TYPE; + + /* The Length field specifies the number of octets in the OUI, Data + Type, and Data fields. */ + pHdr->Len = 4 + data_len; + + NdisMoveMemory(pHdr->OUI, OUI_WPA2, 3); + pHdr->DataType = data_type; + +} + + +/* + ======================================================================== + + Routine Description: + Construct EAPoL message for WPA handshaking + Its format is below, + + +--------------------+ + | Protocol Version | 1 octet + +--------------------+ + | Protocol Type | 1 octet + +--------------------+ + | Body Length | 2 octets + +--------------------+ + | Descriptor Type | 1 octet + +--------------------+ + | Key Information | 2 octets + +--------------------+ + | Key Length | 1 octet + +--------------------+ + | Key Repaly Counter | 8 octets + +--------------------+ + | Key Nonce | 32 octets + +--------------------+ + | Key IV | 16 octets + +--------------------+ + | Key RSC | 8 octets + +--------------------+ + | Key ID or Reserved | 8 octets + +--------------------+ + | Key MIC | 16 octets + +--------------------+ + | Key Data Length | 2 octets + +--------------------+ + | Key Data | n octets + +--------------------+ + + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID ConstructEapolMsg( + IN PMAC_TABLE_ENTRY pEntry, + IN UCHAR GroupKeyWepStatus, + IN UCHAR MsgType, + IN UCHAR DefaultKeyIdx, + IN UCHAR *KeyNonce, + IN UCHAR *TxRSC, + IN UCHAR *GTK, + IN UCHAR *RSNIE, + IN UCHAR RSNIE_Len, + OUT PEAPOL_PACKET pMsg) +{ + BOOLEAN bWPA2 = FALSE; + UCHAR KeyDescVer; + + // Choose WPA2 or not + if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || + (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)) + bWPA2 = TRUE; + + // Init Packet and Fill header + pMsg->ProVer = EAPOL_VER; + pMsg->ProType = EAPOLKey; + + // Default 95 bytes, the EAPoL-Key descriptor exclude Key-data field + SET_UINT16_TO_ARRARY(pMsg->Body_Len, MIN_LEN_OF_EAPOL_KEY_MSG); + + // Fill in EAPoL descriptor + if (bWPA2) + pMsg->KeyDesc.Type = WPA2_KEY_DESC; + else + pMsg->KeyDesc.Type = WPA1_KEY_DESC; + + // Key Descriptor Version (bits 0-2) specifies the key descriptor version type + { + // Fill in Key information, refer to IEEE Std 802.11i-2004 page 78 + // When either the pairwise or the group cipher is AES, the KEY_DESC_AES shall be used. + KeyDescVer = (((pEntry->WepStatus == Ndis802_11Encryption3Enabled) || + (GroupKeyWepStatus == Ndis802_11Encryption3Enabled)) ? (KEY_DESC_AES) : (KEY_DESC_TKIP)); + } + + pMsg->KeyDesc.KeyInfo.KeyDescVer = KeyDescVer; + + // Specify Key Type as Group(0) or Pairwise(1) + if (MsgType >= EAPOL_GROUP_MSG_1) + pMsg->KeyDesc.KeyInfo.KeyType = GROUPKEY; + else + pMsg->KeyDesc.KeyInfo.KeyType = PAIRWISEKEY; + + // Specify Key Index, only group_msg1_WPA1 + if (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1)) + pMsg->KeyDesc.KeyInfo.KeyIndex = DefaultKeyIdx; + + if (MsgType == EAPOL_PAIR_MSG_3) + pMsg->KeyDesc.KeyInfo.Install = 1; + + if ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3) || (MsgType == EAPOL_GROUP_MSG_1)) + pMsg->KeyDesc.KeyInfo.KeyAck = 1; + + if (MsgType != EAPOL_PAIR_MSG_1) + pMsg->KeyDesc.KeyInfo.KeyMic = 1; + + if ((bWPA2 && (MsgType >= EAPOL_PAIR_MSG_3)) || + (!bWPA2 && (MsgType >= EAPOL_GROUP_MSG_1))) + { + pMsg->KeyDesc.KeyInfo.Secure = 1; + } + + /* This subfield shall be set, and the Key Data field shall be encrypted, if + any key material (e.g., GTK or SMK) is included in the frame. */ + if (bWPA2 && ((MsgType == EAPOL_PAIR_MSG_3) || + (MsgType == EAPOL_GROUP_MSG_1))) + { + pMsg->KeyDesc.KeyInfo.EKD_DL = 1; + } + + // key Information element has done. + *(USHORT *)(&pMsg->KeyDesc.KeyInfo) = cpu2le16(*(USHORT *)(&pMsg->KeyDesc.KeyInfo)); + + // Fill in Key Length + if (bWPA2) + { + // In WPA2 mode, the field indicates the length of pairwise key cipher, + // so only pairwise_msg_1 and pairwise_msg_3 need to fill. + if ((MsgType == EAPOL_PAIR_MSG_1) || (MsgType == EAPOL_PAIR_MSG_3)) + pMsg->KeyDesc.KeyLength[1] = ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_TK : LEN_AES_TK); + } + else if (!bWPA2) + { + if (MsgType >= EAPOL_GROUP_MSG_1) + { + // the length of group key cipher + pMsg->KeyDesc.KeyLength[1] = ((GroupKeyWepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_GTK : LEN_AES_GTK); + } + else + { + // the length of pairwise key cipher + pMsg->KeyDesc.KeyLength[1] = ((pEntry->WepStatus == Ndis802_11Encryption2Enabled) ? LEN_TKIP_TK : LEN_AES_TK); + } + } + + // Fill in replay counter + NdisMoveMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY); + + // Fill Key Nonce field + // ANonce : pairwise_msg1 & pairwise_msg3 + // SNonce : pairwise_msg2 + // GNonce : group_msg1_wpa1 + if ((MsgType <= EAPOL_PAIR_MSG_3) || ((!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1)))) + NdisMoveMemory(pMsg->KeyDesc.KeyNonce, KeyNonce, LEN_KEY_DESC_NONCE); + + // Fill key IV - WPA2 as 0, WPA1 as random + if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1)) + { + // Suggest IV be random number plus some number, + NdisMoveMemory(pMsg->KeyDesc.KeyIv, &KeyNonce[16], LEN_KEY_DESC_IV); + pMsg->KeyDesc.KeyIv[15] += 2; + } + + // Fill Key RSC field + // It contains the RSC for the GTK being installed. + if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1)) + { + NdisMoveMemory(pMsg->KeyDesc.KeyRsc, TxRSC, 6); + } + + // Clear Key MIC field for MIC calculation later + NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC); + + ConstructEapolKeyData(pEntry, + GroupKeyWepStatus, + KeyDescVer, + MsgType, + DefaultKeyIdx, + GTK, + RSNIE, + RSNIE_Len, + pMsg); + + // Calculate MIC and fill in KeyMic Field except Pairwise Msg 1. + if (MsgType != EAPOL_PAIR_MSG_1) + { + CalculateMIC(KeyDescVer, pEntry->PTK, pMsg); + } + + DBGPRINT(RT_DEBUG_TRACE, ("===> ConstructEapolMsg for %s %s\n", ((bWPA2) ? "WPA2" : "WPA"), GetEapolMsgType(MsgType))); + DBGPRINT(RT_DEBUG_TRACE, (" Body length = %d \n", CONV_ARRARY_TO_UINT16(pMsg->Body_Len))); + DBGPRINT(RT_DEBUG_TRACE, (" Key length = %d \n", CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyLength))); + + +} + +/* + ======================================================================== + + Routine Description: + Construct the Key Data field of EAPoL message + + Arguments: + pAd Pointer to our adapter + Elem Message body + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID ConstructEapolKeyData( + IN PMAC_TABLE_ENTRY pEntry, + IN UCHAR GroupKeyWepStatus, + IN UCHAR keyDescVer, + IN UCHAR MsgType, + IN UCHAR DefaultKeyIdx, + IN UCHAR *GTK, + IN UCHAR *RSNIE, + IN UCHAR RSNIE_LEN, + OUT PEAPOL_PACKET pMsg) +{ + UCHAR *mpool, *Key_Data, *eGTK; + ULONG data_offset; + BOOLEAN bWPA2Capable = FALSE; + BOOLEAN GTK_Included = FALSE; + + // Choose WPA2 or not + if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || + (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK)) + bWPA2Capable = TRUE; + + if (MsgType == EAPOL_PAIR_MSG_1 || + MsgType == EAPOL_PAIR_MSG_4 || + MsgType == EAPOL_GROUP_MSG_2) + return; + + // allocate memory pool + os_alloc_mem(NULL, (PUCHAR *)&mpool, 1500); + + if (mpool == NULL) + return; + + /* eGTK Len = 512 */ + eGTK = (UCHAR *) ROUND_UP(mpool, 4); + /* Key_Data Len = 512 */ + Key_Data = (UCHAR *) ROUND_UP(eGTK + 512, 4); + + NdisZeroMemory(Key_Data, 512); + SET_UINT16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, 0); + data_offset = 0; + + // Encapsulate RSNIE in pairwise_msg2 & pairwise_msg3 + if (RSNIE_LEN && ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3))) + { + PUINT8 pmkid_ptr = NULL; + UINT8 pmkid_len = 0; + + + RTMPInsertRSNIE(&Key_Data[data_offset], + &data_offset, + RSNIE, + RSNIE_LEN, + pmkid_ptr, + pmkid_len); + } + + + // Encapsulate GTK + // Only for pairwise_msg3_WPA2 and group_msg1 + if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2Capable) || (MsgType == EAPOL_GROUP_MSG_1)) + { + UINT8 gtk_len; + + /* Decide the GTK length */ + if (GroupKeyWepStatus == Ndis802_11Encryption3Enabled) + gtk_len = LEN_AES_GTK; + else + gtk_len = LEN_TKIP_GTK; + + /* Insert GTK KDE format in WAP2 mode */ + if (bWPA2Capable) + { + /* Construct the common KDE format */ + WPA_ConstructKdeHdr(KDE_GTK, 2 + gtk_len, &Key_Data[data_offset]); + data_offset += sizeof(KDE_HDR); + + // GTK KDE format - 802.11i-2004 Figure-43x + Key_Data[data_offset] = (DefaultKeyIdx & 0x03); + Key_Data[data_offset + 1] = 0x00; // Reserved Byte + data_offset += 2; + } + + /* Fill in GTK */ + NdisMoveMemory(&Key_Data[data_offset], GTK, gtk_len); + data_offset += gtk_len; + + + GTK_Included = TRUE; + } + + + + /* If the Encrypted Key Data subfield (of the Key Information field) + is set, the entire Key Data field shall be encrypted. */ + // This whole key-data field shall be encrypted if a GTK is included. + // Encrypt the data material in key data field with KEK + if (GTK_Included) + { + //hex_dump("GTK_Included", Key_Data, data_offset); + + if ( + (keyDescVer == KEY_DESC_AES)) + { + UCHAR remainder = 0; + UCHAR pad_len = 0; + UINT wrap_len =0; + + // Key Descriptor Version 2 or 3: AES key wrap, defined in IETF RFC 3394, + // shall be used to encrypt the Key Data field using the KEK field from + // the derived PTK. + + // If the Key Data field uses the NIST AES key wrap, then the Key Data field + // shall be padded before encrypting if the key data length is less than 16 + // octets or if it is not a multiple of 8. The padding consists of appending + // a single octet 0xdd followed by zero or more 0x00 octets. + if ((remainder = data_offset & 0x07) != 0) + { + INT i; + + pad_len = (8 - remainder); + Key_Data[data_offset] = 0xDD; + for (i = 1; i < pad_len; i++) + Key_Data[data_offset + i] = 0; + + data_offset += pad_len; + } + + AES_Key_Wrap(Key_Data, (UINT) data_offset, + &pEntry->PTK[LEN_PTK_KCK], LEN_PTK_KEK, + eGTK, &wrap_len); + data_offset = wrap_len; + + } + else + { + TKIP_GTK_KEY_WRAP(&pEntry->PTK[LEN_PTK_KCK], + pMsg->KeyDesc.KeyIv, + Key_Data, + data_offset, + eGTK); + } + + NdisMoveMemory(pMsg->KeyDesc.KeyData, eGTK, data_offset); + } + else + { + NdisMoveMemory(pMsg->KeyDesc.KeyData, Key_Data, data_offset); + } + + // Update key data length field and total body length + SET_UINT16_TO_ARRARY(pMsg->KeyDesc.KeyDataLen, data_offset); + INC_UINT16_TO_ARRARY(pMsg->Body_Len, data_offset); + + os_free_mem(NULL, mpool); + +} + +/* + ======================================================================== + + Routine Description: + Calcaulate MIC. It is used during 4-ways handsharking. + + Arguments: + pAd - pointer to our pAdapter context + PeerWepStatus - indicate the encryption type + + Return Value: + + Note: + The EAPOL-Key MIC is a MIC of the EAPOL-Key frames, + from and including the EAPOL protocol version field + to and including the Key Data field, calculated with + the Key MIC field set to 0. + + ======================================================================== +*/ +VOID CalculateMIC( + IN UCHAR KeyDescVer, + IN UCHAR *PTK, + OUT PEAPOL_PACKET pMsg) +{ + UCHAR *OutBuffer; + ULONG FrameLen = 0; + UCHAR mic[LEN_KEY_DESC_MIC]; + UCHAR digest[80]; + + // allocate memory for MIC calculation + os_alloc_mem(NULL, (PUCHAR *)&OutBuffer, 512); + + if (OutBuffer == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!CalculateMIC: no memory!!!\n")); + return; + } + + // make a frame for calculating MIC. + MakeOutgoingFrame(OutBuffer, &FrameLen, + CONV_ARRARY_TO_UINT16(pMsg->Body_Len) + 4, pMsg, + END_OF_ARGS); + + NdisZeroMemory(mic, sizeof(mic)); + + // Calculate MIC + if (KeyDescVer == KEY_DESC_AES) + { + RT_HMAC_SHA1(PTK, LEN_PTK_KCK, OutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE); + NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC); + } + else + { + RT_HMAC_MD5(PTK, LEN_PTK_KCK, OutBuffer, FrameLen, mic, MD5_DIGEST_SIZE); + } + + // store the calculated MIC + NdisMoveMemory(pMsg->KeyDesc.KeyMic, mic, LEN_KEY_DESC_MIC); + + os_free_mem(NULL, OutBuffer); +} + +UCHAR RTMPExtractKeyIdxFromIVHdr( + IN PUCHAR pIV, + IN UINT8 CipherAlg) +{ + UCHAR keyIdx = 0xFF; + + /* extract the key index from IV header */ + switch (CipherAlg) + { + case Ndis802_11Encryption1Enabled: + case Ndis802_11Encryption2Enabled: + case Ndis802_11Encryption3Enabled: + keyIdx = (*(pIV + 3) & 0xc0) >> 6; + break; + + } + + return keyIdx; + +} + +PCIPHER_KEY RTMPSwCipherKeySelection( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pIV, + IN RX_BLK *pRxBlk, + IN PMAC_TABLE_ENTRY pEntry) +{ + PCIPHER_KEY pKey = NULL; + UCHAR keyIdx = 0; + UINT8 CipherAlg = Ndis802_11EncryptionDisabled; + PRT28XX_RXD_STRUC pRxD = &(pRxBlk->RxD); + + if ((pEntry == NULL) || + (RX_BLK_TEST_FLAG(pRxBlk, fRX_APCLI)) || + (RX_BLK_TEST_FLAG(pRxBlk, fRX_WDS)) || + (RX_BLK_TEST_FLAG(pRxBlk, fRX_MESH))) + return NULL; + + if (pRxD->U2M) + { + CipherAlg = pEntry->WepStatus; + } + else + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + CipherAlg = pAd->StaCfg.GroupCipher; + } +#endif // CONFIG_STA_SUPPORT // + } + + if ((keyIdx = RTMPExtractKeyIdxFromIVHdr(pIV, CipherAlg)) > 3) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : Invalid key index(%d) !!!\n", + __FUNCTION__, keyIdx)); + return NULL; + } + + if (CipherAlg == Ndis802_11Encryption1Enabled) + { + pKey = &pAd->SharedKey[pEntry->apidx][keyIdx]; + } + else if ((CipherAlg == Ndis802_11Encryption2Enabled) || + (CipherAlg == Ndis802_11Encryption3Enabled)) + { + if (pRxD->U2M) + pKey = &pEntry->PairwiseKey; + else + pKey = &pAd->SharedKey[pEntry->apidx][keyIdx]; + } + + return pKey; + +} + +/* + ======================================================================== + + Routine Description: + Some received frames can't decrypt by Asic, so decrypt them by software. + + Arguments: + pAd - pointer to our pAdapter context + PeerWepStatus - indicate the encryption type + + Return Value: + NDIS_STATUS_SUCCESS - decryption successful + NDIS_STATUS_FAILURE - decryption failure + + ======================================================================== +*/ +NDIS_STATUS RTMPSoftDecryptionAction( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHdr, + IN UCHAR UserPriority, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + INOUT UINT16 *DataByteCnt) +{ + switch (pKey->CipherAlg) + { + case CIPHER_WEP64: + case CIPHER_WEP128: + /* handle WEP decryption */ + if (RTMPSoftDecryptWEP(pAd, pKey, pData, &(*DataByteCnt)) == FALSE) + { + DBGPRINT(RT_DEBUG_ERROR, ("ERROR : SW decrypt WEP data fails.\n")); + // give up this frame + return NDIS_STATUS_FAILURE; + } + break; + + case CIPHER_TKIP: + /* handle TKIP decryption */ + if (RTMPSoftDecryptTKIP(pAd, pHdr, UserPriority, + pKey, pData, &(*DataByteCnt)) == FALSE) + { + DBGPRINT(RT_DEBUG_ERROR, ("ERROR : SW decrypt TKIP data fails.\n")); + // give up this frame + return NDIS_STATUS_FAILURE; + } + break; + + case CIPHER_AES: + /* handle AES decryption */ + if (RTMPSoftDecryptCCMP(pAd, pHdr, pKey, pData, &(*DataByteCnt)) == FALSE) + { + DBGPRINT(RT_DEBUG_ERROR, ("ERROR : SW decrypt AES data fails.\n")); + // give up this frame + return NDIS_STATUS_FAILURE; + } + break; + default: + // give up this frame + return NDIS_STATUS_FAILURE; + break; + } + + return NDIS_STATUS_SUCCESS; + +} + +VOID RTMPSoftConstructIVHdr( + IN UCHAR CipherAlg, + IN UCHAR key_id, + IN PUCHAR pTxIv, + OUT PUCHAR pHdrIv, + OUT UINT8 *hdr_iv_len) +{ + *hdr_iv_len = 0; + + if ((CipherAlg == CIPHER_WEP64) || (CipherAlg == CIPHER_WEP128)) + { + /* Construct and insert 4-bytes WEP IV header to MPDU header */ + RTMPConstructWEPIVHdr(key_id, pTxIv, pHdrIv); + *hdr_iv_len = LEN_WEP_IV_HDR; + } + else if (CipherAlg == CIPHER_TKIP) + ; + else if (CipherAlg == CIPHER_AES) + { + /* Construct and insert 8-bytes CCMP header to MPDU header */ + RTMPConstructCCMPHdr(key_id, pTxIv, pHdrIv); + *hdr_iv_len = LEN_CCMP_HDR; + } + +} + +VOID RTMPSoftEncryptionAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR CipherAlg, + IN PUCHAR pHdr, + IN PUCHAR pSrcBufData, + IN UINT32 SrcBufLen, + IN UCHAR KeyIdx, + IN PCIPHER_KEY pKey, + OUT UINT8 *ext_len) +{ + *ext_len = 0; + + if ((CipherAlg == CIPHER_WEP64) || (CipherAlg == CIPHER_WEP128)) + { + // Encrypt the MPDU data by software + RTMPSoftEncryptWEP(pAd, + pKey->TxTsc, + pKey, + pSrcBufData, + SrcBufLen); + + *ext_len = LEN_ICV; + } + else if (CipherAlg == CIPHER_TKIP) + ; + else if (CipherAlg == CIPHER_AES) + { + // Encrypt the MPDU data by software + RTMPSoftEncryptCCMP(pAd, + pHdr, + pKey->TxTsc, + pKey->Key, + pSrcBufData, + SrcBufLen); + + *ext_len = LEN_CCMP_MIC; + } + +} + +PUINT8 WPA_ExtractSuiteFromRSNIE( + IN PUINT8 rsnie, + IN UINT rsnie_len, + IN UINT8 type, + OUT UINT8 *count) +{ + PEID_STRUCT pEid; + INT len; + PUINT8 pBuf; + INT offset = 0; + + pEid = (PEID_STRUCT)rsnie; + len = rsnie_len - 2; // exclude IE and length + pBuf = (PUINT8)&pEid->Octet[0]; + + // set default value + *count = 0; + + // Check length + if ((len <= 0) || (pEid->Len != len)) + { + DBGPRINT_ERR(("%s : The length is invalid\n", __FUNCTION__)); + goto out; + } + + // Check WPA or WPA2 + if (pEid->Eid == IE_WPA) + { + /* Check the length */ + if (len < sizeof(RSNIE)) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The length is too short for WPA\n", __FUNCTION__)); + goto out; + } + else + { + PRSNIE pRsnie; + UINT16 u_cnt; + + pRsnie = (PRSNIE)pBuf; + u_cnt = cpu2le16(pRsnie->ucount); + offset = sizeof(RSNIE) + (LEN_OUI_SUITE * (u_cnt - 1)); + + if (len < offset) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The expected lenght(%d) exceed the remaining length(%d) for WPA-RSN \n", + __FUNCTION__, offset, len)); + goto out; + } + else + { + // Get the group cipher + if (type == GROUP_SUITE) + { + *count = 1; + return pRsnie->mcast; + } + // Get the pairwise cipher suite + else if (type == PAIRWISE_SUITE) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s : The count of pairwise cipher is %d\n", + __FUNCTION__, u_cnt)); + *count = u_cnt; + return pRsnie->ucast[0].oui; + } + } + } + } + else if (pEid->Eid == IE_RSN) + { + if (len < sizeof(RSNIE2)) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The length is too short for WPA2\n", __FUNCTION__)); + goto out; + } + else + { + PRSNIE2 pRsnie2; + UINT16 u_cnt; + + pRsnie2 = (PRSNIE2)pBuf; + u_cnt = cpu2le16(pRsnie2->ucount); + offset = sizeof(RSNIE2) + (LEN_OUI_SUITE * (u_cnt - 1)); + + if (len < offset) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The expected lenght(%d) exceed the remaining length(%d) for WPA2-RSN \n", + __FUNCTION__, offset, len)); + goto out; + } + else + { + // Get the group cipher + if (type == GROUP_SUITE) + { + *count = 1; + return pRsnie2->mcast; + } + // Get the pairwise cipher suite + else if (type == PAIRWISE_SUITE) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s : The count of pairwise cipher is %d\n", + __FUNCTION__, u_cnt)); + *count = u_cnt; + return pRsnie2->ucast[0].oui; + } + } + } + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : Unknown IE (%d)\n", __FUNCTION__, pEid->Eid)); + goto out; + } + + // skip group cipher and pairwise cipher suite + pBuf += offset; + len -= offset; + + /* Ready to extract the AKM information and its count */ + if (len < sizeof(RSNIE_AUTH)) + { + DBGPRINT_ERR(("%s : The length of AKM of RSN is too short\n", __FUNCTION__)); + goto out; + } + else + { + PRSNIE_AUTH pAkm; + UINT16 a_cnt; + + /* pointer to AKM count */ + pAkm = (PRSNIE_AUTH)pBuf; + a_cnt = cpu2le16(pAkm->acount); + offset = sizeof(RSNIE_AUTH) + (LEN_OUI_SUITE * (a_cnt - 1)); + + if (len < offset) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The expected lenght(%d) exceed the remaining length(%d) for AKM \n", + __FUNCTION__, offset, len)); + goto out; + } + else + { + /* Get the AKM suite */ + if (type == AKM_SUITE) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s : The count of AKM is %d\n", + __FUNCTION__, a_cnt)); + *count = a_cnt; + return pAkm->auth[0].oui; + } + } + } + + /* For WPA1, the remaining shall be ignored. */ + if (pEid->Eid == IE_WPA) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s : The remaining shall be ignored in WPA mode\n", + __FUNCTION__)); + goto out; + } + + /* skip the AKM capability */ + pBuf += offset; + len -= offset; + + /* Parse the RSN Capabilities */ + if (len < sizeof(RSN_CAPABILITIES)) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s : The peer RSNIE doesn't include RSN-Cap\n", __FUNCTION__)); + goto out; + } + else + { + /* Report the content of the RSN capabilities */ + if (type == RSN_CAP_INFO) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s : Extract RSN Capabilities\n", __FUNCTION__)); + *count = 1; + return pBuf; + } + + /* skip RSN capability (2-bytes) */ + offset = sizeof(RSN_CAPABILITIES); + pBuf += offset; + len -= offset; + } + + /* Extract PMKID-list field */ + if (len < sizeof(UINT16)) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s : The peer RSNIE doesn't include PMKID list Count\n", __FUNCTION__)); + goto out; + } + else + { + UINT16 p_count; + PUINT8 pPmkidList = NULL; + + NdisMoveMemory(&p_count, pBuf, sizeof(UINT16)); + p_count = cpu2le16(p_count); + + /* Get count of the PMKID list */ + if (p_count > 0) + { + PRSNIE_PMKID pRsnPmkid; + + /* the expected length of PMKID-List field */ + offset = sizeof(RSNIE_PMKID) + (LEN_PMKID * (p_count - 1)); + + /* sanity check about the length of PMKID-List field */ + if (len < offset) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The expected lenght(%d) exceed the remaining length(%d) in PMKID-field \n", + __FUNCTION__, offset, len)); + goto out; + } + + /* pointer to PMKID field */ + pRsnPmkid = (PRSNIE_PMKID)pBuf; + pPmkidList = pRsnPmkid->pmkid[0].list; + + } + else + { + /* The PMKID field shall be without PMKID-List */ + offset = sizeof(UINT16); + pPmkidList = NULL; + } + + + /* Extract PMKID list and its count */ + if (type == PMKID_LIST) + { + *count = p_count; + return pPmkidList; + } + + /* skip the PMKID field */ + pBuf += offset; + len -= offset; + + } + + +out: + *count = 0; + return NULL; + +} + +VOID WpaShowAllsuite( + IN PUINT8 rsnie, + IN UINT rsnie_len) +{ + PUINT8 pSuite = NULL; + UINT8 count; + + hex_dump("RSNIE", rsnie, rsnie_len); + + // group cipher + if ((pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, GROUP_SUITE, &count)) != NULL) + { + hex_dump("group cipher", pSuite, 4*count); + } + + // pairwise cipher + if ((pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, PAIRWISE_SUITE, &count)) != NULL) + { + hex_dump("pairwise cipher", pSuite, 4*count); + } + + // AKM + if ((pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, AKM_SUITE, &count)) != NULL) + { + hex_dump("AKM suite", pSuite, 4*count); + } + + // PMKID + if ((pSuite = WPA_ExtractSuiteFromRSNIE(rsnie, rsnie_len, PMKID_LIST, &count)) != NULL) + { + hex_dump("PMKID", pSuite, LEN_PMKID); + } + +} + +VOID RTMPInsertRSNIE( + IN PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN PUINT8 rsnie_ptr, + IN UINT8 rsnie_len, + IN PUINT8 pmkid_ptr, + IN UINT8 pmkid_len) +{ + PUCHAR pTmpBuf; + ULONG TempLen = 0; + UINT8 extra_len = 0; + UINT16 pmk_count = 0; + UCHAR ie_num; + UINT8 total_len = 0; + UCHAR WPA2_OUI[3]={0x00,0x0F,0xAC}; + + pTmpBuf = pFrameBuf; + + /* PMKID-List Must larger than 0 and the multiple of 16. */ + if (pmkid_len > 0 && ((pmkid_len & 0x0f) == 0)) + { + extra_len = sizeof(UINT16) + pmkid_len; + + pmk_count = (pmkid_len >> 4); + pmk_count = cpu2le16(pmk_count); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("%s : The length is PMKID-List is invalid (%d), so don't insert it.\n", + __FUNCTION__, pmkid_len)); + } + + if (rsnie_len != 0) + { + ie_num = IE_WPA; + total_len = rsnie_len; + + if (NdisEqualMemory(rsnie_ptr + 2, WPA2_OUI, sizeof(WPA2_OUI))) + { + ie_num = IE_RSN; + total_len += extra_len; + } + + /* construct RSNIE body */ + MakeOutgoingFrame(pTmpBuf, &TempLen, + 1, &ie_num, + 1, &total_len, + rsnie_len, rsnie_ptr, + END_OF_ARGS); + + pTmpBuf += TempLen; + *pFrameLen = *pFrameLen + TempLen; + + if (ie_num == IE_RSN) + { + /* Insert PMKID-List field */ + if (extra_len > 0) + { + MakeOutgoingFrame(pTmpBuf, &TempLen, + 2, &pmk_count, + pmkid_len, pmkid_ptr, + END_OF_ARGS); + + pTmpBuf += TempLen; + *pFrameLen = *pFrameLen + TempLen; + } + } + } + + return; +} + + +VOID WPAInstallPairwiseKey( + PRTMP_ADAPTER pAd, + UINT8 BssIdx, + PMAC_TABLE_ENTRY pEntry, + BOOLEAN bAE) +{ + NdisZeroMemory(&pEntry->PairwiseKey, sizeof(CIPHER_KEY)); + + /* Assign the pairwise cipher algorithm */ + if (pEntry->WepStatus == Ndis802_11Encryption2Enabled) + pEntry->PairwiseKey.CipherAlg = CIPHER_TKIP; + else if (pEntry->WepStatus == Ndis802_11Encryption3Enabled) + pEntry->PairwiseKey.CipherAlg = CIPHER_AES; + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : fails (wcid-%d)\n", + __FUNCTION__, pEntry->Aid)); + return; + } + + /* Assign key material and its length */ + pEntry->PairwiseKey.KeyLen = LEN_TK; + NdisMoveMemory(pEntry->PairwiseKey.Key, &pEntry->PTK[OFFSET_OF_PTK_TK], LEN_TK); + if (pEntry->PairwiseKey.CipherAlg == CIPHER_TKIP) + { + if (bAE) + { + NdisMoveMemory(pEntry->PairwiseKey.TxMic, &pEntry->PTK[OFFSET_OF_AP_TKIP_TX_MIC], LEN_TKIP_MIC); + NdisMoveMemory(pEntry->PairwiseKey.RxMic, &pEntry->PTK[OFFSET_OF_AP_TKIP_RX_MIC], LEN_TKIP_MIC); + } + else + { + NdisMoveMemory(pEntry->PairwiseKey.TxMic, &pEntry->PTK[OFFSET_OF_STA_TKIP_TX_MIC], LEN_TKIP_MIC); + NdisMoveMemory(pEntry->PairwiseKey.RxMic, &pEntry->PTK[OFFSET_OF_STA_TKIP_RX_MIC], LEN_TKIP_MIC); + } + } + +#ifdef SOFT_ENCRYPT + if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT)) + { + DBGPRINT(RT_DEBUG_TRACE, ("===> SW_ENC ON(wcid=%d) \n", pEntry->Aid)); + NdisZeroMemory(pEntry->PairwiseKey.TxTsc, LEN_WPA_TSC); + NdisZeroMemory(pEntry->PairwiseKey.RxTsc, LEN_WPA_TSC); + } + else +#endif // SOFT_ENCRYPT // + { + /* Add Pair-wise key to Asic */ + AsicAddPairwiseKeyEntry( + pAd, + (UCHAR)pEntry->Aid, + &pEntry->PairwiseKey); + + RTMPSetWcidSecurityInfo(pAd, + BssIdx, + 0, + pEntry->PairwiseKey.CipherAlg, + (UCHAR)pEntry->Aid, + PAIRWISEKEYTABLE); + } + +} + +VOID WPAInstallSharedKey( + PRTMP_ADAPTER pAd, + UINT8 GroupCipher, + UINT8 BssIdx, + UINT8 KeyIdx, + UINT8 Wcid, + BOOLEAN bAE, + PUINT8 pGtk) +{ + PCIPHER_KEY pSharedKey; + + if (BssIdx >= MAX_MBSSID_NUM) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : The BSS-index(%d) is out of range for MBSSID link. \n", + __FUNCTION__, BssIdx)); + return; + } + + pSharedKey = &pAd->SharedKey[BssIdx][KeyIdx]; + NdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY)); + + if (GroupCipher == Ndis802_11Encryption2Enabled) + pSharedKey->CipherAlg = CIPHER_TKIP; + else if (GroupCipher == Ndis802_11Encryption3Enabled) + pSharedKey->CipherAlg = CIPHER_AES; + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : fails (IF/ra%d) \n", + __FUNCTION__, BssIdx)); + return; + } + + pSharedKey->KeyLen = LEN_TK; + NdisMoveMemory(pSharedKey->Key, pGtk, LEN_TK); + if (pSharedKey->CipherAlg == CIPHER_TKIP) + { + if (bAE) + { + NdisMoveMemory(pSharedKey->TxMic, pGtk + 16, LEN_TKIP_MIC); + NdisMoveMemory(pSharedKey->RxMic, pGtk + 24, LEN_TKIP_MIC); + } + else + { + NdisMoveMemory(pSharedKey->TxMic, pGtk + 24, LEN_TKIP_MIC); + NdisMoveMemory(pSharedKey->RxMic, pGtk + 16, LEN_TKIP_MIC); + } + } + + /* Update group key table(0x6C00) and group key mode(0x7000) */ + AsicAddSharedKeyEntry( + pAd, + BssIdx, + KeyIdx, + pSharedKey); + + /* When Wcid isn't zero, it means that this is a Authenticator Role. + Only Authenticator entity needs to set HW IE/EIV table (0x6000) + and WCID attribute table (0x6800) for group key. */ + if (Wcid != 0) + { + RTMPSetWcidSecurityInfo(pAd, + BssIdx, + KeyIdx, + pSharedKey->CipherAlg, + Wcid, + SHAREDKEYTABLE); + } +} + +VOID RTMPSetWcidSecurityInfo( + PRTMP_ADAPTER pAd, + UINT8 BssIdx, + UINT8 KeyIdx, + UINT8 CipherAlg, + UINT8 Wcid, + UINT8 KeyTabFlag) +{ + UINT32 IV = 0; + UINT8 IV_KEYID = 0; + + /* Prepare initial IV value */ + if (CipherAlg == CIPHER_WEP64 || CipherAlg == CIPHER_WEP128) + { + INT i; + UCHAR TxTsc[LEN_WEP_TSC]; + + /* Generate 3-bytes IV randomly for encryption using */ + for(i = 0; i < LEN_WEP_TSC; i++) + TxTsc[i] = RandomByte(pAd); + + /* Update HW IVEIV table */ + IV_KEYID = (KeyIdx << 6); + IV = (IV_KEYID << 24) | + (TxTsc[2] << 16) | + (TxTsc[1] << 8) | + (TxTsc[0]); + } + else if (CipherAlg == CIPHER_TKIP || CipherAlg == CIPHER_AES) + { + /* Set IVEIV as 1 in Asic - + In IEEE 802.11-2007 8.3.3.4.3 described : + The PN shall be implemented as a 48-bit monotonically incrementing + non-negative integer, initialized to 1 when the corresponding + temporal key is initialized or refreshed. */ + IV_KEYID = (KeyIdx << 6) | 0x20; + IV = (IV_KEYID << 24) | 1; + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : Unsupport cipher Alg (%d) for Wcid-%d \n", + __FUNCTION__, CipherAlg, Wcid)); + return; + } + /* Update WCID IV/EIV table */ + AsicUpdateWCIDIVEIV(pAd, Wcid, IV, 0); + + /* Update WCID attribute entry */ + AsicUpdateWcidAttributeEntry(pAd, + BssIdx, + KeyIdx, + CipherAlg, + Wcid, + KeyTabFlag); + +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_aes.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_aes.c new file mode 100644 index 000000000..6098ac168 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_aes.c @@ -0,0 +1,3504 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + + +#include "crypt_aes.h" + + +#define assert(a) //ASSERT(a) + +#undef u32 +#define u32 unsigned int +//typedef unsigned int u32; + +static const u32 Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +static const u32 Te1[256] = { + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; +static const u32 Te2[256] = { + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; +static const u32 Te3[256] = { + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; + +static const u32 Te4[256] = { + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, +}; + +static const u32 Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +static const u32 Td1[256] = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; +static const u32 Td2[256] = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; +static const u32 Td3[256] = { + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; + +static const u32 Td4[256] = { + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, +}; + +static const u32 rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +/* + * Encrypt a single block + * in and out can overlap + */ +void evp_aes_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) +{ + + const u32 *rk; + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + assert(in && out && key); + rk = key->rd_key; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(in ) ^ rk[0]; + s1 = GETU32(in + 4) ^ rk[1]; + s2 = GETU32(in + 8) ^ rk[2]; + s3 = GETU32(in + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; + if (key->rounds > 10) { + /* round 10: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; + if (key->rounds > 12) { + /* round 12: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; + } + } + rk += key->rounds << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = key->rounds >> 1; + for (;;) { + t0 = + Te0[(s0 >> 24) ] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ + Te3[(s3 ) & 0xff] ^ + rk[4]; + t1 = + Te0[(s1 >> 24) ] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ + Te3[(s0 ) & 0xff] ^ + rk[5]; + t2 = + Te0[(s2 >> 24) ] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ + Te3[(s1 ) & 0xff] ^ + rk[6]; + t3 = + Te0[(s3 >> 24) ] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ + Te3[(s2 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Te0[(t0 >> 24) ] ^ + Te1[(t1 >> 16) & 0xff] ^ + Te2[(t2 >> 8) & 0xff] ^ + Te3[(t3 ) & 0xff] ^ + rk[0]; + s1 = + Te0[(t1 >> 24) ] ^ + Te1[(t2 >> 16) & 0xff] ^ + Te2[(t3 >> 8) & 0xff] ^ + Te3[(t0 ) & 0xff] ^ + rk[1]; + s2 = + Te0[(t2 >> 24) ] ^ + Te1[(t3 >> 16) & 0xff] ^ + Te2[(t0 >> 8) & 0xff] ^ + Te3[(t1 ) & 0xff] ^ + rk[2]; + s3 = + Te0[(t3 >> 24) ] ^ + Te1[(t0 >> 16) & 0xff] ^ + Te2[(t1 >> 8) & 0xff] ^ + Te3[(t2 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Te4[(t0 >> 24) ] & 0xff000000) ^ + (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(out , s0); + s1 = + (Te4[(t1 >> 24) ] & 0xff000000) ^ + (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(out + 4, s1); + s2 = + (Te4[(t2 >> 24) ] & 0xff000000) ^ + (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(out + 8, s2); + s3 = + (Te4[(t3 >> 24) ] & 0xff000000) ^ + (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(out + 12, s3); +} + +/* + * Decrypt a single block + * in and out can overlap + */ +void evp_aes_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) +{ + + const u32 *rk; + u32 s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + assert(in && out && key); + rk = key->rd_key; + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(in ) ^ rk[0]; + s1 = GETU32(in + 4) ^ rk[1]; + s2 = GETU32(in + 8) ^ rk[2]; + s3 = GETU32(in + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; + if (key->rounds > 10) { + /* round 10: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; + if (key->rounds > 12) { + /* round 12: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; + } + } + rk += key->rounds << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = key->rounds >> 1; + for (;;) { + t0 = + Td0[(s0 >> 24) ] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ + Td3[(s1 ) & 0xff] ^ + rk[4]; + t1 = + Td0[(s1 >> 24) ] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ + Td3[(s2 ) & 0xff] ^ + rk[5]; + t2 = + Td0[(s2 >> 24) ] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ + Td3[(s3 ) & 0xff] ^ + rk[6]; + t3 = + Td0[(s3 >> 24) ] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ + Td3[(s0 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Td0[(t0 >> 24) ] ^ + Td1[(t3 >> 16) & 0xff] ^ + Td2[(t2 >> 8) & 0xff] ^ + Td3[(t1 ) & 0xff] ^ + rk[0]; + s1 = + Td0[(t1 >> 24) ] ^ + Td1[(t0 >> 16) & 0xff] ^ + Td2[(t3 >> 8) & 0xff] ^ + Td3[(t2 ) & 0xff] ^ + rk[1]; + s2 = + Td0[(t2 >> 24) ] ^ + Td1[(t1 >> 16) & 0xff] ^ + Td2[(t0 >> 8) & 0xff] ^ + Td3[(t3 ) & 0xff] ^ + rk[2]; + s3 = + Td0[(t3 >> 24) ] ^ + Td1[(t2 >> 16) & 0xff] ^ + Td2[(t1 >> 8) & 0xff] ^ + Td3[(t0 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Td4[(t0 >> 24) ] & 0xff000000) ^ + (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(out , s0); + s1 = + (Td4[(t1 >> 24) ] & 0xff000000) ^ + (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(out + 4, s1); + s2 = + (Td4[(t2 >> 24) ] & 0xff000000) ^ + (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(out + 8, s2); + s3 = + (Td4[(t3 >> 24) ] & 0xff000000) ^ + (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(out + 12, s3); +} + +/** + * Expand the cipher key into the encryption key schedule. + */ +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key) +{ + + u32 *rk; + int i = 0; + u32 temp; + + if (!userKey || !key) + return -1; + if (bits != 128 && bits != 192 && bits != 256) + return -2; + + rk = key->rd_key; + + if (bits==128) + key->rounds = 10; + else if (bits==192) + key->rounds = 12; + else + key->rounds = 14; + + rk[0] = GETU32(userKey ); + rk[1] = GETU32(userKey + 4); + rk[2] = GETU32(userKey + 8); + rk[3] = GETU32(userKey + 12); + if (bits == 128) { + while (1) { + temp = rk[3]; + rk[4] = rk[0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + if (++i == 10) { + return 0; + } + rk += 4; + } + } + rk[4] = GETU32(userKey + 16); + rk[5] = GETU32(userKey + 20); + if (bits == 192) { + while (1) { + temp = rk[ 5]; + rk[ 6] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 7] = rk[ 1] ^ rk[ 6]; + rk[ 8] = rk[ 2] ^ rk[ 7]; + rk[ 9] = rk[ 3] ^ rk[ 8]; + if (++i == 8) { + return 0; + } + rk[10] = rk[ 4] ^ rk[ 9]; + rk[11] = rk[ 5] ^ rk[10]; + rk += 6; + } + } + rk[6] = GETU32(userKey + 24); + rk[7] = GETU32(userKey + 28); + if (bits == 256) { + while (1) { + temp = rk[ 7]; + rk[ 8] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 9] = rk[ 1] ^ rk[ 8]; + rk[10] = rk[ 2] ^ rk[ 9]; + rk[11] = rk[ 3] ^ rk[10]; + if (++i == 7) { + return 0; + } + temp = rk[11]; + rk[12] = rk[ 4] ^ + (Te4[(temp >> 24) ] & 0xff000000) ^ + (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(temp ) & 0xff] & 0x000000ff); + rk[13] = rk[ 5] ^ rk[12]; + rk[14] = rk[ 6] ^ rk[13]; + rk[15] = rk[ 7] ^ rk[14]; + + rk += 8; + } + } + return 0; //Success +} + +void evp_aes_cbc_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc) +{ + + unsigned long n; + unsigned long len = length; + unsigned char tmp[AES_BLOCK_SIZE]; + const unsigned char *iv = ivec; + + assert(in && out && key && ivec); + assert((AES_ENCRYPT == enc)||(AES_DECRYPT == enc)); + + if (AES_ENCRYPT == enc) { + while (len >= AES_BLOCK_SIZE) { + for(n=0; n < AES_BLOCK_SIZE; ++n) + out[n] = in[n] ^ iv[n]; + evp_aes_encrypt(out, out, key); + iv = out; + len -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (len) { + for(n=0; n < len; ++n) + out[n] = in[n] ^ iv[n]; + for(n=len; n < AES_BLOCK_SIZE; ++n) + out[n] = iv[n]; + evp_aes_encrypt(out, out, key); + iv = out; + } + memcpy(ivec,iv,AES_BLOCK_SIZE); + } else if (in != out) { + while (len >= AES_BLOCK_SIZE) { + evp_aes_decrypt(in, out, key); + for(n=0; n < AES_BLOCK_SIZE; ++n) + out[n] ^= iv[n]; + iv = in; + len -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (len) { + evp_aes_decrypt(in,tmp,key); + for(n=0; n < len; ++n) + out[n] = tmp[n] ^ iv[n]; + iv = in; + } + memcpy(ivec,iv,AES_BLOCK_SIZE); + } else { + while (len >= AES_BLOCK_SIZE) { + memcpy(tmp, in, AES_BLOCK_SIZE); + evp_aes_decrypt(in, out, key); + for(n=0; n < AES_BLOCK_SIZE; ++n) + out[n] ^= ivec[n]; + memcpy(ivec, tmp, AES_BLOCK_SIZE); + len -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (len) { + memcpy(tmp, in, AES_BLOCK_SIZE); + evp_aes_decrypt(tmp, out, key); + for(n=0; n < len; ++n) + out[n] ^= ivec[n]; + for(n=len; n < AES_BLOCK_SIZE; ++n) + out[n] = tmp[n]; + memcpy(ivec, tmp, AES_BLOCK_SIZE); + } + } +} + +/** + * Expand the cipher key into the decryption key schedule. + */ +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key) +{ + + u32 *rk; + int i, j, status; + u32 temp; + + /* first, start with an encryption schedule */ + status = AES_set_encrypt_key(userKey, bits, key); + if (status < 0) + return status; + + rk = key->rd_key; + + /* invert the order of the round keys: */ + for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) { + temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; + temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; + temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; + temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; + } + /* apply the inverse MixColumn transform to all round keys but the first and the last: */ + for (i = 1; i < (key->rounds); i++) { + rk += 4; + rk[0] = + Td0[Te4[(rk[0] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[0] ) & 0xff] & 0xff]; + rk[1] = + Td0[Te4[(rk[1] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[1] ) & 0xff] & 0xff]; + rk[2] = + Td0[Te4[(rk[2] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[2] ) & 0xff] & 0xff]; + rk[3] = + Td0[Te4[(rk[3] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[3] ) & 0xff] & 0xff]; + } + return 0; +} + +int EVP_aes_128_cbc() +{ + return 128; //aes_128_cbc +} + +int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, int type, unsigned char *key, unsigned char *iv) +{ + int ret; + + memset(ctx, 0x00, sizeof(EVP_CIPHER_CTX)); + + ctx->flag = 1; //Init ok. + ctx->type = type; + ctx->encrypt = 1; //Do Encrypt + + + memcpy(ctx->key, key, 16); + memcpy(ctx->iv, iv, 16); + + ret = AES_set_encrypt_key(key, 128, &ctx->aesKey); + + return ret; +} + +int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen, unsigned char *inbuf, int inlen) +{ + int encryptSize = 0; + + if ((ctx->flag == 0) || (inlen == 0) || (ctx->encrypt == 0)) + return 0; //Failed, ctx not been initializzd or input size is empty. + + while (inlen >= AES_BLOCK_SIZE) + { + evp_aes_cbc_encrypt(inbuf + encryptSize, outbuf + encryptSize, AES_BLOCK_SIZE, &ctx->aesKey, ctx->iv, ctx->encrypt); + encryptSize += AES_BLOCK_SIZE; + inlen -= AES_BLOCK_SIZE; + } + + if (inlen == 0) + { + *outlen = encryptSize; + memset(ctx->buffer, AES_BLOCK_SIZE, AES_BLOCK_SIZE); + ctx->bufferlen = AES_BLOCK_SIZE; + } + else + { + *outlen = encryptSize; + memcpy(ctx->buffer, inbuf + encryptSize, inlen); + memset(ctx->buffer + inlen, AES_BLOCK_SIZE - inlen, AES_BLOCK_SIZE - inlen); + ctx->bufferlen = AES_BLOCK_SIZE; + } + + return 1; //Success +} + +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen) +{ + if ((ctx->flag == 0) || (ctx->bufferlen == 0) || (ctx->encrypt == 0)) + { + *outlen = 0; + return 0; //Failed, ctx not been initialized or buffer is empty. + } + + *outlen = AES_BLOCK_SIZE; + evp_aes_cbc_encrypt(ctx->buffer, outbuf, AES_BLOCK_SIZE, &ctx->aesKey, ctx->iv, ctx->encrypt); + + return 1; //Success +} + +int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, int type, unsigned char *key, unsigned char *iv) +{ + int ret; + + memset(ctx, 0x00, sizeof(EVP_CIPHER_CTX)); + + ctx->flag = 1; //Init ok. + ctx->type = type; + ctx->encrypt = 0; //Do Decrypt + + memcpy(ctx->key, key, 16); + memcpy(ctx->iv, iv, 16); + + ret = AES_set_decrypt_key(key, 128, &ctx->aesKey); + + return ret; +} + +int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen, unsigned char *inbuf, int inlen) +{ + int decryptSize = 0; + + if ((ctx->flag == 0) || (inlen == 0) || (ctx->encrypt == 1)) + return 0; //Failed, ctx not been initializzd or input size is empty. + + while (inlen >= AES_BLOCK_SIZE) + { + if (inlen <= AES_BLOCK_SIZE) + break; + + evp_aes_cbc_encrypt(inbuf + decryptSize, outbuf + decryptSize, AES_BLOCK_SIZE, &ctx->aesKey, ctx->iv, ctx->encrypt); + decryptSize += AES_BLOCK_SIZE; + inlen -= AES_BLOCK_SIZE; + } + + if (inlen == AES_BLOCK_SIZE) + { + ctx->bufferlen = inlen; + evp_aes_cbc_encrypt(inbuf + decryptSize, ctx->buffer, AES_BLOCK_SIZE, &ctx->aesKey, ctx->iv, ctx->encrypt); + } + *outlen = decryptSize; + + return 1; //Success. +} + +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen) +{ + unsigned char lastchar = 0; + int datasize = 0; + + if ((ctx->flag == 0) || (ctx->bufferlen == 0) || (ctx->encrypt == 1)) + { + *outlen = 0; + return 0; //Failed, ctx not been initialized or buffer is empty. + } + + lastchar = ctx->buffer[AES_BLOCK_SIZE - 1]; + if (lastchar < AES_BLOCK_SIZE) + { + datasize = AES_BLOCK_SIZE - lastchar; + memcpy(outbuf, ctx->buffer, datasize); + } + + *outlen = datasize; + + return 1; //Success +} + + + +/* Wifi-Simple-Configure * + * Encryption algorithm : AES-128-CBC per FIPS 197 */ + +/* + * WscEncryptData + * @ plainText: input data + * @ ptx_len: + * @ key: KeyWrapKey derived from KDK, len=aes-128-bit (in bytes) + * @ iv: a random iv, len=aes-128-bit (in bytes) + * @ cipherText: output data + * @ ctx_len: + */ +void WscEncryptData( + unsigned char *plainText, int ptx_len, + unsigned char *key, unsigned char *iv, + unsigned char *cipherText, int *ctx_len) +{ + EVP_CIPHER_CTX ctx; + int bufLen = 1024; + unsigned char outBuf[1024]; + int outLen, currentLength; + + //block size = 1024 bytes - 128 bits, + //leave 128 bits at the end to accommodate any possible padding + //and avoid a buffer overflow + int blockSize = bufLen - AES_BLOCK_SIZE; + unsigned char *bufPtr=NULL; + int data_len; + + // init buffer + bufPtr = plainText; + data_len = ptx_len; + + if(0 != EVP_EncryptInit(&ctx, EVP_aes_128_cbc(), key, iv)) + { + DBGPRINT(RT_DEBUG_INFO, ("WscEncryptData: EncryptInit failed\n")); + } + + *ctx_len = 0; + while(data_len) + { + if(data_len > blockSize) + currentLength = blockSize; + else + currentLength = data_len; + + if(0 == EVP_EncryptUpdate(&ctx, outBuf, &outLen, bufPtr, currentLength)) + { + DBGPRINT(RT_DEBUG_INFO, ("WscEncryptData: EncryptUpdate failed\n")); + } + + // fill in output cipherText + memcpy(cipherText, outBuf, outLen); + cipherText += outLen; + *ctx_len += outLen; + + bufPtr += currentLength; + data_len -= currentLength; + } + + + if(0 == EVP_EncryptFinal(&ctx, outBuf, &outLen)) + { + DBGPRINT(RT_DEBUG_INFO, ("WscEncryptData: EncryptFinal failed\n")); + } + + // fill in output cipherText + memcpy(cipherText, outBuf, outLen); + *ctx_len += outLen; + +} + + +/* WscDecryptData + * @ cipherText: input data + * @ ctx_len: + * @ key: KeyWrapKey derived from KDK, len=aes-128-bit (in bytes) + * @ iv: a random iv, len=aes-128-bit (in bytes) + * @ plainText: output data + * @ ptx_len: + */ +void WscDecryptData( + unsigned char *cipherText, int ctx_len, + unsigned char *key, unsigned char *iv, + unsigned char *plainText, int *ptx_len) +{ + EVP_CIPHER_CTX ctx; + int bufLen = 1024; + unsigned char outBuf[1024]; + int outLen = 0, currentLength; + + //block size = 1024 bytes - 128 bits, + //leave 128 bits at the end to accommodate any possible padding + //and avoid a buffer overflow + int blockSize = bufLen - AES_BLOCK_SIZE; + unsigned char *bufPtr=NULL; + int data_len; + + // init buffer + bufPtr = cipherText; + data_len = ctx_len; + + if(0 != EVP_DecryptInit(&ctx, EVP_aes_128_cbc(), key, iv)) + { + DBGPRINT(RT_DEBUG_INFO, ("WscEncryptData: DecryptInit failed\n")); + } + + *ptx_len=0; + while(data_len) + { + if(data_len > blockSize) + currentLength = blockSize; + else + currentLength = data_len; + + if(0 == EVP_DecryptUpdate(&ctx, outBuf, &outLen, bufPtr, currentLength)) + { + DBGPRINT(RT_DEBUG_INFO, ("WscDecryptData: DecryptUpdate failed\n")); + } + + + // fill in output plainText + memcpy(plainText, outBuf, outLen); + plainText += outLen; + *ptx_len += outLen; + + bufPtr += currentLength; + data_len -= currentLength; + } + + + if(0 == EVP_DecryptFinal(&ctx, outBuf, &outLen)) + { + DBGPRINT(RT_DEBUG_INFO, ("WscDecryptData: DecryptFinal failed\n")); + } + + // fill in output plainText + memcpy(plainText, outBuf, outLen); + *ptx_len += outLen; + +} + +/* ========================= AES En/Decryption ========================== */ + +/* forward S-box */ +static uint32 FSb[256] = +{ + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, + 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, + 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, + 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, + 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, + 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, + 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, + 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, + 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, + 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, + 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, + 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, + 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, + 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, + 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, + 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, + 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 +}; + +/* forward table */ +#define FT \ +\ + V(C6,63,63,A5), V(F8,7C,7C,84), V(EE,77,77,99), V(F6,7B,7B,8D), \ + V(FF,F2,F2,0D), V(D6,6B,6B,BD), V(DE,6F,6F,B1), V(91,C5,C5,54), \ + V(60,30,30,50), V(02,01,01,03), V(CE,67,67,A9), V(56,2B,2B,7D), \ + V(E7,FE,FE,19), V(B5,D7,D7,62), V(4D,AB,AB,E6), V(EC,76,76,9A), \ + V(8F,CA,CA,45), V(1F,82,82,9D), V(89,C9,C9,40), V(FA,7D,7D,87), \ + V(EF,FA,FA,15), V(B2,59,59,EB), V(8E,47,47,C9), V(FB,F0,F0,0B), \ + V(41,AD,AD,EC), V(B3,D4,D4,67), V(5F,A2,A2,FD), V(45,AF,AF,EA), \ + V(23,9C,9C,BF), V(53,A4,A4,F7), V(E4,72,72,96), V(9B,C0,C0,5B), \ + V(75,B7,B7,C2), V(E1,FD,FD,1C), V(3D,93,93,AE), V(4C,26,26,6A), \ + V(6C,36,36,5A), V(7E,3F,3F,41), V(F5,F7,F7,02), V(83,CC,CC,4F), \ + V(68,34,34,5C), V(51,A5,A5,F4), V(D1,E5,E5,34), V(F9,F1,F1,08), \ + V(E2,71,71,93), V(AB,D8,D8,73), V(62,31,31,53), V(2A,15,15,3F), \ + V(08,04,04,0C), V(95,C7,C7,52), V(46,23,23,65), V(9D,C3,C3,5E), \ + V(30,18,18,28), V(37,96,96,A1), V(0A,05,05,0F), V(2F,9A,9A,B5), \ + V(0E,07,07,09), V(24,12,12,36), V(1B,80,80,9B), V(DF,E2,E2,3D), \ + V(CD,EB,EB,26), V(4E,27,27,69), V(7F,B2,B2,CD), V(EA,75,75,9F), \ + V(12,09,09,1B), V(1D,83,83,9E), V(58,2C,2C,74), V(34,1A,1A,2E), \ + V(36,1B,1B,2D), V(DC,6E,6E,B2), V(B4,5A,5A,EE), V(5B,A0,A0,FB), \ + V(A4,52,52,F6), V(76,3B,3B,4D), V(B7,D6,D6,61), V(7D,B3,B3,CE), \ + V(52,29,29,7B), V(DD,E3,E3,3E), V(5E,2F,2F,71), V(13,84,84,97), \ + V(A6,53,53,F5), V(B9,D1,D1,68), V(00,00,00,00), V(C1,ED,ED,2C), \ + V(40,20,20,60), V(E3,FC,FC,1F), V(79,B1,B1,C8), V(B6,5B,5B,ED), \ + V(D4,6A,6A,BE), V(8D,CB,CB,46), V(67,BE,BE,D9), V(72,39,39,4B), \ + V(94,4A,4A,DE), V(98,4C,4C,D4), V(B0,58,58,E8), V(85,CF,CF,4A), \ + V(BB,D0,D0,6B), V(C5,EF,EF,2A), V(4F,AA,AA,E5), V(ED,FB,FB,16), \ + V(86,43,43,C5), V(9A,4D,4D,D7), V(66,33,33,55), V(11,85,85,94), \ + V(8A,45,45,CF), V(E9,F9,F9,10), V(04,02,02,06), V(FE,7F,7F,81), \ + V(A0,50,50,F0), V(78,3C,3C,44), V(25,9F,9F,BA), V(4B,A8,A8,E3), \ + V(A2,51,51,F3), V(5D,A3,A3,FE), V(80,40,40,C0), V(05,8F,8F,8A), \ + V(3F,92,92,AD), V(21,9D,9D,BC), V(70,38,38,48), V(F1,F5,F5,04), \ + V(63,BC,BC,DF), V(77,B6,B6,C1), V(AF,DA,DA,75), V(42,21,21,63), \ + V(20,10,10,30), V(E5,FF,FF,1A), V(FD,F3,F3,0E), V(BF,D2,D2,6D), \ + V(81,CD,CD,4C), V(18,0C,0C,14), V(26,13,13,35), V(C3,EC,EC,2F), \ + V(BE,5F,5F,E1), V(35,97,97,A2), V(88,44,44,CC), V(2E,17,17,39), \ + V(93,C4,C4,57), V(55,A7,A7,F2), V(FC,7E,7E,82), V(7A,3D,3D,47), \ + V(C8,64,64,AC), V(BA,5D,5D,E7), V(32,19,19,2B), V(E6,73,73,95), \ + V(C0,60,60,A0), V(19,81,81,98), V(9E,4F,4F,D1), V(A3,DC,DC,7F), \ + V(44,22,22,66), V(54,2A,2A,7E), V(3B,90,90,AB), V(0B,88,88,83), \ + V(8C,46,46,CA), V(C7,EE,EE,29), V(6B,B8,B8,D3), V(28,14,14,3C), \ + V(A7,DE,DE,79), V(BC,5E,5E,E2), V(16,0B,0B,1D), V(AD,DB,DB,76), \ + V(DB,E0,E0,3B), V(64,32,32,56), V(74,3A,3A,4E), V(14,0A,0A,1E), \ + V(92,49,49,DB), V(0C,06,06,0A), V(48,24,24,6C), V(B8,5C,5C,E4), \ + V(9F,C2,C2,5D), V(BD,D3,D3,6E), V(43,AC,AC,EF), V(C4,62,62,A6), \ + V(39,91,91,A8), V(31,95,95,A4), V(D3,E4,E4,37), V(F2,79,79,8B), \ + V(D5,E7,E7,32), V(8B,C8,C8,43), V(6E,37,37,59), V(DA,6D,6D,B7), \ + V(01,8D,8D,8C), V(B1,D5,D5,64), V(9C,4E,4E,D2), V(49,A9,A9,E0), \ + V(D8,6C,6C,B4), V(AC,56,56,FA), V(F3,F4,F4,07), V(CF,EA,EA,25), \ + V(CA,65,65,AF), V(F4,7A,7A,8E), V(47,AE,AE,E9), V(10,08,08,18), \ + V(6F,BA,BA,D5), V(F0,78,78,88), V(4A,25,25,6F), V(5C,2E,2E,72), \ + V(38,1C,1C,24), V(57,A6,A6,F1), V(73,B4,B4,C7), V(97,C6,C6,51), \ + V(CB,E8,E8,23), V(A1,DD,DD,7C), V(E8,74,74,9C), V(3E,1F,1F,21), \ + V(96,4B,4B,DD), V(61,BD,BD,DC), V(0D,8B,8B,86), V(0F,8A,8A,85), \ + V(E0,70,70,90), V(7C,3E,3E,42), V(71,B5,B5,C4), V(CC,66,66,AA), \ + V(90,48,48,D8), V(06,03,03,05), V(F7,F6,F6,01), V(1C,0E,0E,12), \ + V(C2,61,61,A3), V(6A,35,35,5F), V(AE,57,57,F9), V(69,B9,B9,D0), \ + V(17,86,86,91), V(99,C1,C1,58), V(3A,1D,1D,27), V(27,9E,9E,B9), \ + V(D9,E1,E1,38), V(EB,F8,F8,13), V(2B,98,98,B3), V(22,11,11,33), \ + V(D2,69,69,BB), V(A9,D9,D9,70), V(07,8E,8E,89), V(33,94,94,A7), \ + V(2D,9B,9B,B6), V(3C,1E,1E,22), V(15,87,87,92), V(C9,E9,E9,20), \ + V(87,CE,CE,49), V(AA,55,55,FF), V(50,28,28,78), V(A5,DF,DF,7A), \ + V(03,8C,8C,8F), V(59,A1,A1,F8), V(09,89,89,80), V(1A,0D,0D,17), \ + V(65,BF,BF,DA), V(D7,E6,E6,31), V(84,42,42,C6), V(D0,68,68,B8), \ + V(82,41,41,C3), V(29,99,99,B0), V(5A,2D,2D,77), V(1E,0F,0F,11), \ + V(7B,B0,B0,CB), V(A8,54,54,FC), V(6D,BB,BB,D6), V(2C,16,16,3A) + +#define V(a,b,c,d) 0x##a##b##c##d +static uint32 FT0[256] = { FT }; +#undef V + +#define V(a,b,c,d) 0x##d##a##b##c +static uint32 FT1[256] = { FT }; +#undef V + +#define V(a,b,c,d) 0x##c##d##a##b +static uint32 FT2[256] = { FT }; +#undef V + +#define V(a,b,c,d) 0x##b##c##d##a +static uint32 FT3[256] = { FT }; +#undef V + +#undef FT + +/* reverse S-box */ + +static uint32 RSb[256] = +{ + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, + 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, + 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, + 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, + 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, + 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, + 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, + 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, + 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, + 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, + 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, + 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, + 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, + 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, + 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, + 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, + 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D +}; + +/* reverse table */ + +#define RT \ +\ + V(51,F4,A7,50), V(7E,41,65,53), V(1A,17,A4,C3), V(3A,27,5E,96), \ + V(3B,AB,6B,CB), V(1F,9D,45,F1), V(AC,FA,58,AB), V(4B,E3,03,93), \ + V(20,30,FA,55), V(AD,76,6D,F6), V(88,CC,76,91), V(F5,02,4C,25), \ + V(4F,E5,D7,FC), V(C5,2A,CB,D7), V(26,35,44,80), V(B5,62,A3,8F), \ + V(DE,B1,5A,49), V(25,BA,1B,67), V(45,EA,0E,98), V(5D,FE,C0,E1), \ + V(C3,2F,75,02), V(81,4C,F0,12), V(8D,46,97,A3), V(6B,D3,F9,C6), \ + V(03,8F,5F,E7), V(15,92,9C,95), V(BF,6D,7A,EB), V(95,52,59,DA), \ + V(D4,BE,83,2D), V(58,74,21,D3), V(49,E0,69,29), V(8E,C9,C8,44), \ + V(75,C2,89,6A), V(F4,8E,79,78), V(99,58,3E,6B), V(27,B9,71,DD), \ + V(BE,E1,4F,B6), V(F0,88,AD,17), V(C9,20,AC,66), V(7D,CE,3A,B4), \ + V(63,DF,4A,18), V(E5,1A,31,82), V(97,51,33,60), V(62,53,7F,45), \ + V(B1,64,77,E0), V(BB,6B,AE,84), V(FE,81,A0,1C), V(F9,08,2B,94), \ + V(70,48,68,58), V(8F,45,FD,19), V(94,DE,6C,87), V(52,7B,F8,B7), \ + V(AB,73,D3,23), V(72,4B,02,E2), V(E3,1F,8F,57), V(66,55,AB,2A), \ + V(B2,EB,28,07), V(2F,B5,C2,03), V(86,C5,7B,9A), V(D3,37,08,A5), \ + V(30,28,87,F2), V(23,BF,A5,B2), V(02,03,6A,BA), V(ED,16,82,5C), \ + V(8A,CF,1C,2B), V(A7,79,B4,92), V(F3,07,F2,F0), V(4E,69,E2,A1), \ + V(65,DA,F4,CD), V(06,05,BE,D5), V(D1,34,62,1F), V(C4,A6,FE,8A), \ + V(34,2E,53,9D), V(A2,F3,55,A0), V(05,8A,E1,32), V(A4,F6,EB,75), \ + V(0B,83,EC,39), V(40,60,EF,AA), V(5E,71,9F,06), V(BD,6E,10,51), \ + V(3E,21,8A,F9), V(96,DD,06,3D), V(DD,3E,05,AE), V(4D,E6,BD,46), \ + V(91,54,8D,B5), V(71,C4,5D,05), V(04,06,D4,6F), V(60,50,15,FF), \ + V(19,98,FB,24), V(D6,BD,E9,97), V(89,40,43,CC), V(67,D9,9E,77), \ + V(B0,E8,42,BD), V(07,89,8B,88), V(E7,19,5B,38), V(79,C8,EE,DB), \ + V(A1,7C,0A,47), V(7C,42,0F,E9), V(F8,84,1E,C9), V(00,00,00,00), \ + V(09,80,86,83), V(32,2B,ED,48), V(1E,11,70,AC), V(6C,5A,72,4E), \ + V(FD,0E,FF,FB), V(0F,85,38,56), V(3D,AE,D5,1E), V(36,2D,39,27), \ + V(0A,0F,D9,64), V(68,5C,A6,21), V(9B,5B,54,D1), V(24,36,2E,3A), \ + V(0C,0A,67,B1), V(93,57,E7,0F), V(B4,EE,96,D2), V(1B,9B,91,9E), \ + V(80,C0,C5,4F), V(61,DC,20,A2), V(5A,77,4B,69), V(1C,12,1A,16), \ + V(E2,93,BA,0A), V(C0,A0,2A,E5), V(3C,22,E0,43), V(12,1B,17,1D), \ + V(0E,09,0D,0B), V(F2,8B,C7,AD), V(2D,B6,A8,B9), V(14,1E,A9,C8), \ + V(57,F1,19,85), V(AF,75,07,4C), V(EE,99,DD,BB), V(A3,7F,60,FD), \ + V(F7,01,26,9F), V(5C,72,F5,BC), V(44,66,3B,C5), V(5B,FB,7E,34), \ + V(8B,43,29,76), V(CB,23,C6,DC), V(B6,ED,FC,68), V(B8,E4,F1,63), \ + V(D7,31,DC,CA), V(42,63,85,10), V(13,97,22,40), V(84,C6,11,20), \ + V(85,4A,24,7D), V(D2,BB,3D,F8), V(AE,F9,32,11), V(C7,29,A1,6D), \ + V(1D,9E,2F,4B), V(DC,B2,30,F3), V(0D,86,52,EC), V(77,C1,E3,D0), \ + V(2B,B3,16,6C), V(A9,70,B9,99), V(11,94,48,FA), V(47,E9,64,22), \ + V(A8,FC,8C,C4), V(A0,F0,3F,1A), V(56,7D,2C,D8), V(22,33,90,EF), \ + V(87,49,4E,C7), V(D9,38,D1,C1), V(8C,CA,A2,FE), V(98,D4,0B,36), \ + V(A6,F5,81,CF), V(A5,7A,DE,28), V(DA,B7,8E,26), V(3F,AD,BF,A4), \ + V(2C,3A,9D,E4), V(50,78,92,0D), V(6A,5F,CC,9B), V(54,7E,46,62), \ + V(F6,8D,13,C2), V(90,D8,B8,E8), V(2E,39,F7,5E), V(82,C3,AF,F5), \ + V(9F,5D,80,BE), V(69,D0,93,7C), V(6F,D5,2D,A9), V(CF,25,12,B3), \ + V(C8,AC,99,3B), V(10,18,7D,A7), V(E8,9C,63,6E), V(DB,3B,BB,7B), \ + V(CD,26,78,09), V(6E,59,18,F4), V(EC,9A,B7,01), V(83,4F,9A,A8), \ + V(E6,95,6E,65), V(AA,FF,E6,7E), V(21,BC,CF,08), V(EF,15,E8,E6), \ + V(BA,E7,9B,D9), V(4A,6F,36,CE), V(EA,9F,09,D4), V(29,B0,7C,D6), \ + V(31,A4,B2,AF), V(2A,3F,23,31), V(C6,A5,94,30), V(35,A2,66,C0), \ + V(74,4E,BC,37), V(FC,82,CA,A6), V(E0,90,D0,B0), V(33,A7,D8,15), \ + V(F1,04,98,4A), V(41,EC,DA,F7), V(7F,CD,50,0E), V(17,91,F6,2F), \ + V(76,4D,D6,8D), V(43,EF,B0,4D), V(CC,AA,4D,54), V(E4,96,04,DF), \ + V(9E,D1,B5,E3), V(4C,6A,88,1B), V(C1,2C,1F,B8), V(46,65,51,7F), \ + V(9D,5E,EA,04), V(01,8C,35,5D), V(FA,87,74,73), V(FB,0B,41,2E), \ + V(B3,67,1D,5A), V(92,DB,D2,52), V(E9,10,56,33), V(6D,D6,47,13), \ + V(9A,D7,61,8C), V(37,A1,0C,7A), V(59,F8,14,8E), V(EB,13,3C,89), \ + V(CE,A9,27,EE), V(B7,61,C9,35), V(E1,1C,E5,ED), V(7A,47,B1,3C), \ + V(9C,D2,DF,59), V(55,F2,73,3F), V(18,14,CE,79), V(73,C7,37,BF), \ + V(53,F7,CD,EA), V(5F,FD,AA,5B), V(DF,3D,6F,14), V(78,44,DB,86), \ + V(CA,AF,F3,81), V(B9,68,C4,3E), V(38,24,34,2C), V(C2,A3,40,5F), \ + V(16,1D,C3,72), V(BC,E2,25,0C), V(28,3C,49,8B), V(FF,0D,95,41), \ + V(39,A8,01,71), V(08,0C,B3,DE), V(D8,B4,E4,9C), V(64,56,C1,90), \ + V(7B,CB,84,61), V(D5,32,B6,70), V(48,6C,5C,74), V(D0,B8,57,42) + +#define V(a,b,c,d) 0x##a##b##c##d +static uint32 RT0[256] = { RT }; +#undef V + +#define V(a,b,c,d) 0x##d##a##b##c +static uint32 RT1[256] = { RT }; +#undef V + +#define V(a,b,c,d) 0x##c##d##a##b +static uint32 RT2[256] = { RT }; +#undef V + +#define V(a,b,c,d) 0x##b##c##d##a +static uint32 RT3[256] = { RT }; +#undef V + +#undef RT + +/* round constants */ + +static uint32 RCON[10] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000 +}; + +/* key schedule tables */ + +static int KT_init = 1; + +static uint32 KT0[256]; +static uint32 KT1[256]; +static uint32 KT2[256]; +static uint32 KT3[256]; + +/* platform-independant 32-bit integer manipulation macros */ + +#define GET_UINT32(n,b,i) \ +{ \ + (n) = ( (uint32) (b)[(i) ] << 24 ) \ + | ( (uint32) (b)[(i) + 1] << 16 ) \ + | ( (uint32) (b)[(i) + 2] << 8 ) \ + | ( (uint32) (b)[(i) + 3] ); \ +} + +#define PUT_UINT32(n,b,i) \ +{ \ + (b)[(i) ] = (uint8) ( (n) >> 24 ); \ + (b)[(i) + 1] = (uint8) ( (n) >> 16 ); \ + (b)[(i) + 2] = (uint8) ( (n) >> 8 ); \ + (b)[(i) + 3] = (uint8) ( (n) ); \ +} + +/* AES key scheduling routine */ + +int rtmp_aes_set_key( aes_context *ctx, uint8 *key, int nbits ) +{ + int i; + uint32 *RK, *SK; + + switch( nbits ) + { + case 128: ctx->nr = 10; break; + case 192: ctx->nr = 12; break; + case 256: ctx->nr = 14; break; + default : return( 1 ); + } + + RK = ctx->erk; + + for( i = 0; i < (nbits >> 5); i++ ) + { + GET_UINT32( RK[i], key, i * 4 ); + } + + /* setup encryption round keys */ + + switch( nbits ) + { + case 128: + + for( i = 0; i < 10; i++, RK += 4 ) + { + RK[4] = RK[0] ^ RCON[i] ^ + ( FSb[ (uint8) ( RK[3] >> 16 ) ] << 24 ) ^ + ( FSb[ (uint8) ( RK[3] >> 8 ) ] << 16 ) ^ + ( FSb[ (uint8) ( RK[3] ) ] << 8 ) ^ + ( FSb[ (uint8) ( RK[3] >> 24 ) ] ); + + RK[5] = RK[1] ^ RK[4]; + RK[6] = RK[2] ^ RK[5]; + RK[7] = RK[3] ^ RK[6]; + } + break; + + case 192: + + for( i = 0; i < 8; i++, RK += 6 ) + { + RK[6] = RK[0] ^ RCON[i] ^ + ( FSb[ (uint8) ( RK[5] >> 16 ) ] << 24 ) ^ + ( FSb[ (uint8) ( RK[5] >> 8 ) ] << 16 ) ^ + ( FSb[ (uint8) ( RK[5] ) ] << 8 ) ^ + ( FSb[ (uint8) ( RK[5] >> 24 ) ] ); + + RK[7] = RK[1] ^ RK[6]; + RK[8] = RK[2] ^ RK[7]; + RK[9] = RK[3] ^ RK[8]; + RK[10] = RK[4] ^ RK[9]; + RK[11] = RK[5] ^ RK[10]; + } + break; + + case 256: + + for( i = 0; i < 7; i++, RK += 8 ) + { + RK[8] = RK[0] ^ RCON[i] ^ + ( FSb[ (uint8) ( RK[7] >> 16 ) ] << 24 ) ^ + ( FSb[ (uint8) ( RK[7] >> 8 ) ] << 16 ) ^ + ( FSb[ (uint8) ( RK[7] ) ] << 8 ) ^ + ( FSb[ (uint8) ( RK[7] >> 24 ) ] ); + + RK[9] = RK[1] ^ RK[8]; + RK[10] = RK[2] ^ RK[9]; + RK[11] = RK[3] ^ RK[10]; + + RK[12] = RK[4] ^ + ( FSb[ (uint8) ( RK[11] >> 24 ) ] << 24 ) ^ + ( FSb[ (uint8) ( RK[11] >> 16 ) ] << 16 ) ^ + ( FSb[ (uint8) ( RK[11] >> 8 ) ] << 8 ) ^ + ( FSb[ (uint8) ( RK[11] ) ] ); + + RK[13] = RK[5] ^ RK[12]; + RK[14] = RK[6] ^ RK[13]; + RK[15] = RK[7] ^ RK[14]; + } + break; + } + + /* setup decryption round keys */ + + if( KT_init ) + { + for( i = 0; i < 256; i++ ) + { + KT0[i] = RT0[ FSb[i] ]; + KT1[i] = RT1[ FSb[i] ]; + KT2[i] = RT2[ FSb[i] ]; + KT3[i] = RT3[ FSb[i] ]; + } + + KT_init = 0; + } + + SK = ctx->drk; + + *SK++ = *RK++; + *SK++ = *RK++; + *SK++ = *RK++; + *SK++ = *RK++; + + for( i = 1; i < ctx->nr; i++ ) + { + RK -= 8; + + *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^ + KT1[ (uint8) ( *RK >> 16 ) ] ^ + KT2[ (uint8) ( *RK >> 8 ) ] ^ + KT3[ (uint8) ( *RK ) ]; RK++; + + *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^ + KT1[ (uint8) ( *RK >> 16 ) ] ^ + KT2[ (uint8) ( *RK >> 8 ) ] ^ + KT3[ (uint8) ( *RK ) ]; RK++; + + *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^ + KT1[ (uint8) ( *RK >> 16 ) ] ^ + KT2[ (uint8) ( *RK >> 8 ) ] ^ + KT3[ (uint8) ( *RK ) ]; RK++; + + *SK++ = KT0[ (uint8) ( *RK >> 24 ) ] ^ + KT1[ (uint8) ( *RK >> 16 ) ] ^ + KT2[ (uint8) ( *RK >> 8 ) ] ^ + KT3[ (uint8) ( *RK ) ]; RK++; + } + + RK -= 8; + + *SK++ = *RK++; + *SK++ = *RK++; + *SK++ = *RK++; + *SK++ = *RK++; + + return( 0 ); +} + +/* AES 128-bit block encryption routine */ + +void rtmp_aes_encrypt(aes_context *ctx, uint8 input[16], uint8 output[16] ) +{ + uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; + + RK = ctx->erk; + GET_UINT32( X0, input, 0 ); X0 ^= RK[0]; + GET_UINT32( X1, input, 4 ); X1 ^= RK[1]; + GET_UINT32( X2, input, 8 ); X2 ^= RK[2]; + GET_UINT32( X3, input, 12 ); X3 ^= RK[3]; + +#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ +{ \ + RK += 4; \ + \ + X0 = RK[0] ^ FT0[ (uint8) ( Y0 >> 24 ) ] ^ \ + FT1[ (uint8) ( Y1 >> 16 ) ] ^ \ + FT2[ (uint8) ( Y2 >> 8 ) ] ^ \ + FT3[ (uint8) ( Y3 ) ]; \ + \ + X1 = RK[1] ^ FT0[ (uint8) ( Y1 >> 24 ) ] ^ \ + FT1[ (uint8) ( Y2 >> 16 ) ] ^ \ + FT2[ (uint8) ( Y3 >> 8 ) ] ^ \ + FT3[ (uint8) ( Y0 ) ]; \ + \ + X2 = RK[2] ^ FT0[ (uint8) ( Y2 >> 24 ) ] ^ \ + FT1[ (uint8) ( Y3 >> 16 ) ] ^ \ + FT2[ (uint8) ( Y0 >> 8 ) ] ^ \ + FT3[ (uint8) ( Y1 ) ]; \ + \ + X3 = RK[3] ^ FT0[ (uint8) ( Y3 >> 24 ) ] ^ \ + FT1[ (uint8) ( Y0 >> 16 ) ] ^ \ + FT2[ (uint8) ( Y1 >> 8 ) ] ^ \ + FT3[ (uint8) ( Y2 ) ]; \ +} + + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 1 */ + AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 2 */ + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 3 */ + AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 4 */ + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 5 */ + AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 6 */ + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 7 */ + AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 8 */ + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 9 */ + + if( ctx->nr > 10 ) + { + AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 10 */ + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 11 */ + } + + if( ctx->nr > 12 ) + { + AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 12 */ + AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 13 */ + } + + /* last round */ + + RK += 4; + + X0 = RK[0] ^ ( FSb[ (uint8) ( Y0 >> 24 ) ] << 24 ) ^ + ( FSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^ + ( FSb[ (uint8) ( Y2 >> 8 ) ] << 8 ) ^ + ( FSb[ (uint8) ( Y3 ) ] ); + + X1 = RK[1] ^ ( FSb[ (uint8) ( Y1 >> 24 ) ] << 24 ) ^ + ( FSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^ + ( FSb[ (uint8) ( Y3 >> 8 ) ] << 8 ) ^ + ( FSb[ (uint8) ( Y0 ) ] ); + + X2 = RK[2] ^ ( FSb[ (uint8) ( Y2 >> 24 ) ] << 24 ) ^ + ( FSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^ + ( FSb[ (uint8) ( Y0 >> 8 ) ] << 8 ) ^ + ( FSb[ (uint8) ( Y1 ) ] ); + + X3 = RK[3] ^ ( FSb[ (uint8) ( Y3 >> 24 ) ] << 24 ) ^ + ( FSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^ + ( FSb[ (uint8) ( Y1 >> 8 ) ] << 8 ) ^ + ( FSb[ (uint8) ( Y2 ) ] ); + + PUT_UINT32( X0, output, 0 ); + PUT_UINT32( X1, output, 4 ); + PUT_UINT32( X2, output, 8 ); + PUT_UINT32( X3, output, 12 ); +} + +/* AES 128-bit block decryption routine */ + +void rtmp_aes_decrypt( aes_context *ctx, uint8 input[16], uint8 output[16] ) +{ + uint32 *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3; + + RK = ctx->drk; + + GET_UINT32( X0, input, 0 ); X0 ^= RK[0]; + GET_UINT32( X1, input, 4 ); X1 ^= RK[1]; + GET_UINT32( X2, input, 8 ); X2 ^= RK[2]; + GET_UINT32( X3, input, 12 ); X3 ^= RK[3]; + +#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3) \ +{ \ + RK += 4; \ + \ + X0 = RK[0] ^ RT0[ (uint8) ( Y0 >> 24 ) ] ^ \ + RT1[ (uint8) ( Y3 >> 16 ) ] ^ \ + RT2[ (uint8) ( Y2 >> 8 ) ] ^ \ + RT3[ (uint8) ( Y1 ) ]; \ + \ + X1 = RK[1] ^ RT0[ (uint8) ( Y1 >> 24 ) ] ^ \ + RT1[ (uint8) ( Y0 >> 16 ) ] ^ \ + RT2[ (uint8) ( Y3 >> 8 ) ] ^ \ + RT3[ (uint8) ( Y2 ) ]; \ + \ + X2 = RK[2] ^ RT0[ (uint8) ( Y2 >> 24 ) ] ^ \ + RT1[ (uint8) ( Y1 >> 16 ) ] ^ \ + RT2[ (uint8) ( Y0 >> 8 ) ] ^ \ + RT3[ (uint8) ( Y3 ) ]; \ + \ + X3 = RK[3] ^ RT0[ (uint8) ( Y3 >> 24 ) ] ^ \ + RT1[ (uint8) ( Y2 >> 16 ) ] ^ \ + RT2[ (uint8) ( Y1 >> 8 ) ] ^ \ + RT3[ (uint8) ( Y0 ) ]; \ +} + + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 1 */ + AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 2 */ + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 3 */ + AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 4 */ + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 5 */ + AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 6 */ + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 7 */ + AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 8 */ + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 9 */ + + if( ctx->nr > 10 ) + { + AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 10 */ + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 11 */ + } + + if( ctx->nr > 12 ) + { + AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 ); /* round 12 */ + AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 ); /* round 13 */ + } + + /* last round */ + + RK += 4; + + X0 = RK[0] ^ ( RSb[ (uint8) ( Y0 >> 24 ) ] << 24 ) ^ + ( RSb[ (uint8) ( Y3 >> 16 ) ] << 16 ) ^ + ( RSb[ (uint8) ( Y2 >> 8 ) ] << 8 ) ^ + ( RSb[ (uint8) ( Y1 ) ] ); + + X1 = RK[1] ^ ( RSb[ (uint8) ( Y1 >> 24 ) ] << 24 ) ^ + ( RSb[ (uint8) ( Y0 >> 16 ) ] << 16 ) ^ + ( RSb[ (uint8) ( Y3 >> 8 ) ] << 8 ) ^ + ( RSb[ (uint8) ( Y2 ) ] ); + + X2 = RK[2] ^ ( RSb[ (uint8) ( Y2 >> 24 ) ] << 24 ) ^ + ( RSb[ (uint8) ( Y1 >> 16 ) ] << 16 ) ^ + ( RSb[ (uint8) ( Y0 >> 8 ) ] << 8 ) ^ + ( RSb[ (uint8) ( Y3 ) ] ); + + X3 = RK[3] ^ ( RSb[ (uint8) ( Y3 >> 24 ) ] << 24 ) ^ + ( RSb[ (uint8) ( Y2 >> 16 ) ] << 16 ) ^ + ( RSb[ (uint8) ( Y1 >> 8 ) ] << 8 ) ^ + ( RSb[ (uint8) ( Y0 ) ] ); + + PUT_UINT32( X0, output, 0 ); + PUT_UINT32( X1, output, 4 ); + PUT_UINT32( X2, output, 8 ); + PUT_UINT32( X3, output, 12 ); +} + +/* + ========================================================================== + Description: + ENCRYPT AES GTK before sending in EAPOL frame. + AES GTK length = 128 bit, so fix blocks for aes-key-wrap as 2 in this function. + This function references to RFC 3394 for aes key wrap algorithm. + Return: + ========================================================================== +*/ +VOID AES_GTK_KEY_WRAP( + IN UCHAR *key, + IN UCHAR *plaintext, + IN UINT p_len, + OUT UCHAR *ciphertext, + OUT UINT *c_len) +{ + UCHAR A[8], BIN[16], BOUT[16]; + UCHAR R[512]; + INT num_blocks = p_len/8; // unit:64bits + INT i, j; + aes_context aesctx; + UCHAR xor; + + rtmp_aes_set_key(&aesctx, key, 128); + + // Init IA + for (i = 0; i < 8; i++) + A[i] = 0xa6; + + //Input plaintext + for (i = 0; i < num_blocks; i++) + { + for (j = 0 ; j < 8; j++) + R[8 * (i + 1) + j] = plaintext[8 * i + j]; + } + + // Key Mix + for (j = 0; j < 6; j++) + { + for(i = 1; i <= num_blocks; i++) + { + //phase 1 + NdisMoveMemory(BIN, A, 8); + NdisMoveMemory(&BIN[8], &R[8 * i], 8); + rtmp_aes_encrypt(&aesctx, BIN, BOUT); + + NdisMoveMemory(A, &BOUT[0], 8); + xor = num_blocks * j + i; + A[7] = BOUT[7] ^ xor; + NdisMoveMemory(&R[8 * i], &BOUT[8], 8); + } + } + + // Output ciphertext + NdisMoveMemory(ciphertext, A, 8); + + for (i = 1; i <= num_blocks; i++) + { + for (j = 0 ; j < 8; j++) + ciphertext[8 * i + j] = R[8 * i + j]; + } + *c_len = p_len + 8; +} + + +/* + ======================================================================== + + Routine Description: + Misc function to decrypt AES body + + Arguments: + + Return Value: + + Note: + This function references to RFC 3394 for aes key unwrap algorithm. + + ======================================================================== +*/ +VOID AES_GTK_KEY_UNWRAP( + IN UCHAR *key, + OUT UCHAR *plaintext, + OUT UINT *p_len, + IN UCHAR *ciphertext, + IN UINT c_len) + +{ + UCHAR A[8], BIN[16], BOUT[16]; + UCHAR xor; + INT i, j; + aes_context aesctx; + UCHAR *R; + INT num_blocks = c_len/8; // unit:64bits + + + os_alloc_mem(NULL, (PUCHAR *)&R, 512); + + if (R == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!AES_GTK_KEY_UNWRAP: no memory!!!\n")); + return; + } /* End of if */ + + // Initialize + NdisMoveMemory(A, ciphertext, 8); + //Input plaintext + for(i = 0; i < (c_len-8); i++) + { + R[ i] = ciphertext[i + 8]; + } + + rtmp_aes_set_key(&aesctx, key, 128); + + for(j = 5; j >= 0; j--) + { + for(i = (num_blocks-1); i > 0; i--) + { + xor = (num_blocks -1 )* j + i; + NdisMoveMemory(BIN, A, 8); + BIN[7] = A[7] ^ xor; + NdisMoveMemory(&BIN[8], &R[(i-1)*8], 8); + rtmp_aes_decrypt(&aesctx, BIN, BOUT); + NdisMoveMemory(A, &BOUT[0], 8); + NdisMoveMemory(&R[(i-1)*8], &BOUT[8], 8); + } + } + + // OUTPUT + for(i = 0; i < c_len; i++) + { + plaintext[i] = R[i]; + } + + DBGPRINT_RAW(RT_DEBUG_INFO, ("plaintext = \n")); + for(i = 0; i < (num_blocks *8); i++) + { + DBGPRINT_RAW(RT_DEBUG_INFO, ("%2x ", plaintext[i])); + if(i%16 == 15) + DBGPRINT_RAW(RT_DEBUG_INFO, ("\n ")); + } + DBGPRINT_RAW(RT_DEBUG_INFO, ("\n \n")); + + *p_len = c_len - 8; + os_free_mem(NULL, R); +} + + +/* The value given by [x^(i-1),{00},{00},{00}], with x^(i-1) being powers of x in the field GF(2^8). */ +static const UINT32 aes_rcon[] = { + 0x00000000, 0x01000000, 0x02000000, 0x04000000, + 0x08000000, 0x10000000, 0x20000000, 0x40000000, + 0x80000000, 0x1B000000, 0x36000000}; + +static const UINT8 aes_sbox_enc[] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7 ,0xab, 0x76, /* 0 */ + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4 ,0x72, 0xc0, /* 1 */ + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8 ,0x31, 0x15, /* 2 */ + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27 ,0xb2, 0x75, /* 3 */ + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3 ,0x2f, 0x84, /* 4 */ + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c ,0x58, 0xcf, /* 5 */ + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c ,0x9f, 0xa8, /* 6 */ + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff ,0xf3, 0xd2, /* 7 */ + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d ,0x19, 0x73, /* 8 */ + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e ,0x0b, 0xdb, /* 9 */ + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95 ,0xe4, 0x79, /* a */ + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a ,0xae, 0x08, /* b */ + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd ,0x8b, 0x8a, /* c */ + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1 ,0x1d, 0x9e, /* d */ + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55 ,0x28, 0xdf, /* e */ + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54 ,0xbb, 0x16, /* f */ +}; + +static const UINT8 aes_sbox_dec[] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, /* 0 */ + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, /* 1 */ + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, /* 2 */ + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, /* 3 */ + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, /* 4 */ + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, /* 5 */ + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, /* 6 */ + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, /* 7 */ + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, /* 8 */ + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, /* 9 */ + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, /* a */ + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, /* b */ + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, /* c */ + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, /* d */ + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, /* e */ + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d, /* f */ +}; + +/* ArrayIndex*{02} */ +static const UINT8 aes_mul_2[] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, /* 0 */ + 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, /* 1 */ + 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, /* 2 */ + 0x60, 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, /* 3 */ + 0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, /* 4 */ + 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, /* 5 */ + 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, /* 6 */ + 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, /* 7 */ + 0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, 0x0d, 0x03, 0x01, 0x07, 0x05, /* 8 */ + 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, 0x21, 0x27, 0x25, /* 9 */ + 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, 0x45, /* a */ + 0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, /* b */ + 0x9b, 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, /* c */ + 0xbb, 0xb9, 0xbf, 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, /* d */ + 0xdb, 0xd9, 0xdf, 0xdd, 0xd3, 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, /* e */ + 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5, /* f */ +}; + +/* ArrayIndex*{03} */ +static const UINT8 aes_mul_3[] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, 0x17, 0x12, 0x11, /* 0 */ + 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, 0x21, /* 1 */ + 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, /* 2 */ + 0x50, 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, /* 3 */ + 0xc0, 0xc3, 0xc6, 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, /* 4 */ + 0xf0, 0xf3, 0xf6, 0xf5, 0xfc, 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, /* 5 */ + 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, /* 6 */ + 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, /* 7 */ + 0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86, 0x8f, 0x8c, 0x89, 0x8a, /* 8 */ + 0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, 0xbc, 0xb9, 0xba, /* 9 */ + 0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, 0xea, /* a */ + 0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda, /* b */ + 0x5b, 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, /* c */ + 0x6b, 0x68, 0x6d, 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, /* d */ + 0x3b, 0x38, 0x3d, 0x3e, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, /* e */ + 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a, /* f */ +}; + +/* ArrayIndex*{09} */ +static const UINT8 aes_mul_9[] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, /* 0 */ + 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, 0xe7, /* 1 */ + 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, /* 2 */ + 0xab, 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, /* 3 */ + 0x76, 0x7f, 0x64, 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, /* 4 */ + 0xe6, 0xef, 0xf4, 0xfd, 0xc2, 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, /* 5 */ + 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, /* 6 */ + 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, /* 7 */ + 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, 0xbf, 0x80, 0x89, 0x92, 0x9b, /* 8 */ + 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, 0x19, 0x02, 0x0b, /* 9 */ + 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, 0xa0, /* a */ + 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, /* b */ + 0x9a, 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, /* c */ + 0x0a, 0x03, 0x18, 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, /* d */ + 0xa1, 0xa8, 0xb3, 0xba, 0x85, 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, /* e */ + 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46, /* f */ +}; + +/* ArrayIndex*{0b} */ +static const UINT8 aes_mul_b[] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, 0x7f, 0x62, 0x69, /* 0 */ + 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, 0xd9, /* 1 */ + 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, /* 2 */ + 0xcb, 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, /* 3 */ + 0xf6, 0xfd, 0xe0, 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, /* 4 */ + 0x46, 0x4d, 0x50, 0x5b, 0x6a, 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, /* 5 */ + 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, /* 6 */ + 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, /* 7 */ + 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, 0xb2, 0x83, 0x88, 0x95, 0x9e, /* 8 */ + 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, 0x38, 0x25, 0x2e, /* 9 */ + 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, 0xe5, /* a */ + 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, /* b */ + 0x01, 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, /* c */ + 0xb1, 0xba, 0xa7, 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, /* d */ + 0x7a, 0x71, 0x6c, 0x67, 0x56, 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, /* e */ + 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3, /* f */ +}; + +/* ArrayIndex*{0d} */ +static const UINT8 aes_mul_d[] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, 0x51, 0x46, 0x4b, /* 0 */ + 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, 0x9b, /* 1 */ + 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, /* 2 */ + 0x6b, 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, /* 3 */ + 0x6d, 0x60, 0x77, 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, /* 4 */ + 0xbd, 0xb0, 0xa7, 0xaa, 0x89, 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, /* 5 */ + 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, /* 6 */ + 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, /* 7 */ + 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, 0xa5, 0x86, 0x8b, 0x9c, 0x91, /* 8 */ + 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, 0x5b, 0x4c, 0x41, /* 9 */ + 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, 0x2a, /* a */ + 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, /* b */ + 0xb7, 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, /* c */ + 0x67, 0x6a, 0x7d, 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, /* d */ + 0x0c, 0x01, 0x16, 0x1b, 0x38, 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, /* e */ + 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97, /* f */ +}; + +/* ArrayIndex*{0e} */ +static const UINT8 aes_mul_e[] = { + /* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, 0x46, 0x54, 0x5a, /* 0 */ + 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, 0xba, /* 1 */ + 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, /* 2 */ + 0x3b, 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, /* 3 */ + 0xad, 0xa3, 0xb1, 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, /* 4 */ + 0x4d, 0x43, 0x51, 0x5f, 0x75, 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, /* 5 */ + 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, /* 6 */ + 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, /* 7 */ + 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, 0x23, 0x09, 0x07, 0x15, 0x1b, /* 8 */ + 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, 0xe7, 0xf5, 0xfb, /* 9 */ + 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, 0xc0, /* a */ + 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, /* b */ + 0xec, 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, /* c */ + 0x0c, 0x02, 0x10, 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, /* d */ + 0x37, 0x39, 0x2b, 0x25, 0x0f, 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, /* e */ + 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d, /* f */ +}; + +/* For AES_CMAC */ +#define AES_MAC_LENGTH 16 /* 128-bit string */ +static UINT8 Const_Zero[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static UINT8 Const_Rb[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87}; + +/* +======================================================================== +Routine Description: + AES key expansion (key schedule) + +Arguments: + Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) + KeyLength The length of cipher key in bytes + paes_ctx Pointer to AES_CTX_STRUC + +Return Value: + paes_ctx Retrun the KeyWordExpansion of AES_CTX_STRUC + +Note: + Pseudo code for key expansion + ------------------------------------------ + Nk = (key length/4); + + while (i < Nk) + KeyWordExpansion[i] = word(key[4*i], key[4*i + 1], key[4*i + 2], key[4*i + 3]); + i++; + end while + + while (i < ((key length/4 + 6 + 1)*4) ) + temp = KeyWordExpansion[i - 1]; + if (i % Nk ==0) + temp = SubWord(RotWord(temp)) ^ Rcon[i/Nk]; + else if ((Nk > 6) && (i % 4 == 4)) + temp = SubWord(temp); + end if + + KeyWordExpansion[i] = KeyWordExpansion[i - Nk]^ temp; + i++; + end while +======================================================================== +*/ +VOID RT_AES_KeyExpansion ( + IN UINT8 Key[], + IN UINT KeyLength, + INOUT AES_CTX_STRUC *paes_ctx) +{ + UINT KeyIndex = 0; + UINT NumberOfWordOfKey, NumberOfWordOfKeyExpansion; + UINT8 TempWord[AES_KEY_ROWS], Temp; + UINT32 Temprcon; + + NumberOfWordOfKey = KeyLength >> 2; + while (KeyIndex < NumberOfWordOfKey) + { + paes_ctx->KeyWordExpansion[0][KeyIndex] = Key[4*KeyIndex]; + paes_ctx->KeyWordExpansion[1][KeyIndex] = Key[4*KeyIndex + 1]; + paes_ctx->KeyWordExpansion[2][KeyIndex] = Key[4*KeyIndex + 2]; + paes_ctx->KeyWordExpansion[3][KeyIndex] = Key[4*KeyIndex + 3]; + KeyIndex++; + } /* End of while */ + + NumberOfWordOfKeyExpansion = ((UINT) AES_KEY_ROWS) * ((KeyLength >> 2) + 6 + 1); + while (KeyIndex < NumberOfWordOfKeyExpansion) + { + TempWord[0] = paes_ctx->KeyWordExpansion[0][KeyIndex - 1]; + TempWord[1] = paes_ctx->KeyWordExpansion[1][KeyIndex - 1]; + TempWord[2] = paes_ctx->KeyWordExpansion[2][KeyIndex - 1]; + TempWord[3] = paes_ctx->KeyWordExpansion[3][KeyIndex - 1]; + if ((KeyIndex % NumberOfWordOfKey) == 0) { + Temprcon = aes_rcon[KeyIndex/NumberOfWordOfKey]; + Temp = aes_sbox_enc[TempWord[1]]^((Temprcon >> 24) & 0xff); + TempWord[1] = aes_sbox_enc[TempWord[2]]^((Temprcon >> 16) & 0xff); + TempWord[2] = aes_sbox_enc[TempWord[3]]^((Temprcon >> 8) & 0xff); + TempWord[3] = aes_sbox_enc[TempWord[0]]^((Temprcon ) & 0xff); + TempWord[0] = Temp; + } else if ((NumberOfWordOfKey > 6) && ((KeyIndex % NumberOfWordOfKey) == 4)) { + Temp = aes_sbox_enc[TempWord[0]]; + TempWord[1] = aes_sbox_enc[TempWord[1]]; + TempWord[2] = aes_sbox_enc[TempWord[2]]; + TempWord[3] = aes_sbox_enc[TempWord[3]]; + TempWord[0] = Temp; + } + paes_ctx->KeyWordExpansion[0][KeyIndex] = paes_ctx->KeyWordExpansion[0][KeyIndex - NumberOfWordOfKey]^TempWord[0]; + paes_ctx->KeyWordExpansion[1][KeyIndex] = paes_ctx->KeyWordExpansion[1][KeyIndex - NumberOfWordOfKey]^TempWord[1]; + paes_ctx->KeyWordExpansion[2][KeyIndex] = paes_ctx->KeyWordExpansion[2][KeyIndex - NumberOfWordOfKey]^TempWord[2]; + paes_ctx->KeyWordExpansion[3][KeyIndex] = paes_ctx->KeyWordExpansion[3][KeyIndex - NumberOfWordOfKey]^TempWord[3]; + KeyIndex++; + } /* End of while */ +} /* End of RT_AES_KeyExpansion */ + + +/* +======================================================================== +Routine Description: + AES encryption + +Arguments: + PlainBlock The block of plain text, 16 bytes(128 bits) each block + PlainBlockSize The length of block of plain text in bytes + Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) + KeyLength The length of cipher key in bytes + CipherBlockSize The length of allocated cipher block in bytes + +Return Value: + CipherBlock Return cipher text + CipherBlockSize Return the length of real used cipher block in bytes + +Note: + Reference to FIPS-PUB 197 + 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) + 2. Transfer the plain block to state block + 3. Main encryption rounds + 4. Transfer the state block to cipher block + ------------------------------------------ + NumberOfRound = (key length / 4) + 6; + state block = plain block; + + AddRoundKey(state block, key); + for round = 1 to NumberOfRound + SubBytes(state block) + ShiftRows(state block) + MixColumns(state block) + AddRoundKey(state block, key); + end for + + SubBytes(state block) + ShiftRows(state block) + AddRoundKey(state block, key); + + cipher block = state block; +======================================================================== +*/ +VOID RT_AES_Encrypt ( + IN UINT8 PlainBlock[], + IN UINT PlainBlockSize, + IN UINT8 Key[], + IN UINT KeyLength, + OUT UINT8 CipherBlock[], + INOUT UINT *CipherBlockSize) +{ + AES_CTX_STRUC aes_ctx; + UINT RowIndex, ColumnIndex; + UINT RoundIndex, NumberOfRound = 0; + UINT8 Temp, Row0, Row1, Row2, Row3; + + /* + * 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) + */ + if (PlainBlockSize != AES_BLOCK_SIZES) { + DBGPRINT(RT_DEBUG_ERROR, ("RT_AES_Encrypt: plain block size is %d bytes, it must be %d bytes(128 bits).\n", + PlainBlockSize, AES_BLOCK_SIZES)); + return; + } /* End of if */ + if ((KeyLength != AES_KEY128_LENGTH) && (KeyLength != AES_KEY192_LENGTH) && (KeyLength != AES_KEY256_LENGTH)) { + DBGPRINT(RT_DEBUG_ERROR, ("RT_AES_Encrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n", + KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, AES_KEY256_LENGTH)); + return; + } /* End of if */ + if (*CipherBlockSize < AES_BLOCK_SIZES) { + DBGPRINT(RT_DEBUG_ERROR, ("RT_AES_Encrypt: cipher block size is %d bytes, it must be %d bytes(128 bits).\n", + *CipherBlockSize, AES_BLOCK_SIZES)); + return; + } /* End of if */ + + /* + * 2. Transfer the plain block to state block + */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] = PlainBlock[RowIndex + 4*ColumnIndex]; + + /* + * 3. Main encryption rounds + */ + RT_AES_KeyExpansion(Key, KeyLength, &aes_ctx); + NumberOfRound = (KeyLength >> 2) + 6; + + /* AES_AddRoundKey */ + RoundIndex = 0; + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] ^= aes_ctx.KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex]; + + for (RoundIndex = 1; RoundIndex < NumberOfRound;RoundIndex++) + { + /* AES_SubBytes */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] = aes_sbox_enc[aes_ctx.State[RowIndex][ColumnIndex]]; + + /* AES_ShiftRows */ + Temp = aes_ctx.State[1][0]; + aes_ctx.State[1][0] = aes_ctx.State[1][1]; + aes_ctx.State[1][1] = aes_ctx.State[1][2]; + aes_ctx.State[1][2] = aes_ctx.State[1][3]; + aes_ctx.State[1][3] = Temp; + Temp = aes_ctx.State[2][0]; + aes_ctx.State[2][0] = aes_ctx.State[2][2]; + aes_ctx.State[2][2] = Temp; + Temp = aes_ctx.State[2][1]; + aes_ctx.State[2][1] = aes_ctx.State[2][3]; + aes_ctx.State[2][3] = Temp; + Temp = aes_ctx.State[3][3]; + aes_ctx.State[3][3] = aes_ctx.State[3][2]; + aes_ctx.State[3][2] = aes_ctx.State[3][1]; + aes_ctx.State[3][1] = aes_ctx.State[3][0]; + aes_ctx.State[3][0] = Temp; + + /* AES_MixColumns */ + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + { + Row0 = aes_ctx.State[0][ColumnIndex]; + Row1 = aes_ctx.State[1][ColumnIndex]; + Row2 = aes_ctx.State[2][ColumnIndex]; + Row3 = aes_ctx.State[3][ColumnIndex]; + aes_ctx.State[0][ColumnIndex] = aes_mul_2[Row0]^aes_mul_3[Row1]^Row2^Row3; + aes_ctx.State[1][ColumnIndex] = Row0^aes_mul_2[Row1]^aes_mul_3[Row2]^Row3; + aes_ctx.State[2][ColumnIndex] = Row0^Row1^aes_mul_2[Row2]^aes_mul_3[Row3]; + aes_ctx.State[3][ColumnIndex] = aes_mul_3[Row0]^Row1^Row2^aes_mul_2[Row3]; + } + + /* AES_AddRoundKey */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] ^= aes_ctx.KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex]; + } /* End of for */ + + /* AES_SubBytes */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] = aes_sbox_enc[aes_ctx.State[RowIndex][ColumnIndex]]; + /* AES_ShiftRows */ + Temp = aes_ctx.State[1][0]; + aes_ctx.State[1][0] = aes_ctx.State[1][1]; + aes_ctx.State[1][1] = aes_ctx.State[1][2]; + aes_ctx.State[1][2] = aes_ctx.State[1][3]; + aes_ctx.State[1][3] = Temp; + Temp = aes_ctx.State[2][0]; + aes_ctx.State[2][0] = aes_ctx.State[2][2]; + aes_ctx.State[2][2] = Temp; + Temp = aes_ctx.State[2][1]; + aes_ctx.State[2][1] = aes_ctx.State[2][3]; + aes_ctx.State[2][3] = Temp; + Temp = aes_ctx.State[3][3]; + aes_ctx.State[3][3] = aes_ctx.State[3][2]; + aes_ctx.State[3][2] = aes_ctx.State[3][1]; + aes_ctx.State[3][1] = aes_ctx.State[3][0]; + aes_ctx.State[3][0] = Temp; + /* AES_AddRoundKey */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] ^= aes_ctx.KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex]; + + /* + * 4. Transfer the state block to cipher block + */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + CipherBlock[RowIndex + 4*ColumnIndex] = aes_ctx.State[RowIndex][ColumnIndex]; + + *CipherBlockSize = ((UINT) AES_STATE_ROWS)*((UINT) AES_STATE_COLUMNS); +} /* End of RT_AES_Encrypt */ + + +/* +======================================================================== +Routine Description: + AES decryption + +Arguments: + CipherBlock The block of cipher text, 16 bytes(128 bits) each block + CipherBlockSize The length of block of cipher text in bytes + Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) + KeyLength The length of cipher key in bytes + PlainBlockSize The length of allocated plain block in bytes + +Return Value: + PlainBlock Return plain text + PlainBlockSize Return the length of real used plain block in bytes + +Note: + Reference to FIPS-PUB 197 + 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) + 2. Transfer the cipher block to state block + 3. Main decryption rounds + 4. Transfer the state block to plain block + ------------------------------------------ + NumberOfRound = (key length / 4) + 6; + state block = cipher block; + + AddRoundKey(state block, key); + for round = NumberOfRound to 1 + InvSubBytes(state block) + InvShiftRows(state block) + InvMixColumns(state block) + AddRoundKey(state block, key); + end for + + InvSubBytes(state block) + InvShiftRows(state block) + AddRoundKey(state block, key); + + plain block = state block; +======================================================================== +*/ +VOID RT_AES_Decrypt ( + IN UINT8 CipherBlock[], + IN UINT CipherBlockSize, + IN UINT8 Key[], + IN UINT KeyLength, + OUT UINT8 PlainBlock[], + INOUT UINT *PlainBlockSize) +{ + AES_CTX_STRUC aes_ctx; + UINT RowIndex, ColumnIndex; + UINT RoundIndex, NumberOfRound = 0; + UINT8 Temp, Row0, Row1, Row2, Row3; + + /* + * 1. Check if block size is 16 bytes(128 bits) and if key length is 16, 24, or 32 bytes(128, 192, or 256 bits) + */ + if (*PlainBlockSize < AES_BLOCK_SIZES) { + DBGPRINT(RT_DEBUG_ERROR, ("RT_AES_Decrypt: plain block size is %d bytes, it must be %d bytes(128 bits).\n", + *PlainBlockSize, AES_BLOCK_SIZES)); + return; + } /* End of if */ + if ((KeyLength != AES_KEY128_LENGTH) && (KeyLength != AES_KEY192_LENGTH) && (KeyLength != AES_KEY256_LENGTH)) { + DBGPRINT(RT_DEBUG_ERROR, ("RT_AES_Decrypt: key length is %d bytes, it must be %d, %d, or %d bytes(128, 192, or 256 bits).\n", + KeyLength, AES_KEY128_LENGTH, AES_KEY192_LENGTH, AES_KEY256_LENGTH)); + return; + } /* End of if */ + if (CipherBlockSize != AES_BLOCK_SIZES) { + DBGPRINT(RT_DEBUG_ERROR, ("RT_AES_Decrypt: cipher block size is %d bytes, it must be %d bytes(128 bits).\n", + CipherBlockSize, AES_BLOCK_SIZES)); + return; + } /* End of if */ + + /* + * 2. Transfer the cipher block to state block + */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] = CipherBlock[RowIndex + 4*ColumnIndex]; + + /* + * 3. Main decryption rounds + */ + RT_AES_KeyExpansion(Key, KeyLength, &aes_ctx); + NumberOfRound = (KeyLength >> 2) + 6; + + /* AES_AddRoundKey */ + RoundIndex = NumberOfRound; + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] ^= aes_ctx.KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex]; + + for (RoundIndex = (NumberOfRound - 1); RoundIndex > 0 ;RoundIndex--) + { + /* AES_InvShiftRows */ + Temp = aes_ctx.State[1][3]; + aes_ctx.State[1][3] = aes_ctx.State[1][2]; + aes_ctx.State[1][2] = aes_ctx.State[1][1]; + aes_ctx.State[1][1] = aes_ctx.State[1][0]; + aes_ctx.State[1][0] = Temp; + Temp = aes_ctx.State[2][0]; + aes_ctx.State[2][0] = aes_ctx.State[2][2]; + aes_ctx.State[2][2] = Temp; + Temp = aes_ctx.State[2][1]; + aes_ctx.State[2][1] = aes_ctx.State[2][3]; + aes_ctx.State[2][3] = Temp; + Temp = aes_ctx.State[3][0]; + aes_ctx.State[3][0] = aes_ctx.State[3][1]; + aes_ctx.State[3][1] = aes_ctx.State[3][2]; + aes_ctx.State[3][2] = aes_ctx.State[3][3]; + aes_ctx.State[3][3] = Temp; + + /* AES_InvSubBytes */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] = aes_sbox_dec[aes_ctx.State[RowIndex][ColumnIndex]]; + + /* AES_AddRoundKey */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] ^= aes_ctx.KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex]; + + /* AES_InvMixColumns */ + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + { + Row0 = aes_ctx.State[0][ColumnIndex]; + Row1 = aes_ctx.State[1][ColumnIndex]; + Row2 = aes_ctx.State[2][ColumnIndex]; + Row3 = aes_ctx.State[3][ColumnIndex]; + aes_ctx.State[0][ColumnIndex] = aes_mul_e[Row0]^aes_mul_b[Row1]^aes_mul_d[Row2]^aes_mul_9[Row3]; + aes_ctx.State[1][ColumnIndex] = aes_mul_9[Row0]^aes_mul_e[Row1]^aes_mul_b[Row2]^aes_mul_d[Row3]; + aes_ctx.State[2][ColumnIndex] = aes_mul_d[Row0]^aes_mul_9[Row1]^aes_mul_e[Row2]^aes_mul_b[Row3]; + aes_ctx.State[3][ColumnIndex] = aes_mul_b[Row0]^aes_mul_d[Row1]^aes_mul_9[Row2]^aes_mul_e[Row3]; + } + } /* End of for */ + + /* AES_InvShiftRows */ + Temp = aes_ctx.State[1][3]; + aes_ctx.State[1][3] = aes_ctx.State[1][2]; + aes_ctx.State[1][2] = aes_ctx.State[1][1]; + aes_ctx.State[1][1] = aes_ctx.State[1][0]; + aes_ctx.State[1][0] = Temp; + Temp = aes_ctx.State[2][0]; + aes_ctx.State[2][0] = aes_ctx.State[2][2]; + aes_ctx.State[2][2] = Temp; + Temp = aes_ctx.State[2][1]; + aes_ctx.State[2][1] = aes_ctx.State[2][3]; + aes_ctx.State[2][3] = Temp; + Temp = aes_ctx.State[3][0]; + aes_ctx.State[3][0] = aes_ctx.State[3][1]; + aes_ctx.State[3][1] = aes_ctx.State[3][2]; + aes_ctx.State[3][2] = aes_ctx.State[3][3]; + aes_ctx.State[3][3] = Temp; + /* AES_InvSubBytes */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] = aes_sbox_dec[aes_ctx.State[RowIndex][ColumnIndex]]; + /* AES_AddRoundKey */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + aes_ctx.State[RowIndex][ColumnIndex] ^= aes_ctx.KeyWordExpansion[RowIndex][(RoundIndex*((UINT) AES_STATE_COLUMNS)) + ColumnIndex]; + + /* + * 4. Transfer the state block to plain block + */ + for (RowIndex = 0; RowIndex < AES_STATE_ROWS;RowIndex++) + for (ColumnIndex = 0; ColumnIndex < AES_STATE_COLUMNS;ColumnIndex++) + PlainBlock[RowIndex + 4*ColumnIndex] = aes_ctx.State[RowIndex][ColumnIndex]; + + *PlainBlockSize = ((UINT) AES_STATE_ROWS)*((UINT) AES_STATE_COLUMNS); +} /* End of RT_AES_Decrypt */ + + + +/* +======================================================================== +Routine Description: + AES-CBCMAC + +Arguments: + Payload Data + PayloadLength The length of data in bytes + Key Cipher key + KeyLength The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes) + Nonce Nonce + NonceLength The length of nonce in bytes + AAD Additional authenticated data + AADLength The length of AAD in bytes + MACLength The length of MAC in bytes + +Return Value: + MACText The mac + +Note: + Reference to RFC 3601, and NIST 800-38C. +======================================================================== +*/ +VOID AES_CCM_MAC ( + IN UINT8 Payload[], + IN UINT PayloadLength, + IN UINT8 Key[], + IN UINT KeyLength, + IN UINT8 Nonce[], + IN UINT NonceLength, + IN UINT8 AAD[], + IN UINT AADLength, + IN UINT MACLength, + OUT UINT8 MACText[]) +{ + UINT8 Block[AES_BLOCK_SIZES], Block_MAC[AES_BLOCK_SIZES]; + UINT Block_Index = 0, ADD_Index = 0, Payload_Index = 0; + UINT Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0; + + /* + * 1. Formatting of the Control Information and the Nonce + */ + NdisZeroMemory(Block, AES_BLOCK_SIZES); + if (AADLength > 0) + Block[0] |= 0x40; /* Set bit 6 to 1 */ + Temp_Value = ((MACLength - 2) >> 1) << 3; /* Set bit 3-5 to (t-2)/2 */ + Block[0] |= Temp_Value; + Temp_Value = (15 - NonceLength) - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */ + Block[0] |= Temp_Value; + for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++) + Block[Temp_Index + 1] = Nonce[Temp_Index]; + if (NonceLength < 12) + Block[12] = (PayloadLength >> 24) & 0xff; + if (NonceLength < 13) + Block[13] = (PayloadLength >> 16) & 0xff; + Block[14] = (PayloadLength >> 8) & 0xff; + Block[15] = PayloadLength & 0xff; + + NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES); + Temp_Length = sizeof(Block_MAC); + RT_AES_Encrypt(Block, AES_BLOCK_SIZES , Key, KeyLength, Block_MAC, &Temp_Length); + + /* + * 2. Formatting of the Associated Data + * If 0 < AADLength < (2^16 - 2^8), AData_Length = 2 + * If (2^16 - 2^8) < AADLength < 2^32, AData_Length = 6 + * If 2^32 < AADLength < 2^64, AData_Length = 10 (not implement) + */ + NdisZeroMemory(Block, AES_BLOCK_SIZES); + if ((AADLength > 0) && (AADLength < 0xFF00)) { + Block_Index = 2; + Block[0] = (AADLength >> 8) & 0xff; + Block[1] = AADLength & 0xff; + } else { + Block_Index = 6; + Block[2] = (AADLength >> 24) & 0xff; + Block[3] = (AADLength >> 16) & 0xff; + Block[4] = (AADLength >> 8) & 0xff; + Block[5] = AADLength & 0xff; + } /* End of if */ + + while (ADD_Index < AADLength) + { + Copy_Length = AADLength - ADD_Index; + if (Copy_Length > AES_BLOCK_SIZES) + Copy_Length = AES_BLOCK_SIZES; + if ((Copy_Length + Block_Index) > AES_BLOCK_SIZES) { + Copy_Length = AES_BLOCK_SIZES - Block_Index; + } /* End of if */ + for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++) + Block[Temp_Index + Block_Index] = AAD[ADD_Index + Temp_Index]; + for (Temp_Index = 0; Temp_Index < AES_BLOCK_SIZES; Temp_Index++) + Block[Temp_Index] ^= Block_MAC[Temp_Index]; + NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES); + Temp_Length = sizeof(Block_MAC); + RT_AES_Encrypt(Block, AES_BLOCK_SIZES , Key, KeyLength, Block_MAC, &Temp_Length); + ADD_Index += Copy_Length; + Block_Index = 0; + NdisZeroMemory(Block, AES_BLOCK_SIZES); + } /* End of while */ + + /* + * 3. Calculate the MAC (MIC) + */ + while (Payload_Index < PayloadLength) + { + NdisZeroMemory(Block, AES_BLOCK_SIZES); + Copy_Length = PayloadLength - Payload_Index; + if (Copy_Length > AES_BLOCK_SIZES) + Copy_Length = AES_BLOCK_SIZES; + for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++) + Block[Temp_Index] = Payload[Payload_Index + Temp_Index]; + for (Temp_Index = 0; Temp_Index < AES_BLOCK_SIZES; Temp_Index++) + Block[Temp_Index] ^= Block_MAC[Temp_Index]; + NdisZeroMemory(Block_MAC, AES_BLOCK_SIZES); + Temp_Length = sizeof(Block_MAC); + RT_AES_Encrypt(Block, AES_BLOCK_SIZES , Key, KeyLength, Block_MAC, &Temp_Length); + Payload_Index += Copy_Length; + } /* End of while */ + for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++) + MACText[Temp_Index] = Block_MAC[Temp_Index]; +} /* End of AES_CCM_MAC */ + + +/* +======================================================================== +Routine Description: + AES-CBCMAC Encryption + +Arguments: + PlainText Plain text + PlainTextLength The length of plain text in bytes + Key Cipher key + KeyLength The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes) + Nonce Nonce + NonceLength The length of nonce in bytes + AAD Additional authenticated data + AADLength The length of AAD in bytes + MACLength The length of MAC in bytes + CipherTextLength The length of allocated memory spaces in bytes + +Return Value: + CipherText The ciphertext + CipherTextLength Return the length of the ciphertext in bytes + +Function Value: + 0: Success + -1: The key length must be 16 bytes. + -2: A valid nonce length is 7-13 bytes. + -3: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes. + -4: The CipherTextLength is not enough. + +Note: + Reference to RFC 3601, and NIST 800-38C. + Here, the implement of AES_CCM is suitable for WI_FI. +======================================================================== +*/ +INT AES_CCM_Encrypt ( + IN UINT8 PlainText[], + IN UINT PlainTextLength, + IN UINT8 Key[], + IN UINT KeyLength, + IN UINT8 Nonce[], + IN UINT NonceLength, + IN UINT8 AAD[], + IN UINT AADLength, + IN UINT MACLength, + OUT UINT8 CipherText[], + INOUT UINT *CipherTextLength) +{ + UINT8 Block_MAC[AES_BLOCK_SIZES]; + UINT8 Block_CTR[AES_BLOCK_SIZES], Block_CTR_Cipher[AES_BLOCK_SIZES]; + UINT Cipher_Index = 0; + UINT Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0; + + /* + * 1. Check Input Values + * - Key length must be 16 bytes + * - Nonce length range is form 7 to 13 bytes + * - MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes + * - CipherTextLength > PlainTextLength + MACLength + */ + if (KeyLength != AES_KEY128_LENGTH) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Encrypt: The key length must be %d bytes\n", AES_KEY128_LENGTH)); + return -1; + } /* End of if */ + + if ((NonceLength < 7) || (NonceLength > 13)) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Encrypt: A valid nonce length is 7-13 bytes\n")); + return -2; + } /* End of if */ + + if ((MACLength != 4) && (MACLength != 6) && (MACLength != 8) && (MACLength != 10) + && (MACLength != 12) && (MACLength != 14) && (MACLength != 16)) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Encrypt: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes\n")); + return -3; + } /* End of if */ + + if (*CipherTextLength < (PlainTextLength + MACLength)) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Encrypt: The CipherTextLength is not enough.\n")); + return -4; + } /* End of if */ + + + /* + * 1. Formatting of the Counter Block + */ + NdisZeroMemory(Block_CTR, AES_BLOCK_SIZES); + Temp_Value = (15 - NonceLength) - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */ + Block_CTR[0] |= Temp_Value; + for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++) + Block_CTR[Temp_Index + 1] = Nonce[Temp_Index]; + + /* + * 2. Calculate the MAC (MIC) + */ + AES_CCM_MAC(PlainText, PlainTextLength, Key, KeyLength, Nonce, NonceLength, AAD, AADLength, MACLength, Block_MAC); + Temp_Length = sizeof(Block_CTR_Cipher); + RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES , Key, KeyLength, Block_CTR_Cipher, &Temp_Length); + for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++) + Block_MAC[Temp_Index] ^= Block_CTR_Cipher[Temp_Index]; + + /* + * 3. Cipher Payload + */ + while (Cipher_Index < PlainTextLength) + { + Block_CTR[15] += 1; + Temp_Length = sizeof(Block_CTR_Cipher); + RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES , Key, KeyLength, Block_CTR_Cipher, &Temp_Length); + + Copy_Length = PlainTextLength - Cipher_Index; + if (Copy_Length > AES_BLOCK_SIZES) + Copy_Length = AES_BLOCK_SIZES; + for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++) + CipherText[Cipher_Index + Temp_Index] = PlainText[Cipher_Index + Temp_Index]^Block_CTR_Cipher[Temp_Index]; + + Cipher_Index += Copy_Length; + } /* End of while */ + for (Temp_Index = 0; Temp_Index < MACLength; Temp_Index++) + CipherText[PlainTextLength + Temp_Index] = Block_MAC[Temp_Index]; + *CipherTextLength = PlainTextLength + MACLength; + + return 0; +} /* End of AES_CCM_Encrypt */ + + +/* +======================================================================== +Routine Description: + AES-CBCMAC Decryption + +Arguments: + CipherText The ciphertext + CipherTextLength The length of cipher text in bytes + Key Cipher key + KeyLength The length of cipher key in bytes depend on block cipher (16, 24, or 32 bytes) + Nonce Nonce + NonceLength The length of nonce in bytes + AAD Additional authenticated data + AADLength The length of AAD in bytes + CipherTextLength The length of allocated memory spaces in bytes + +Return Value: + PlainText Plain text + PlainTextLength Return the length of the plain text in bytes + +Function Value: + 0: Success + -1: The key length must be 16 bytes. + -2: A valid nonce length is 7-13 bytes. + -3: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes. + -4: The PlainTextLength is not enough. + -5: The MIC does not match. + +Note: + Reference to RFC 3601, and NIST 800-38C. + Here, the implement of AES_CCM is suitable for WI_FI. +======================================================================== +*/ +INT AES_CCM_Decrypt ( + IN UINT8 CipherText[], + IN UINT CipherTextLength, + IN UINT8 Key[], + IN UINT KeyLength, + IN UINT8 Nonce[], + IN UINT NonceLength, + IN UINT8 AAD[], + IN UINT AADLength, + IN UINT MACLength, + OUT UINT8 PlainText[], + INOUT UINT *PlainTextLength) +{ + UINT8 Block_MAC[AES_BLOCK_SIZES], Block_MAC_From_Cipher[AES_BLOCK_SIZES]; + UINT8 Block_CTR[AES_BLOCK_SIZES], Block_CTR_Cipher[AES_BLOCK_SIZES]; + UINT Block_Index = 0, Cipher_Index = 0; + UINT Temp_Value = 0, Temp_Index = 0, Temp_Length = 0, Copy_Length = 0; + + + /* + * 1. Check Input Values + * - Key length must be 16 bytes + * - Nonce length range is form 7 to 13 bytes + */ + if (KeyLength != AES_KEY128_LENGTH) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Decrypt: The key length must be %d bytes\n", AES_KEY128_LENGTH)); + return -1; + } /* End of if */ + + if ((NonceLength < 7) || (NonceLength > 13)) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Decrypt: A valid nonce length is 7-13 bytes\n")); + return -2; + } /* End of if */ + + if ((MACLength != 4) && (MACLength != 6) && (MACLength != 8) && (MACLength != 10) + && (MACLength != 12) && (MACLength != 14) && (MACLength != 16)) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Decrypt: The MAC length must be 4, 6, 8, 10, 12, 14, or 16 bytes\n")); + return -3; + } /* End of if */ + + if (*PlainTextLength < (CipherTextLength - MACLength)) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Decrypt: The PlainTextLength is not enough.\n")); + return -4; + } /* End of if */ + + /* + * 2. Formatting of the Counter Block + */ + NdisZeroMemory(Block_CTR, AES_BLOCK_SIZES); + Temp_Value = (15 - NonceLength) - 1; /* Set bit 0-2 to (q-1), q = 15 - Nonce Length */ + Block_CTR[0] |= Temp_Value; + for (Temp_Index = 0; Temp_Index < NonceLength; Temp_Index++) + Block_CTR[Temp_Index + 1] = Nonce[Temp_Index]; + Temp_Length = sizeof(Block_CTR_Cipher); + RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES , Key, KeyLength, Block_CTR_Cipher, &Temp_Length); + + /* + * 3. Catch the MAC (MIC) from CipherText + */ + Block_Index = 0; + for (Temp_Index = (CipherTextLength - MACLength); Temp_Index < CipherTextLength; Temp_Index++, Block_Index++) + Block_MAC_From_Cipher[Block_Index] = CipherText[Temp_Index]^Block_CTR_Cipher[Block_Index]; + + /* + * 4. Decryption the Payload + */ + while (Cipher_Index < (CipherTextLength - MACLength)) + { + Block_CTR[15] += 1; + Temp_Length = sizeof(Block_CTR_Cipher); + RT_AES_Encrypt(Block_CTR, AES_BLOCK_SIZES , Key, KeyLength, Block_CTR_Cipher, &Temp_Length); + + Copy_Length = (CipherTextLength - MACLength) - Cipher_Index; + if (Copy_Length > AES_BLOCK_SIZES) + Copy_Length = AES_BLOCK_SIZES; + for (Temp_Index = 0; Temp_Index < Copy_Length; Temp_Index++) + PlainText[Cipher_Index + Temp_Index] = CipherText[Cipher_Index + Temp_Index]^Block_CTR_Cipher[Temp_Index]; + Cipher_Index += Copy_Length; + } /* End of while */ + *PlainTextLength = CipherTextLength - MACLength; + + /* + * 5. Calculate the MAC (MIC) from Payload + */ + AES_CCM_MAC(PlainText, *PlainTextLength, Key, KeyLength, Nonce, NonceLength, AAD, AADLength, MACLength, Block_MAC); + + /* + * 6. Check the MIC + */ + if (NdisCmpMemory(Block_MAC_From_Cipher, Block_MAC, MACLength) != 0) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CCM_Decrypt: The MIC does not match.\n")); + return -5; + } /* End of if */ + + return 0; +} /* End of AES_CCM_Decrypt */ + + +/* +======================================================================== +Routine Description: + AES-CMAC generate subkey + +Arguments: + Key Cipher key 128 bits + KeyLength The length of Cipher key in bytes + +Return Value: + SubKey1 SubKey 1 128 bits + SubKey2 SubKey 2 128 bits + +Note: + Reference to RFC 4493 + + Step 1. L := AES-128(K, const_Zero); + Step 2. if MSB(L) is equal to 0 + then K1 := L << 1; + else K1 := (L << 1) XOR const_Rb; + Step 3. if MSB(K1) is equal to 0 + then K2 := K1 << 1; + else K2 := (K1 << 1) XOR const_Rb; + Step 4. return K1, K2; +======================================================================== +*/ +VOID AES_CMAC_GenerateSubKey ( + IN UINT8 Key[], + IN UINT KeyLength, + OUT UINT8 SubKey1[], + OUT UINT8 SubKey2[]) +{ + UINT8 MSB_L = 0, MSB_K1 = 0, Top_Bit = 0; + UINT SubKey1_Length = 0; + INT Index = 0; + + if (KeyLength != AES_KEY128_LENGTH) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CMAC_GenerateSubKey: key length is %d bytes, it must be %d bytes(128 bits).\n", + KeyLength, AES_KEY128_LENGTH)); + return; + } /* End of if */ + + /* Step 1: L := AES-128(K, const_Zero); */ + SubKey1_Length = 16; + RT_AES_Encrypt(Const_Zero, sizeof(Const_Zero), Key, KeyLength, SubKey1, &SubKey1_Length); + + /* + * Step 2. if MSB(L) is equal to 0 + * then K1 := L << 1; + * else K1 := (L << 1) XOR const_Rb; + */ + MSB_L = SubKey1[0] & 0x80; + for(Index = 0; Index < 15; Index++) { + Top_Bit = (SubKey1[Index + 1] & 0x80)?1:0; + SubKey1[Index] <<= 1; + SubKey1[Index] |= Top_Bit; + } + SubKey1[15] <<= 1; + if (MSB_L > 0) { + for(Index = 0; Index < 16; Index++) + SubKey1[Index] ^= Const_Rb[Index]; + } /* End of if */ + + /* + * Step 3. if MSB(K1) is equal to 0 + * then K2 := K1 << 1; + * else K2 := (K1 << 1) XOR const_Rb; + */ + MSB_K1 = SubKey1[0] & 0x80; + for(Index = 0; Index < 15; Index++) { + Top_Bit = (SubKey1[Index + 1] & 0x80)?1:0; + SubKey2[Index] = SubKey1[Index] << 1; + SubKey2[Index] |= Top_Bit; + } + SubKey2[15] = SubKey1[15] << 1; + if (MSB_K1 > 0) { + for(Index = 0; Index < 16; Index++) + SubKey2[Index] ^= Const_Rb[Index]; + } /* End of if */ +} /* End of AES_CMAC_GenerateSubKey */ + + +/* +======================================================================== +Routine Description: + AES-CMAC + +Arguments: + PlainText Plain text + PlainTextLength The length of plain text in bytes + Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) + KeyLength The length of cipher key in bytes + MACTextLength The length of allocated memory spaces in bytes + +Return Value: + MACText Message authentication code (128-bit string) + MACTextLength Return the length of Message authentication code in bytes + +Note: + Reference to RFC 4493 +======================================================================== +*/ +VOID AES_CMAC ( + IN UINT8 PlainText[], + IN UINT PlainTextLength, + IN UINT8 Key[], + IN UINT KeyLength, + OUT UINT8 MACText[], + INOUT UINT *MACTextLength) +{ + UINT PlainBlockStart; + UINT8 X[AES_BLOCK_SIZES], Y[AES_BLOCK_SIZES]; + UINT8 SubKey1[16]; + UINT8 SubKey2[16]; + INT Index; + UINT X_Length; + + if (*MACTextLength < AES_MAC_LENGTH) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CMAC: MAC text length is less than %d bytes).\n", + AES_MAC_LENGTH)); + return; + } /* End of if */ + if (KeyLength != AES_KEY128_LENGTH) { + DBGPRINT(RT_DEBUG_ERROR, ("AES_CMAC: key length is %d bytes, it must be %d bytes(128 bits).\n", + KeyLength, AES_KEY128_LENGTH)); + return; + } /* End of if */ + + /* Step 1. (K1,K2) := Generate_Subkey(K); */ + NdisZeroMemory(SubKey1, 16); + NdisZeroMemory(SubKey2, 16); + AES_CMAC_GenerateSubKey(Key, KeyLength, SubKey1, SubKey2); + + /* + * 2. Main algorithm + * - Plain text divide into serveral blocks (16 bytes/block) + * - If plain text is not divided with no remainder by block, padding size = (block - remainder plain text) + * - Execute RT_AES_Encrypt procedure. + */ + PlainBlockStart = 0; + NdisMoveMemory(X, Const_Zero, AES_BLOCK_SIZES); + while ((PlainTextLength - PlainBlockStart) > AES_BLOCK_SIZES) + { + for (Index = 0; Index < AES_BLOCK_SIZES; Index++) + Y[Index] = PlainText[PlainBlockStart + Index]^X[Index]; + + X_Length = sizeof(X); + RT_AES_Encrypt(Y, sizeof(Y) , Key, KeyLength, X, &X_Length); + PlainBlockStart += ((UINT) AES_BLOCK_SIZES); + } /* End of while */ + if ((PlainTextLength - PlainBlockStart) == AES_BLOCK_SIZES) { + for (Index = 0; Index < AES_BLOCK_SIZES; Index++) + Y[Index] = PlainText[PlainBlockStart + Index]^X[Index]^SubKey1[Index]; + } else { + NdisZeroMemory(Y, AES_BLOCK_SIZES); + NdisMoveMemory(Y, &PlainText[PlainBlockStart], (PlainTextLength - PlainBlockStart)); + Y[(PlainTextLength - PlainBlockStart)] = 0x80; + for (Index = 0; Index < AES_BLOCK_SIZES; Index++) + Y[Index] = Y[Index]^X[Index]^SubKey2[Index]; + } /* End of if */ + RT_AES_Encrypt(Y, sizeof(Y) , Key, KeyLength, MACText, MACTextLength); +} /* End of AES_CMAC */ + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_arc4.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_arc4.c new file mode 100644 index 000000000..0fffda8a4 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_arc4.c @@ -0,0 +1,152 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + + + +/**************************************************************************** + Module Name: + RC4 + + Abstract: + + Revision History: + Who When What + -------- ---------- ------------------------------------------ + Eddy 2009/05/13 ARC4 +***************************************************************************/ + +#include "crypt_arc4.h" + + +/* +======================================================================== +Routine Description: + ARC4 initialize the key block + +Arguments: + pARC4_CTX Pointer to ARC4 CONTEXT + Key Cipher key, it may be 16, 24, or 32 bytes (128, 192, or 256 bits) + KeyLength The length of cipher key in bytes + +======================================================================== +*/ +VOID ARC4_INIT ( + IN ARC4_CTX_STRUC *pARC4_CTX, + IN PUCHAR pKey, + IN UINT KeyLength) +{ + UINT BlockIndex = 0, SWAPIndex = 0, KeyIndex = 0; + UINT8 TempValue = 0; + + //Initialize the block value + pARC4_CTX->BlockIndex1 = 0; + pARC4_CTX->BlockIndex2 = 0; + for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++) + pARC4_CTX->KeyBlock[BlockIndex] = (UINT8) BlockIndex; + + //Key schedule + for (BlockIndex = 0; BlockIndex < ARC4_KEY_BLOCK_SIZE; BlockIndex++) + { + TempValue = pARC4_CTX->KeyBlock[BlockIndex]; + KeyIndex = BlockIndex % KeyLength; + SWAPIndex = (SWAPIndex + TempValue + pKey[KeyIndex]) & 0xff; + pARC4_CTX->KeyBlock[BlockIndex] = pARC4_CTX->KeyBlock[SWAPIndex]; + pARC4_CTX->KeyBlock[SWAPIndex] = TempValue; + } /* End of for */ + +} /* End of ARC4_INIT */ + + +/* +======================================================================== +Routine Description: + ARC4 encryption/decryption + +Arguments: + pARC4_CTX Pointer to ARC4 CONTEXT + InputText Input text + InputTextLength The length of input text in bytes + +Return Value: + OutputBlock Return output text + ======================================================================== +*/ +VOID ARC4_Compute ( + IN ARC4_CTX_STRUC *pARC4_CTX, + IN UINT8 InputBlock[], + IN UINT InputBlockSize, + OUT UINT8 OutputBlock[]) +{ + UINT InputIndex = 0; + UINT8 TempValue = 0; + + for (InputIndex = 0; InputIndex < InputBlockSize; InputIndex++) + { + pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff; + TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]; + pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff; + + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2]; + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue; + + TempValue = (TempValue + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]) & 0xff; + OutputBlock[InputIndex] = InputBlock[InputIndex]^pARC4_CTX->KeyBlock[TempValue]; + + } /* End of for */ +} /* End of ARC4_Compute */ + + +/* +======================================================================== +Routine Description: + Discard the key length + +Arguments: + pARC4_CTX Pointer to ARC4 CONTEXT + Length Discard the key length + +======================================================================== +*/ +VOID ARC4_Discard_KeyLength ( + IN ARC4_CTX_STRUC *pARC4_CTX, + IN UINT Length) +{ + UINT Index = 0; + UINT8 TempValue = 0; + + for (Index = 0; Index < Length; Index++) + { + pARC4_CTX->BlockIndex1 = (pARC4_CTX->BlockIndex1 + 1) & 0xff; + TempValue = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1]; + pARC4_CTX->BlockIndex2 = (pARC4_CTX->BlockIndex2 + TempValue) & 0xff; + + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex1] = pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2]; + pARC4_CTX->KeyBlock[pARC4_CTX->BlockIndex2] = TempValue; + } /* End of for */ + +} /* End of ARC4_Discard_KeyLength */ + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_hmac.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_hmac.c new file mode 100644 index 000000000..7615941bc --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_hmac.c @@ -0,0 +1,142 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + + +#include "crypt_hmac.h" + + +#if defined(__cplusplus) +extern "C" +{ +#endif + +/* initialise the HMAC context to zero */ +void hmac_sha_begin(hmac_ctx cx[1]) +{ + memset(cx, 0, sizeof(hmac_ctx)); +} + +/* input the HMAC key (can be called multiple times) */ +int hmac_sha_key(const unsigned char key[], unsigned int key_len, hmac_ctx cx[1]) +{ + if(cx->klen == HMAC_IN_DATA) /* error if further key input */ + return HMAC_BAD_MODE; /* is attempted in data mode */ + + if(cx->klen + key_len > HASH_INPUT_SIZE) /* if the key has to be hashed */ + { + if(cx->klen <= HASH_INPUT_SIZE) /* if the hash has not yet been */ + { /* started, initialise it and */ + sha_begin(cx->ctx); /* hash stored key characters */ + sha_hash(cx->key, cx->klen, cx->ctx); + } + + sha_hash(key, key_len, cx->ctx); /* hash long key data into hash */ + } + else /* otherwise store key data */ + memcpy(cx->key + cx->klen, key, key_len); + + cx->klen += key_len; /* update the key length count */ + return HMAC_OK; +} + +/* input the HMAC data (can be called multiple times) - */ +/* note that this call terminates the key input phase */ +void hmac_sha_data(const unsigned char data[], unsigned int data_len, hmac_ctx cx[1]) +{ unsigned int i; + + if(cx->klen != HMAC_IN_DATA) /* if not yet in data phase */ + { + if(cx->klen > HASH_INPUT_SIZE) /* if key is being hashed */ + { /* complete the hash and */ + sha_end(cx->key, cx->ctx); /* store the result as the */ + cx->klen = HASH_OUTPUT_SIZE; /* key and set new length */ + } + + /* pad the key if necessary */ + memset(cx->key + cx->klen, 0, HASH_INPUT_SIZE - cx->klen); + + /* xor ipad into key value */ + for(i = 0; i < (HASH_INPUT_SIZE >> 2); ++i) + ((unsigned int*)cx->key)[i] ^= 0x36363636; + + /* and start hash operation */ + sha_begin(cx->ctx); + sha_hash(cx->key, HASH_INPUT_SIZE, cx->ctx); + + /* mark as now in data mode */ + cx->klen = HMAC_IN_DATA; + } + + /* hash the data (if any) */ + if(data_len) + sha_hash(data, data_len, cx->ctx); +} + +/* compute and output the MAC value */ +void hmac_sha_end(unsigned char mac[], unsigned int mac_len, hmac_ctx cx[1]) +{ unsigned char dig[HASH_OUTPUT_SIZE]; + unsigned int i; + + /* if no data has been entered perform a null data phase */ + if(cx->klen != HMAC_IN_DATA) + hmac_sha_data((const unsigned char*)0, 0, cx); + + sha_end(dig, cx->ctx); /* complete the inner hash */ + + /* set outer key value using opad and removing ipad */ + for(i = 0; i < (HASH_INPUT_SIZE >> 2); ++i) + ((unsigned int*)cx->key)[i] ^= 0x36363636 ^ 0x5c5c5c5c; + + /* perform the outer hash operation */ + sha_begin(cx->ctx); + sha_hash(cx->key, HASH_INPUT_SIZE, cx->ctx); + sha_hash(dig, HASH_OUTPUT_SIZE, cx->ctx); + sha_end(dig, cx->ctx); + + /* output the hash value */ + for(i = 0; i < mac_len; ++i) + mac[i] = dig[i]; +} + +/* 'do it all in one go' subroutine */ +void hmac_sha(const unsigned char key[], unsigned int key_len, + const unsigned char data[], unsigned int data_len, + unsigned char mac[], unsigned int mac_len) +{ hmac_ctx cx[1]; + + hmac_sha_begin(cx); + hmac_sha_key(key, key_len, cx); + hmac_sha_data(data, data_len, cx); + hmac_sha_end(mac, mac_len, cx); +} + +#if defined(__cplusplus) +} +#endif + + +/* End of crypt_hmac.c */ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_md5.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_md5.c new file mode 100644 index 000000000..0e7da291c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_md5.c @@ -0,0 +1,756 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + + +#include "rt_config.h" + + +/** + * md5_mac: + * @key: pointer to the key used for MAC generation + * @key_len: length of the key in bytes + * @data: pointer to the data area for which the MAC is generated + * @data_len: length of the data in bytes + * @mac: pointer to the buffer holding space for the MAC; the buffer should + * have space for 128-bit (16 bytes) MD5 hash value + * + * md5_mac() determines the message authentication code by using secure hash + * MD5(key | data | key). + */ +void md5_mac(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac) +{ + MD5_CTX context; + + MD5Init(&context); + MD5Update(&context, key, key_len); + MD5Update(&context, data, data_len); + MD5Update(&context, key, key_len); + MD5Final(mac, &context); +} + +/** + * hmac_md5: + * @key: pointer to the key used for MAC generation + * @key_len: length of the key in bytes + * @data: pointer to the data area for which the MAC is generated + * @data_len: length of the data in bytes + * @mac: pointer to the buffer holding space for the MAC; the buffer should + * have space for 128-bit (16 bytes) MD5 hash value + * + * hmac_md5() determines the message authentication code using HMAC-MD5. + * This implementation is based on the sample code presented in RFC 2104. + */ +void hmac_md5(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac) +{ + MD5_CTX context; + u8 k_ipad[65]; /* inner padding - key XORd with ipad */ + u8 k_opad[65]; /* outer padding - key XORd with opad */ + u8 tk[16]; + int i; + + //assert(key != NULL && data != NULL && mac != NULL); + + /* if key is longer than 64 bytes reset it to key = MD5(key) */ + if (key_len > 64) { + MD5_CTX ttcontext; + + MD5Init(&ttcontext); + MD5Update(&ttcontext, key, key_len); + MD5Final(tk, &ttcontext); + //key=(PUCHAR)ttcontext.buf; + key = tk; + key_len = 16; + } + + /* the HMAC_MD5 transform looks like: + * + * MD5(K XOR opad, MD5(K XOR ipad, text)) + * + * where K is an n byte key + * ipad is the byte 0x36 repeated 64 times + * opad is the byte 0x5c repeated 64 times + * and text is the data being protected */ + + /* start out by storing key in pads */ + NdisZeroMemory(k_ipad, sizeof(k_ipad)); + NdisZeroMemory(k_opad, sizeof(k_opad)); + //assert(key_len < sizeof(k_ipad)); + NdisMoveMemory(k_ipad, key, key_len); + NdisMoveMemory(k_opad, key, key_len); + + /* XOR key with ipad and opad values */ + for (i = 0; i < 64; i++) { + k_ipad[i] ^= 0x36; + k_opad[i] ^= 0x5c; + } + + /* perform inner MD5 */ + MD5Init(&context); /* init context for 1st pass */ + MD5Update(&context, k_ipad, 64); /* start with inner pad */ + MD5Update(&context, data, data_len); /* then text of datagram */ + MD5Final(mac, &context); /* finish up 1st pass */ + + /* perform outer MD5 */ + MD5Init(&context); /* init context for 2nd pass */ + MD5Update(&context, k_opad, 64); /* start with outer pad */ + MD5Update(&context, mac, 16); /* then results of 1st hash */ + MD5Final(mac, &context); /* finish up 2nd pass */ +} + +#ifndef RT_BIG_ENDIAN +#define byteReverse(buf, len) /* Nothing */ +#else +void byteReverse(unsigned char *buf, unsigned longs); +void byteReverse(unsigned char *buf, unsigned longs) +{ + do { + *(ULONG *)buf = SWAP32(*(ULONG *)buf); + buf += 4; + } while (--longs); +} +#endif + + +/* ========================== MD5 implementation =========================== */ +// four base functions for MD5 +#define MD5_F1(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define MD5_F2(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define MD5_F3(x, y, z) ((x) ^ (y) ^ (z)) +#define MD5_F4(x, y, z) ((y) ^ ((x) | (~z))) +#define CYCLIC_LEFT_SHIFT(w, s) (((w) << (s)) | ((w) >> (32-(s)))) + +#define MD5Step(f, w, x, y, z, data, t, s) \ + ( w += f(x, y, z) + data + t, w = (CYCLIC_LEFT_SHIFT(w, s)) & 0xffffffff, w += x ) + + +/* + * Function Description: + * Initiate MD5 Context satisfied in RFC 1321 + * + * Arguments: + * pCtx Pointer to MD5 context + * + * Return Value: + * None + */ +VOID MD5Init(MD5_CTX *pCtx) +{ + pCtx->Buf[0]=0x67452301; + pCtx->Buf[1]=0xefcdab89; + pCtx->Buf[2]=0x98badcfe; + pCtx->Buf[3]=0x10325476; + + pCtx->LenInBitCount[0]=0; + pCtx->LenInBitCount[1]=0; +} + + +/* + * Function Description: + * Update MD5 Context, allow of an arrary of octets as the next portion + * of the message + * + * Arguments: + * pCtx Pointer to MD5 context + * pData Pointer to input data + * LenInBytes The length of input data (unit: byte) + * + * Return Value: + * None + * + * Note: + * Called after MD5Init or MD5Update(itself) + */ +VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, ULONG LenInBytes) +{ + + ULONG TfTimes; + ULONG temp; + unsigned int i; + + temp = pCtx->LenInBitCount[0]; + + pCtx->LenInBitCount[0] = (ULONG) (pCtx->LenInBitCount[0] + (LenInBytes << 3)); + + if (pCtx->LenInBitCount[0] < temp) + pCtx->LenInBitCount[1]++; //carry in + + pCtx->LenInBitCount[1] += LenInBytes >> 29; + + // mod 64 bytes + temp = (temp >> 3) & 0x3f; + + // process lacks of 64-byte data + if (temp) + { + UCHAR *pAds = (UCHAR *) pCtx->Input + temp; + + if ((temp+LenInBytes) < 64) + { + NdisMoveMemory(pAds, (UCHAR *)pData, LenInBytes); + return; + } + + NdisMoveMemory(pAds, (UCHAR *)pData, 64-temp); + byteReverse(pCtx->Input, 16); + MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input); + + pData += 64-temp; + LenInBytes -= 64-temp; + } // end of if (temp) + + + TfTimes = (LenInBytes >> 6); + + for (i=TfTimes; i>0; i--) + { + NdisMoveMemory(pCtx->Input, (UCHAR *)pData, 64); + byteReverse(pCtx->Input, 16); + MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input); + pData += 64; + LenInBytes -= 64; + } // end of for + + // buffering lacks of 64-byte data + if(LenInBytes) + NdisMoveMemory(pCtx->Input, (UCHAR *)pData, LenInBytes); + +} + + +/* + * Function Description: + * Append padding bits and length of original message in the tail + * The message digest has to be completed in the end + * + * Arguments: + * Digest Output of Digest-Message for MD5 + * pCtx Pointer to MD5 context + * + * Return Value: + * None + * + * Note: + * Called after MD5Update + */ +VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx) +{ + UCHAR Remainder; + UCHAR PadLenInBytes; + UCHAR *pAppend=0; + unsigned int i; + + Remainder = (UCHAR)((pCtx->LenInBitCount[0] >> 3) & 0x3f); + + PadLenInBytes = (Remainder < 56) ? (56-Remainder) : (120-Remainder); + + pAppend = (UCHAR *)pCtx->Input + Remainder; + + // padding bits without crossing block(64-byte based) boundary + if (Remainder < 56) + { + *pAppend = 0x80; + PadLenInBytes --; + + NdisZeroMemory((UCHAR *)pCtx->Input + Remainder+1, PadLenInBytes); + + // add data-length field, from low to high + for (i=0; i<4; i++) + { + pCtx->Input[56+i] = (UCHAR)((pCtx->LenInBitCount[0] >> (i << 3)) & 0xff); + pCtx->Input[60+i] = (UCHAR)((pCtx->LenInBitCount[1] >> (i << 3)) & 0xff); + } + + byteReverse(pCtx->Input, 16); + MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input); + } // end of if + + // padding bits with crossing block(64-byte based) boundary + else + { + // the first block === + *pAppend = 0x80; + PadLenInBytes --; + + NdisZeroMemory((UCHAR *)pCtx->Input + Remainder+1, (64-Remainder-1)); + PadLenInBytes -= (64 - Remainder - 1); + + byteReverse(pCtx->Input, 16); + MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input); + + + // the second block === + NdisZeroMemory((UCHAR *)pCtx->Input, PadLenInBytes); + + // add data-length field + for (i=0; i<4; i++) + { + pCtx->Input[56+i] = (UCHAR)((pCtx->LenInBitCount[0] >> (i << 3)) & 0xff); + pCtx->Input[60+i] = (UCHAR)((pCtx->LenInBitCount[1] >> (i << 3)) & 0xff); + } + + byteReverse(pCtx->Input, 16); + MD5Transform(pCtx->Buf, (ULONG *)pCtx->Input); + } // end of else + + + NdisMoveMemory((UCHAR *)Digest, (ULONG *)pCtx->Buf, 16); // output + byteReverse((UCHAR *)Digest, 4); + NdisZeroMemory(pCtx, sizeof(pCtx)); // memory free +} + + +/* + * Function Description: + * The central algorithm of MD5, consists of four rounds and sixteen + * steps per round + * + * Arguments: + * Buf Buffers of four states (output: 16 bytes) + * Mes Input data (input: 64 bytes) + * + * Return Value: + * None + * + * Note: + * Called by MD5Update or MD5Final + */ +VOID MD5Transform(ULONG Buf[4], ULONG Mes[16]) +{ + ULONG Reg[4], Temp; + unsigned int i; + + static UCHAR LShiftVal[16] = + { + 7, 12, 17, 22, + 5, 9 , 14, 20, + 4, 11, 16, 23, + 6, 10, 15, 21, + }; + + + // [equal to 4294967296*abs(sin(index))] + static ULONG MD5Table[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + + + for (i=0; i<4; i++) + Reg[i]=Buf[i]; + + + // 64 steps in MD5 algorithm + for (i=0; i<16; i++) + { + MD5Step(MD5_F1, Reg[0], Reg[1], Reg[2], Reg[3], Mes[i], + MD5Table[i], LShiftVal[i & 0x3]); + + // one-word right shift + Temp = Reg[3]; + Reg[3] = Reg[2]; + Reg[2] = Reg[1]; + Reg[1] = Reg[0]; + Reg[0] = Temp; + } + for (i=16; i<32; i++) + { + MD5Step(MD5_F2, Reg[0], Reg[1], Reg[2], Reg[3], Mes[(5*(i & 0xf)+1) & 0xf], + MD5Table[i], LShiftVal[(0x1 << 2)+(i & 0x3)]); + + // one-word right shift + Temp = Reg[3]; + Reg[3] = Reg[2]; + Reg[2] = Reg[1]; + Reg[1] = Reg[0]; + Reg[0] = Temp; + } + for (i=32; i<48; i++) + { + MD5Step(MD5_F3, Reg[0], Reg[1], Reg[2], Reg[3], Mes[(3*(i & 0xf)+5) & 0xf], + MD5Table[i], LShiftVal[(0x1 << 3)+(i & 0x3)]); + + // one-word right shift + Temp = Reg[3]; + Reg[3] = Reg[2]; + Reg[2] = Reg[1]; + Reg[1] = Reg[0]; + Reg[0] = Temp; + } + for (i=48; i<64; i++) + { + MD5Step(MD5_F4, Reg[0], Reg[1], Reg[2], Reg[3], Mes[(7*(i & 0xf)) & 0xf], + MD5Table[i], LShiftVal[(0x3 << 2)+(i & 0x3)]); + + // one-word right shift + Temp = Reg[3]; + Reg[3] = Reg[2]; + Reg[2] = Reg[1]; + Reg[1] = Reg[0]; + Reg[0] = Temp; + } + + + // (temporary)output + for (i=0; i<4; i++) + Buf[i] += Reg[i]; + +} + + + +/* ========================= SHA-1 implementation ========================== */ +// four base functions for SHA-1 +#define SHA1_F1(b, c, d) (((b) & (c)) | ((~b) & (d))) +#define SHA1_F2(b, c, d) ((b) ^ (c) ^ (d)) +#define SHA1_F3(b, c, d) (((b) & (c)) | ((b) & (d)) | ((c) & (d))) + + +#define SHA1Step(f, a, b, c, d, e, w, k) \ + ( e += ( f(b, c, d) + w + k + CYCLIC_LEFT_SHIFT(a, 5)) & 0xffffffff, \ + b = CYCLIC_LEFT_SHIFT(b, 30) ) + +//Initiate SHA-1 Context satisfied in RFC 3174 +VOID SHAInit(SHA_CTX *pCtx) +{ + pCtx->Buf[0]=0x67452301; + pCtx->Buf[1]=0xefcdab89; + pCtx->Buf[2]=0x98badcfe; + pCtx->Buf[3]=0x10325476; + pCtx->Buf[4]=0xc3d2e1f0; + + pCtx->LenInBitCount[0]=0; + pCtx->LenInBitCount[1]=0; +} + +/* + * Function Description: + * Update SHA-1 Context, allow of an arrary of octets as the next + * portion of the message + * + * Arguments: + * pCtx Pointer to SHA-1 context + * pData Pointer to input data + * LenInBytes The length of input data (unit: byte) + * + * Return Value: + * error indicate more than pow(2,64) bits of data + * + * Note: + * Called after SHAInit or SHAUpdate(itself) + */ +UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, ULONG LenInBytes) +{ + ULONG TfTimes; + ULONG temp1,temp2; + unsigned int i; + UCHAR err=1; + + temp1 = pCtx->LenInBitCount[0]; + temp2 = pCtx->LenInBitCount[1]; + + pCtx->LenInBitCount[0] = (ULONG) (pCtx->LenInBitCount[0] + (LenInBytes << 3)); + if (pCtx->LenInBitCount[0] < temp1) + pCtx->LenInBitCount[1]++; //carry in + + + pCtx->LenInBitCount[1] = (ULONG) (pCtx->LenInBitCount[1] +(LenInBytes >> 29)); + if (pCtx->LenInBitCount[1] < temp2) + return (err); //check total length of original data + + + // mod 64 bytes + temp1 = (temp1 >> 3) & 0x3f; + + // process lacks of 64-byte data + if (temp1) + { + UCHAR *pAds = (UCHAR *) pCtx->Input + temp1; + + if ((temp1+LenInBytes) < 64) + { + NdisMoveMemory(pAds, (UCHAR *)pData, LenInBytes); + return (0); + } + + NdisMoveMemory(pAds, (UCHAR *)pData, 64-temp1); + byteReverse((UCHAR *)pCtx->Input, 16); + + NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16); + SHATransform(pCtx->Buf, (ULONG *)pCtx->Input); + + pData += 64-temp1; + LenInBytes -= 64-temp1; + } // end of if (temp1) + + + TfTimes = (LenInBytes >> 6); + + for (i=TfTimes; i>0; i--) + { + NdisMoveMemory(pCtx->Input, (UCHAR *)pData, 64); + byteReverse((UCHAR *)pCtx->Input, 16); + + NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16); + SHATransform(pCtx->Buf, (ULONG *)pCtx->Input); + pData += 64; + LenInBytes -= 64; + } // end of for + + // buffering lacks of 64-byte data + if(LenInBytes) + NdisMoveMemory(pCtx->Input, (UCHAR *)pData, LenInBytes); + + return (0); + +} + +// Append padding bits and length of original message in the tail +// The message digest has to be completed in the end +VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20]) +{ + UCHAR Remainder; + UCHAR PadLenInBytes; + UCHAR *pAppend=0; + unsigned int i; + + Remainder = (UCHAR)((pCtx->LenInBitCount[0] >> 3) & 0x3f); + + pAppend = (UCHAR *)pCtx->Input + Remainder; + + PadLenInBytes = (Remainder < 56) ? (56-Remainder) : (120-Remainder); + + // padding bits without crossing block(64-byte based) boundary + if (Remainder < 56) + { + *pAppend = 0x80; + PadLenInBytes --; + + NdisZeroMemory((UCHAR *)pCtx->Input + Remainder+1, PadLenInBytes); + + // add data-length field, from high to low + for (i=0; i<4; i++) + { + pCtx->Input[56+i] = (UCHAR)((pCtx->LenInBitCount[1] >> ((3-i) << 3)) & 0xff); + pCtx->Input[60+i] = (UCHAR)((pCtx->LenInBitCount[0] >> ((3-i) << 3)) & 0xff); + } + + byteReverse((UCHAR *)pCtx->Input, 16); + NdisZeroMemory((UCHAR *)pCtx->Input + 64, 14); + SHATransform(pCtx->Buf, (ULONG *)pCtx->Input); + } // end of if + + // padding bits with crossing block(64-byte based) boundary + else + { + // the first block === + *pAppend = 0x80; + PadLenInBytes --; + + NdisZeroMemory((UCHAR *)pCtx->Input + Remainder+1, (64-Remainder-1)); + PadLenInBytes -= (64 - Remainder - 1); + + byteReverse((UCHAR *)pCtx->Input, 16); + NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16); + SHATransform(pCtx->Buf, (ULONG *)pCtx->Input); + + + // the second block === + NdisZeroMemory((UCHAR *)pCtx->Input, PadLenInBytes); + + // add data-length field + for (i=0; i<4; i++) + { + pCtx->Input[56+i] = (UCHAR)((pCtx->LenInBitCount[1] >> ((3-i) << 3)) & 0xff); + pCtx->Input[60+i] = (UCHAR)((pCtx->LenInBitCount[0] >> ((3-i) << 3)) & 0xff); + } + + byteReverse((UCHAR *)pCtx->Input, 16); + NdisZeroMemory((UCHAR *)pCtx->Input + 64, 16); + SHATransform(pCtx->Buf, (ULONG *)pCtx->Input); + } // end of else + + + //Output, bytereverse + for (i=0; i<20; i++) + { + Digest [i] = (UCHAR)(pCtx->Buf[i>>2] >> 8*(3-(i & 0x3))); + } + + NdisZeroMemory(pCtx, sizeof(pCtx)); // memory free +} + + +// The central algorithm of SHA-1, consists of four rounds and +// twenty steps per round +VOID SHATransform(ULONG Buf[5], ULONG Mes[20]) +{ + ULONG Reg[5],Temp; + unsigned int i; + ULONG W[80]; + + static ULONG SHA1Table[4] = { 0x5a827999, 0x6ed9eba1, + 0x8f1bbcdc, 0xca62c1d6 }; + + Reg[0]=Buf[0]; + Reg[1]=Buf[1]; + Reg[2]=Buf[2]; + Reg[3]=Buf[3]; + Reg[4]=Buf[4]; + + //the first octet of a word is stored in the 0th element, bytereverse + for(i = 0; i < 16; i++) + { + W[i] = (Mes[i] >> 24) & 0xff; + W[i] |= (Mes[i] >> 8 ) & 0xff00; + W[i] |= (Mes[i] << 8 ) & 0xff0000; + W[i] |= (Mes[i] << 24) & 0xff000000; + } + + + for (i = 0; i < 64; i++) + W[16+i] = CYCLIC_LEFT_SHIFT(W[i] ^ W[2+i] ^ W[8+i] ^ W[13+i], 1); + + + // 80 steps in SHA-1 algorithm + for (i=0; i<80; i++) + { + if (i<20) + SHA1Step(SHA1_F1, Reg[0], Reg[1], Reg[2], Reg[3], Reg[4], + W[i], SHA1Table[0]); + + else if (i>=20 && i<40) + SHA1Step(SHA1_F2, Reg[0], Reg[1], Reg[2], Reg[3], Reg[4], + W[i], SHA1Table[1]); + + else if (i>=40 && i<60) + SHA1Step(SHA1_F3, Reg[0], Reg[1], Reg[2], Reg[3], Reg[4], + W[i], SHA1Table[2]); + + else + SHA1Step(SHA1_F2, Reg[0], Reg[1], Reg[2], Reg[3], Reg[4], + W[i], SHA1Table[3]); + + + // one-word right shift + Temp = Reg[4]; + Reg[4] = Reg[3]; + Reg[3] = Reg[2]; + Reg[2] = Reg[1]; + Reg[1] = Reg[0]; + Reg[0] = Temp; + + } // end of for-loop + + + // (temporary)output + for (i=0; i<5; i++) + Buf[i] += Reg[i]; + +} + + +/* + ======================================================================== + + Routine Description: + SHA1 function + + Arguments: + + Return Value: + + Note: + + ======================================================================== +*/ +VOID HMAC_SHA1( + IN UCHAR *text, + IN UINT text_len, + IN UCHAR *key, + IN UINT key_len, + IN UCHAR *digest) +{ + SHA_CTX context; + UCHAR k_ipad[65]; /* inner padding - key XORd with ipad */ + UCHAR k_opad[65]; /* outer padding - key XORd with opad */ + INT i; + + // if key is longer than 64 bytes reset it to key=SHA1(key) + if (key_len > 64) + { + SHA_CTX tctx; + SHAInit(&tctx); + SHAUpdate(&tctx, key, key_len); + SHAFinal(&tctx, key); + key_len = 20; + } + NdisZeroMemory(k_ipad, sizeof(k_ipad)); + NdisZeroMemory(k_opad, sizeof(k_opad)); + NdisMoveMemory(k_ipad, key, key_len); + NdisMoveMemory(k_opad, key, key_len); + + // XOR key with ipad and opad values + for (i = 0; i < 64; i++) + { + k_ipad[i] ^= 0x36; + k_opad[i] ^= 0x5c; + } + + // perform inner SHA1 + SHAInit(&context); /* init context for 1st pass */ + SHAUpdate(&context, k_ipad, 64); /* start with inner pad */ + SHAUpdate(&context, text, text_len); /* then text of datagram */ + SHAFinal(&context, digest); /* finish up 1st pass */ + + //perform outer SHA1 + SHAInit(&context); /* init context for 2nd pass */ + SHAUpdate(&context, k_opad, 64); /* start with outer pad */ + SHAUpdate(&context, digest, 20); /* then results of 1st hash */ + SHAFinal(&context, digest); /* finish up 2nd pass */ +} + + +/* End of crypt_md5.c */ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_sha2.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_sha2.c new file mode 100644 index 000000000..8a30b10a5 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/crypt_sha2.c @@ -0,0 +1,715 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + + +#include "rt_config.h" + + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#ifdef _MSC_VER +#pragma intrinsic(memcpy) +#endif + +#if 0 && defined(_MSC_VER) +#define rotl32 _lrotl +#define rotr32 _lrotr +#else +#define rotl32(x,n) (((x) << n) | ((x) >> (32 - n))) +#define rotr32(x,n) (((x) >> n) | ((x) << (32 - n))) +#endif + +#if !defined(bswap_32) +#define bswap_32(x) ((rotr32((x), 24) & 0x00ff00ff) | (rotr32((x), 8) & 0xff00ff00)) +#endif + +#ifdef __BIG_ENDIAN +#undef SWAP_BYTES +#else +#define SWAP_BYTES +#endif + + +#define ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define maj(x,y,z) (((x) & (y)) | ((z) & ((x) ^ (y)))) + + +/* round transforms for SHA256 and SHA512 compression functions */ + +#define vf(n,i) v[(n - i) & 7] + +#define hf(i) (p[i & 15] += \ + g_1(p[(i + 14) & 15]) + p[(i + 9) & 15] + g_0(p[(i + 1) & 15])) + +#define v_cycle(i,j) \ + vf(7,i) += (j ? hf(i) : p[i]) + k_0[i+j] \ + + s_1(vf(4,i)) + ch(vf(4,i),vf(5,i),vf(6,i)); \ + vf(3,i) += vf(7,i); \ + vf(7,i) += s_0(vf(0,i))+ maj(vf(0,i),vf(1,i),vf(2,i)) + +#if defined(SHA_224) || defined(SHA_256) + +#define SHA256_MASK (SHA256_BLOCK_SIZE - 1) + +#if defined(SWAP_BYTES) +#define bsw_32(p,n) \ + { int _i = (n); while(_i--) ((uint_32t*)p)[_i] = bswap_32(((uint_32t*)p)[_i]); } +#else +#define bsw_32(p,n) +#endif + +#define s_0(x) (rotr32((x), 2) ^ rotr32((x), 13) ^ rotr32((x), 22)) +#define s_1(x) (rotr32((x), 6) ^ rotr32((x), 11) ^ rotr32((x), 25)) +#define g_0(x) (rotr32((x), 7) ^ rotr32((x), 18) ^ ((x) >> 3)) +#define g_1(x) (rotr32((x), 17) ^ rotr32((x), 19) ^ ((x) >> 10)) +#define k_0 k256 + +/* rotated SHA256 round definition. Rather than swapping variables as in */ +/* FIPS-180, different variables are 'rotated' on each round, returning */ +/* to their starting positions every eight rounds */ + +#define q(n) v##n + +#define one_cycle(a,b,c,d,e,f,g,h,k,w) \ + q(h) += s_1(q(e)) + ch(q(e), q(f), q(g)) + k + w; \ + q(d) += q(h); q(h) += s_0(q(a)) + maj(q(a), q(b), q(c)) + +/* SHA256 mixing data */ + +const uint_32t k256[64] = +{ 0x428a2f98ul, 0x71374491ul, 0xb5c0fbcful, 0xe9b5dba5ul, + 0x3956c25bul, 0x59f111f1ul, 0x923f82a4ul, 0xab1c5ed5ul, + 0xd807aa98ul, 0x12835b01ul, 0x243185beul, 0x550c7dc3ul, + 0x72be5d74ul, 0x80deb1feul, 0x9bdc06a7ul, 0xc19bf174ul, + 0xe49b69c1ul, 0xefbe4786ul, 0x0fc19dc6ul, 0x240ca1ccul, + 0x2de92c6ful, 0x4a7484aaul, 0x5cb0a9dcul, 0x76f988daul, + 0x983e5152ul, 0xa831c66dul, 0xb00327c8ul, 0xbf597fc7ul, + 0xc6e00bf3ul, 0xd5a79147ul, 0x06ca6351ul, 0x14292967ul, + 0x27b70a85ul, 0x2e1b2138ul, 0x4d2c6dfcul, 0x53380d13ul, + 0x650a7354ul, 0x766a0abbul, 0x81c2c92eul, 0x92722c85ul, + 0xa2bfe8a1ul, 0xa81a664bul, 0xc24b8b70ul, 0xc76c51a3ul, + 0xd192e819ul, 0xd6990624ul, 0xf40e3585ul, 0x106aa070ul, + 0x19a4c116ul, 0x1e376c08ul, 0x2748774cul, 0x34b0bcb5ul, + 0x391c0cb3ul, 0x4ed8aa4aul, 0x5b9cca4ful, 0x682e6ff3ul, + 0x748f82eeul, 0x78a5636ful, 0x84c87814ul, 0x8cc70208ul, + 0x90befffaul, 0xa4506cebul, 0xbef9a3f7ul, 0xc67178f2ul, +}; + +/* Compile 64 bytes of hash data into SHA256 digest value */ +/* NOTE: this routine assumes that the byte order in the */ +/* ctx->wbuf[] at this point is such that low address bytes */ +/* in the ORIGINAL byte stream will go into the high end of */ +/* words on BOTH big and little endian systems */ + +void_ret sha256_compile(sha256_ctx ctx[1]) +{ +#if !defined(UNROLL_SHA2) + + uint_32t j, *p = ctx->wbuf, v[8]; + + memcpy(v, ctx->hash, 8 * sizeof(uint_32t)); + + for(j = 0; j < 64; j += 16) + { + v_cycle( 0, j); v_cycle( 1, j); + v_cycle( 2, j); v_cycle( 3, j); + v_cycle( 4, j); v_cycle( 5, j); + v_cycle( 6, j); v_cycle( 7, j); + v_cycle( 8, j); v_cycle( 9, j); + v_cycle(10, j); v_cycle(11, j); + v_cycle(12, j); v_cycle(13, j); + v_cycle(14, j); v_cycle(15, j); + } + + ctx->hash[0] += v[0]; ctx->hash[1] += v[1]; + ctx->hash[2] += v[2]; ctx->hash[3] += v[3]; + ctx->hash[4] += v[4]; ctx->hash[5] += v[5]; + ctx->hash[6] += v[6]; ctx->hash[7] += v[7]; + +#else + + uint_32t *p = ctx->wbuf,v0,v1,v2,v3,v4,v5,v6,v7; + + v0 = ctx->hash[0]; v1 = ctx->hash[1]; + v2 = ctx->hash[2]; v3 = ctx->hash[3]; + v4 = ctx->hash[4]; v5 = ctx->hash[5]; + v6 = ctx->hash[6]; v7 = ctx->hash[7]; + + one_cycle(0,1,2,3,4,5,6,7,k256[ 0],p[ 0]); + one_cycle(7,0,1,2,3,4,5,6,k256[ 1],p[ 1]); + one_cycle(6,7,0,1,2,3,4,5,k256[ 2],p[ 2]); + one_cycle(5,6,7,0,1,2,3,4,k256[ 3],p[ 3]); + one_cycle(4,5,6,7,0,1,2,3,k256[ 4],p[ 4]); + one_cycle(3,4,5,6,7,0,1,2,k256[ 5],p[ 5]); + one_cycle(2,3,4,5,6,7,0,1,k256[ 6],p[ 6]); + one_cycle(1,2,3,4,5,6,7,0,k256[ 7],p[ 7]); + one_cycle(0,1,2,3,4,5,6,7,k256[ 8],p[ 8]); + one_cycle(7,0,1,2,3,4,5,6,k256[ 9],p[ 9]); + one_cycle(6,7,0,1,2,3,4,5,k256[10],p[10]); + one_cycle(5,6,7,0,1,2,3,4,k256[11],p[11]); + one_cycle(4,5,6,7,0,1,2,3,k256[12],p[12]); + one_cycle(3,4,5,6,7,0,1,2,k256[13],p[13]); + one_cycle(2,3,4,5,6,7,0,1,k256[14],p[14]); + one_cycle(1,2,3,4,5,6,7,0,k256[15],p[15]); + + one_cycle(0,1,2,3,4,5,6,7,k256[16],hf( 0)); + one_cycle(7,0,1,2,3,4,5,6,k256[17],hf( 1)); + one_cycle(6,7,0,1,2,3,4,5,k256[18],hf( 2)); + one_cycle(5,6,7,0,1,2,3,4,k256[19],hf( 3)); + one_cycle(4,5,6,7,0,1,2,3,k256[20],hf( 4)); + one_cycle(3,4,5,6,7,0,1,2,k256[21],hf( 5)); + one_cycle(2,3,4,5,6,7,0,1,k256[22],hf( 6)); + one_cycle(1,2,3,4,5,6,7,0,k256[23],hf( 7)); + one_cycle(0,1,2,3,4,5,6,7,k256[24],hf( 8)); + one_cycle(7,0,1,2,3,4,5,6,k256[25],hf( 9)); + one_cycle(6,7,0,1,2,3,4,5,k256[26],hf(10)); + one_cycle(5,6,7,0,1,2,3,4,k256[27],hf(11)); + one_cycle(4,5,6,7,0,1,2,3,k256[28],hf(12)); + one_cycle(3,4,5,6,7,0,1,2,k256[29],hf(13)); + one_cycle(2,3,4,5,6,7,0,1,k256[30],hf(14)); + one_cycle(1,2,3,4,5,6,7,0,k256[31],hf(15)); + + one_cycle(0,1,2,3,4,5,6,7,k256[32],hf( 0)); + one_cycle(7,0,1,2,3,4,5,6,k256[33],hf( 1)); + one_cycle(6,7,0,1,2,3,4,5,k256[34],hf( 2)); + one_cycle(5,6,7,0,1,2,3,4,k256[35],hf( 3)); + one_cycle(4,5,6,7,0,1,2,3,k256[36],hf( 4)); + one_cycle(3,4,5,6,7,0,1,2,k256[37],hf( 5)); + one_cycle(2,3,4,5,6,7,0,1,k256[38],hf( 6)); + one_cycle(1,2,3,4,5,6,7,0,k256[39],hf( 7)); + one_cycle(0,1,2,3,4,5,6,7,k256[40],hf( 8)); + one_cycle(7,0,1,2,3,4,5,6,k256[41],hf( 9)); + one_cycle(6,7,0,1,2,3,4,5,k256[42],hf(10)); + one_cycle(5,6,7,0,1,2,3,4,k256[43],hf(11)); + one_cycle(4,5,6,7,0,1,2,3,k256[44],hf(12)); + one_cycle(3,4,5,6,7,0,1,2,k256[45],hf(13)); + one_cycle(2,3,4,5,6,7,0,1,k256[46],hf(14)); + one_cycle(1,2,3,4,5,6,7,0,k256[47],hf(15)); + + one_cycle(0,1,2,3,4,5,6,7,k256[48],hf( 0)); + one_cycle(7,0,1,2,3,4,5,6,k256[49],hf( 1)); + one_cycle(6,7,0,1,2,3,4,5,k256[50],hf( 2)); + one_cycle(5,6,7,0,1,2,3,4,k256[51],hf( 3)); + one_cycle(4,5,6,7,0,1,2,3,k256[52],hf( 4)); + one_cycle(3,4,5,6,7,0,1,2,k256[53],hf( 5)); + one_cycle(2,3,4,5,6,7,0,1,k256[54],hf( 6)); + one_cycle(1,2,3,4,5,6,7,0,k256[55],hf( 7)); + one_cycle(0,1,2,3,4,5,6,7,k256[56],hf( 8)); + one_cycle(7,0,1,2,3,4,5,6,k256[57],hf( 9)); + one_cycle(6,7,0,1,2,3,4,5,k256[58],hf(10)); + one_cycle(5,6,7,0,1,2,3,4,k256[59],hf(11)); + one_cycle(4,5,6,7,0,1,2,3,k256[60],hf(12)); + one_cycle(3,4,5,6,7,0,1,2,k256[61],hf(13)); + one_cycle(2,3,4,5,6,7,0,1,k256[62],hf(14)); + one_cycle(1,2,3,4,5,6,7,0,k256[63],hf(15)); + + ctx->hash[0] += v0; ctx->hash[1] += v1; + ctx->hash[2] += v2; ctx->hash[3] += v3; + ctx->hash[4] += v4; ctx->hash[5] += v5; + ctx->hash[6] += v6; ctx->hash[7] += v7; +#endif +} + +/* SHA256 hash data in an array of bytes into hash buffer */ +/* and call the hash_compile function as required. */ + +void_ret sha256_hash(const unsigned char data[], unsigned int len, sha256_ctx ctx[1]) +{ uint_32t pos = (uint_32t)(ctx->count[0] & SHA256_MASK), + space = SHA256_BLOCK_SIZE - pos; + const unsigned char *sp = data; + + if((ctx->count[0] += len) < len) + ++(ctx->count[1]); + + while(len >= space) /* tranfer whole blocks while possible */ + { + memcpy(((unsigned char*)ctx->wbuf) + pos, sp, space); + sp += space; len -= space; space = SHA256_BLOCK_SIZE; pos = 0; + bsw_32(ctx->wbuf, SHA256_BLOCK_SIZE >> 2) + sha256_compile(ctx); + } + + memcpy(((unsigned char*)ctx->wbuf) + pos, sp, len); +} + +/* SHA256 Final padding and digest calculation */ + +static void sha_end1(unsigned char hval[], sha256_ctx ctx[1], const unsigned int hlen) +{ uint_32t i = (uint_32t)(ctx->count[0] & SHA256_MASK); + + /* put bytes in the buffer in an order in which references to */ + /* 32-bit words will put bytes with lower addresses into the */ + /* top of 32 bit words on BOTH big and little endian machines */ + bsw_32(ctx->wbuf, (i + 3) >> 2) + + /* we now need to mask valid bytes and add the padding which is */ + /* a single 1 bit and as many zero bits as necessary. Note that */ + /* we can always add the first padding byte here because the */ + /* buffer always has at least one empty slot */ + ctx->wbuf[i >> 2] &= 0xffffff80 << 8 * (~i & 3); + ctx->wbuf[i >> 2] |= 0x00000080 << 8 * (~i & 3); + + /* we need 9 or more empty positions, one for the padding byte */ + /* (above) and eight for the length count. If there is not */ + /* enough space pad and empty the buffer */ + if(i > SHA256_BLOCK_SIZE - 9) + { + if(i < 60) ctx->wbuf[15] = 0; + sha256_compile(ctx); + i = 0; + } + else /* compute a word index for the empty buffer positions */ + i = (i >> 2) + 1; + + while(i < 14) /* and zero pad all but last two positions */ + ctx->wbuf[i++] = 0; + + /* the following 32-bit length fields are assembled in the */ + /* wrong byte order on little endian machines but this is */ + /* corrected later since they are only ever used as 32-bit */ + /* word values. */ + ctx->wbuf[14] = (ctx->count[1] << 3) | (ctx->count[0] >> 29); + ctx->wbuf[15] = ctx->count[0] << 3; + sha256_compile(ctx); + + /* extract the hash value as bytes in case the hash buffer is */ + /* mislaigned for 32-bit words */ + for(i = 0; i < hlen; ++i) + hval[i] = (unsigned char)(ctx->hash[i >> 2] >> (8 * (~i & 3))); +} + +#endif + +#if defined(SHA_224) + +const uint_32t i224[8] = +{ + 0xc1059ed8ul, 0x367cd507ul, 0x3070dd17ul, 0xf70e5939ul, + 0xffc00b31ul, 0x68581511ul, 0x64f98fa7ul, 0xbefa4fa4ul +}; + +void_ret sha224_begin(sha224_ctx ctx[1]) +{ + ctx->count[0] = ctx->count[1] = 0; + memcpy(ctx->hash, i224, 8 * sizeof(uint_32t)); +} + +void_ret sha224_end(unsigned char hval[], sha224_ctx ctx[1]) +{ + sha_end1(hval, ctx, SHA224_DIGEST_SIZE); +} + +void_ret sha224(unsigned char hval[], const unsigned char data[], unsigned int len) +{ sha224_ctx cx[1]; + + sha224_begin(cx); + sha224_hash(data, len, cx); + sha_end1(hval, cx, SHA224_DIGEST_SIZE); +} + +#endif + +#if defined(SHA_256) + +const uint_32t i256[8] = +{ + 0x6a09e667ul, 0xbb67ae85ul, 0x3c6ef372ul, 0xa54ff53aul, + 0x510e527ful, 0x9b05688cul, 0x1f83d9abul, 0x5be0cd19ul +}; + +void_ret sha256_begin(sha256_ctx ctx[1]) +{ + ctx->count[0] = ctx->count[1] = 0; + memcpy(ctx->hash, i256, 8 * sizeof(uint_32t)); +} + +void_ret sha256_end(unsigned char hval[], sha256_ctx ctx[1]) +{ + sha_end1(hval, ctx, SHA256_DIGEST_SIZE); +} + +void_ret sha256(unsigned char hval[], const unsigned char data[], unsigned int len) +{ sha256_ctx cx[1]; + + sha256_begin(cx); + sha256_hash(data, len, cx); + sha_end1(hval, cx, SHA256_DIGEST_SIZE); +} + +#endif + +#if defined(SHA_384) || defined(SHA_512) + +#define SHA512_MASK (SHA512_BLOCK_SIZE - 1) + +#define rotr64(x,n) (((x) >> n) | ((x) << (64 - n))) + +#if !defined(bswap_64) +#define bswap_64(x) (((uint_64t)(bswap_32((uint_32t)(x)))) << 32 | bswap_32((uint_32t)((x) >> 32))) +#endif + +#if defined(SWAP_BYTES) +#define bsw_64(p,n) \ + { int _i = (n); while(_i--) ((uint_64t*)p)[_i] = bswap_64(((uint_64t*)p)[_i]); } +#else +#define bsw_64(p,n) +#endif + +/* SHA512 mixing function definitions */ + +#ifdef s_0 +# undef s_0 +# undef s_1 +# undef g_0 +# undef g_1 +# undef k_0 +#endif + +#define s_0(x) (rotr64((x), 28) ^ rotr64((x), 34) ^ rotr64((x), 39)) +#define s_1(x) (rotr64((x), 14) ^ rotr64((x), 18) ^ rotr64((x), 41)) +#define g_0(x) (rotr64((x), 1) ^ rotr64((x), 8) ^ ((x) >> 7)) +#define g_1(x) (rotr64((x), 19) ^ rotr64((x), 61) ^ ((x) >> 6)) +#define k_0 k512 + +/* SHA384/SHA512 mixing data */ + +const uint_64t k512[80] = +{ + li_64(428a2f98d728ae22), li_64(7137449123ef65cd), + li_64(b5c0fbcfec4d3b2f), li_64(e9b5dba58189dbbc), + li_64(3956c25bf348b538), li_64(59f111f1b605d019), + li_64(923f82a4af194f9b), li_64(ab1c5ed5da6d8118), + li_64(d807aa98a3030242), li_64(12835b0145706fbe), + li_64(243185be4ee4b28c), li_64(550c7dc3d5ffb4e2), + li_64(72be5d74f27b896f), li_64(80deb1fe3b1696b1), + li_64(9bdc06a725c71235), li_64(c19bf174cf692694), + li_64(e49b69c19ef14ad2), li_64(efbe4786384f25e3), + li_64(0fc19dc68b8cd5b5), li_64(240ca1cc77ac9c65), + li_64(2de92c6f592b0275), li_64(4a7484aa6ea6e483), + li_64(5cb0a9dcbd41fbd4), li_64(76f988da831153b5), + li_64(983e5152ee66dfab), li_64(a831c66d2db43210), + li_64(b00327c898fb213f), li_64(bf597fc7beef0ee4), + li_64(c6e00bf33da88fc2), li_64(d5a79147930aa725), + li_64(06ca6351e003826f), li_64(142929670a0e6e70), + li_64(27b70a8546d22ffc), li_64(2e1b21385c26c926), + li_64(4d2c6dfc5ac42aed), li_64(53380d139d95b3df), + li_64(650a73548baf63de), li_64(766a0abb3c77b2a8), + li_64(81c2c92e47edaee6), li_64(92722c851482353b), + li_64(a2bfe8a14cf10364), li_64(a81a664bbc423001), + li_64(c24b8b70d0f89791), li_64(c76c51a30654be30), + li_64(d192e819d6ef5218), li_64(d69906245565a910), + li_64(f40e35855771202a), li_64(106aa07032bbd1b8), + li_64(19a4c116b8d2d0c8), li_64(1e376c085141ab53), + li_64(2748774cdf8eeb99), li_64(34b0bcb5e19b48a8), + li_64(391c0cb3c5c95a63), li_64(4ed8aa4ae3418acb), + li_64(5b9cca4f7763e373), li_64(682e6ff3d6b2b8a3), + li_64(748f82ee5defb2fc), li_64(78a5636f43172f60), + li_64(84c87814a1f0ab72), li_64(8cc702081a6439ec), + li_64(90befffa23631e28), li_64(a4506cebde82bde9), + li_64(bef9a3f7b2c67915), li_64(c67178f2e372532b), + li_64(ca273eceea26619c), li_64(d186b8c721c0c207), + li_64(eada7dd6cde0eb1e), li_64(f57d4f7fee6ed178), + li_64(06f067aa72176fba), li_64(0a637dc5a2c898a6), + li_64(113f9804bef90dae), li_64(1b710b35131c471b), + li_64(28db77f523047d84), li_64(32caab7b40c72493), + li_64(3c9ebe0a15c9bebc), li_64(431d67c49c100d4c), + li_64(4cc5d4becb3e42b6), li_64(597f299cfc657e2a), + li_64(5fcb6fab3ad6faec), li_64(6c44198c4a475817) +}; + +/* Compile 128 bytes of hash data into SHA384/512 digest */ +/* NOTE: this routine assumes that the byte order in the */ +/* ctx->wbuf[] at this point is such that low address bytes */ +/* in the ORIGINAL byte stream will go into the high end of */ +/* words on BOTH big and little endian systems */ + +void_ret sha512_compile(sha512_ctx ctx[1]) +{ uint_64t v[8], *p = ctx->wbuf; + uint_32t j; + + memcpy(v, ctx->hash, 8 * sizeof(uint_64t)); + + for(j = 0; j < 80; j += 16) + { + v_cycle( 0, j); v_cycle( 1, j); + v_cycle( 2, j); v_cycle( 3, j); + v_cycle( 4, j); v_cycle( 5, j); + v_cycle( 6, j); v_cycle( 7, j); + v_cycle( 8, j); v_cycle( 9, j); + v_cycle(10, j); v_cycle(11, j); + v_cycle(12, j); v_cycle(13, j); + v_cycle(14, j); v_cycle(15, j); + } + + ctx->hash[0] += v[0]; ctx->hash[1] += v[1]; + ctx->hash[2] += v[2]; ctx->hash[3] += v[3]; + ctx->hash[4] += v[4]; ctx->hash[5] += v[5]; + ctx->hash[6] += v[6]; ctx->hash[7] += v[7]; +} + +/* Compile 128 bytes of hash data into SHA256 digest value */ +/* NOTE: this routine assumes that the byte order in the */ +/* ctx->wbuf[] at this point is in such an order that low */ +/* address bytes in the ORIGINAL byte stream placed in this */ +/* buffer will now go to the high end of words on BOTH big */ +/* and little endian systems */ + +void_ret sha512_hash(const unsigned char data[], unsigned int len, sha512_ctx ctx[1]) +{ uint_32t pos = (uint_32t)(ctx->count[0] & SHA512_MASK), + space = SHA512_BLOCK_SIZE - pos; + const unsigned char *sp = data; + + if((ctx->count[0] += len) < len) + ++(ctx->count[1]); + + while(len >= space) /* tranfer whole blocks while possible */ + { + memcpy(((unsigned char*)ctx->wbuf) + pos, sp, space); + sp += space; len -= space; space = SHA512_BLOCK_SIZE; pos = 0; + bsw_64(ctx->wbuf, SHA512_BLOCK_SIZE >> 3); + sha512_compile(ctx); + } + + memcpy(((unsigned char*)ctx->wbuf) + pos, sp, len); +} + +/* SHA384/512 Final padding and digest calculation */ + +static void sha_end2(unsigned char hval[], sha512_ctx ctx[1], const unsigned int hlen) +{ uint_32t i = (uint_32t)(ctx->count[0] & SHA512_MASK); + + /* put bytes in the buffer in an order in which references to */ + /* 32-bit words will put bytes with lower addresses into the */ + /* top of 32 bit words on BOTH big and little endian machines */ + bsw_64(ctx->wbuf, (i + 7) >> 3); + + /* we now need to mask valid bytes and add the padding which is */ + /* a single 1 bit and as many zero bits as necessary. Note that */ + /* we can always add the first padding byte here because the */ + /* buffer always has at least one empty slot */ + ctx->wbuf[i >> 3] &= li_64(ffffffffffffff00) << 8 * (~i & 7); + ctx->wbuf[i >> 3] |= li_64(0000000000000080) << 8 * (~i & 7); + + /* we need 17 or more empty byte positions, one for the padding */ + /* byte (above) and sixteen for the length count. If there is */ + /* not enough space pad and empty the buffer */ + if(i > SHA512_BLOCK_SIZE - 17) + { + if(i < 120) ctx->wbuf[15] = 0; + sha512_compile(ctx); + i = 0; + } + else + i = (i >> 3) + 1; + + while(i < 14) + ctx->wbuf[i++] = 0; + + /* the following 64-bit length fields are assembled in the */ + /* wrong byte order on little endian machines but this is */ + /* corrected later since they are only ever used as 64-bit */ + /* word values. */ + ctx->wbuf[14] = (ctx->count[1] << 3) | (ctx->count[0] >> 61); + ctx->wbuf[15] = ctx->count[0] << 3; + sha512_compile(ctx); + + /* extract the hash value as bytes in case the hash buffer is */ + /* misaligned for 32-bit words */ + for(i = 0; i < hlen; ++i) + hval[i] = (unsigned char)(ctx->hash[i >> 3] >> (8 * (~i & 7))); +} + +#endif + +#if defined(SHA_384) + +/* SHA384 initialisation data */ + +const uint_64t i384[80] = +{ + li_64(cbbb9d5dc1059ed8), li_64(629a292a367cd507), + li_64(9159015a3070dd17), li_64(152fecd8f70e5939), + li_64(67332667ffc00b31), li_64(8eb44a8768581511), + li_64(db0c2e0d64f98fa7), li_64(47b5481dbefa4fa4) +}; + +void_ret sha384_begin(sha384_ctx ctx[1]) +{ + ctx->count[0] = ctx->count[1] = 0; + memcpy(ctx->hash, i384, 8 * sizeof(uint_64t)); +} + +void_ret sha384_end(unsigned char hval[], sha384_ctx ctx[1]) +{ + sha_end2(hval, ctx, SHA384_DIGEST_SIZE); +} + +void_ret sha384(unsigned char hval[], const unsigned char data[], unsigned int len) +{ sha384_ctx cx[1]; + + sha384_begin(cx); + sha384_hash(data, len, cx); + sha_end2(hval, cx, SHA384_DIGEST_SIZE); +} + +#endif + +#if defined(SHA_512) + +/* SHA512 initialisation data */ + +const uint_64t i512[80] = +{ + li_64(6a09e667f3bcc908), li_64(bb67ae8584caa73b), + li_64(3c6ef372fe94f82b), li_64(a54ff53a5f1d36f1), + li_64(510e527fade682d1), li_64(9b05688c2b3e6c1f), + li_64(1f83d9abfb41bd6b), li_64(5be0cd19137e2179) +}; + +void_ret sha512_begin(sha512_ctx ctx[1]) +{ + ctx->count[0] = ctx->count[1] = 0; + memcpy(ctx->hash, i512, 8 * sizeof(uint_64t)); +} + +void_ret sha512_end(unsigned char hval[], sha512_ctx ctx[1]) +{ + sha_end2(hval, ctx, SHA512_DIGEST_SIZE); +} + +void_ret sha512(unsigned char hval[], const unsigned char data[], unsigned int len) +{ sha512_ctx cx[1]; + + sha512_begin(cx); + sha512_hash(data, len, cx); + sha_end2(hval, cx, SHA512_DIGEST_SIZE); +} + +#endif + +#if defined(SHA_2) + +#define CTX_224(x) ((x)->uu->ctx256) +#define CTX_256(x) ((x)->uu->ctx256) +#define CTX_384(x) ((x)->uu->ctx512) +#define CTX_512(x) ((x)->uu->ctx512) + +/* SHA2 initialisation */ + +int_ret sha2_begin(unsigned int len, sha2_ctx ctx[1]) +{ + switch(len) + { +#if defined(SHA_224) + case 224: + case 28: CTX_256(ctx)->count[0] = CTX_256(ctx)->count[1] = 0; + memcpy(CTX_256(ctx)->hash, i224, 32); + ctx->sha2_len = 28; return EXIT_SUCCESS; +#endif +#if defined(SHA_256) + case 256: + case 32: CTX_256(ctx)->count[0] = CTX_256(ctx)->count[1] = 0; + memcpy(CTX_256(ctx)->hash, i256, 32); + ctx->sha2_len = 32; return EXIT_SUCCESS; +#endif +#if defined(SHA_384) + case 384: + case 48: CTX_384(ctx)->count[0] = CTX_384(ctx)->count[1] = 0; + memcpy(CTX_384(ctx)->hash, i384, 64); + ctx->sha2_len = 48; return EXIT_SUCCESS; +#endif +#if defined(SHA_512) + case 512: + case 64: CTX_512(ctx)->count[0] = CTX_512(ctx)->count[1] = 0; + memcpy(CTX_512(ctx)->hash, i512, 64); + ctx->sha2_len = 64; return EXIT_SUCCESS; +#endif + default: return EXIT_FAILURE; + } +} + +void_ret sha2_hash(const unsigned char data[], unsigned int len, sha2_ctx ctx[1]) +{ + switch(ctx->sha2_len) + { +#if defined(SHA_224) + case 28: sha224_hash(data, len, CTX_224(ctx)); return; +#endif +#if defined(SHA_256) + case 32: sha256_hash(data, len, CTX_256(ctx)); return; +#endif +#if defined(SHA_384) + case 48: sha384_hash(data, len, CTX_384(ctx)); return; +#endif +#if defined(SHA_512) + case 64: sha512_hash(data, len, CTX_512(ctx)); return; +#endif + } +} + +void_ret sha2_end(unsigned char hval[], sha2_ctx ctx[1]) +{ + switch(ctx->sha2_len) + { +#if defined(SHA_224) + case 28: sha_end1(hval, CTX_224(ctx), SHA224_DIGEST_SIZE); return; +#endif +#if defined(SHA_256) + case 32: sha_end1(hval, CTX_256(ctx), SHA256_DIGEST_SIZE); return; +#endif +#if defined(SHA_384) + case 48: sha_end2(hval, CTX_384(ctx), SHA384_DIGEST_SIZE); return; +#endif +#if defined(SHA_512) + case 64: sha_end2(hval, CTX_512(ctx), SHA512_DIGEST_SIZE); return; +#endif + } +} + +int_ret sha2(unsigned char hval[], unsigned int size, + const unsigned char data[], unsigned int len) +{ sha2_ctx cx[1]; + + if(sha2_begin(size, cx) == EXIT_SUCCESS) + { + sha2_hash(data, len, cx); sha2_end(hval, cx); return EXIT_SUCCESS; + } + else + return EXIT_FAILURE; +} + +#endif + +#if defined(__cplusplus) +} +#endif + + +/* End of crypt_sha2.c */ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/dfs.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/dfs.c new file mode 100644 index 000000000..c95594b12 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/dfs.c @@ -0,0 +1,483 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + ap_dfs.c + + Abstract: + Support DFS function. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#include "rt_config.h" + +typedef struct _RADAR_DURATION_TABLE +{ + ULONG RDDurRegion; + ULONG RadarSignalDuration; + ULONG Tolerance; +} RADAR_DURATION_TABLE, *PRADAR_DURATION_TABLE; + + + +UCHAR RdIdleTimeTable[MAX_RD_REGION][4] = +{ + {9, 250, 250, 250}, // CE +#ifdef DFS_FCC_BW40_FIX + {1, 250, 250, 250}, // FCC +#else + {4, 250, 250, 250}, // FCC +#endif + {4, 250, 250, 250}, // JAP + {15, 250, 250, 250}, // JAP_W53 + {4, 250, 250, 250} // JAP_W56 +}; + +#ifdef TONE_RADAR_DETECT_SUPPORT +static void ToneRadarProgram(PRTMP_ADAPTER pAd); +static void ToneRadarEnable(PRTMP_ADAPTER pAd); +#endif // TONE_RADAR_DETECT_SUPPORT // + +#ifdef DFS_SUPPORT +/* + ======================================================================== + + Routine Description: + Bbp Radar detection routine + + Arguments: + pAd Pointer to our adapter + + Return Value: + + ======================================================================== +*/ +VOID BbpRadarDetectionStart( + IN PRTMP_ADAPTER pAd) +{ + UINT8 RadarPeriod; + + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 114, 0x02); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 121, 0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 122, 0x00); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 123, 0x08/*0x80*/); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 124, 0x28); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 125, 0xff); + +#ifdef MERGE_ARCH_TEAM + if ((pAd->CommonCfg.RadarDetect.RDDurRegion == JAP) || (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W53) || (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W56)) + { + pAd->CommonCfg.RadarDetect.RDDurRegion = JAP; + pAd->CommonCfg.RadarDetect.RDDurRegion = JapRadarType(pAd); + if (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W56) + { + pAd->CommonCfg.RadarDetect.DfsSessionTime = 13; + } + else if (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W53) + { + pAd->CommonCfg.RadarDetect.DfsSessionTime = 15; + } +#ifdef CARRIER_DETECTION_SUPPORT + pAd->CommonCfg.CarrierDetect.Enable = 1; +#endif // CARRIER_DETECTION_SUPPORT // + } +#endif // MERGE_ARCH_TEAM // + + RadarPeriod = ((UINT)RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + (UINT)pAd->CommonCfg.RadarDetect.DfsSessionTime) < 250 ? + (RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + pAd->CommonCfg.RadarDetect.DfsSessionTime) : 250; + +#ifdef MERGE_ARCH_TEAM + + +#else // Original RT28xx source code. + RTMP_IO_WRITE8(pAd, 0x7020, 0x1d); + RTMP_IO_WRITE8(pAd, 0x7021, 0x40); +#endif // MERGE_ARCH_TEAM // + + RadarDetectionStart(pAd, 0, RadarPeriod); + return; +} + +/* + ======================================================================== + + Routine Description: + Bbp Radar detection routine + + Arguments: + pAd Pointer to our adapter + + Return Value: + + ======================================================================== +*/ +VOID BbpRadarDetectionStop( + IN PRTMP_ADAPTER pAd) +{ + RTMP_IO_WRITE8(pAd, 0x7020, 0x1d); + RTMP_IO_WRITE8(pAd, 0x7021, 0x60); + + RadarDetectionStop(pAd); + return; +} + +/* + ======================================================================== + + Routine Description: + Radar detection routine + + Arguments: + pAd Pointer to our adapter + + Return Value: + + ======================================================================== +*/ +VOID RadarDetectionStart( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN CTSProtect, + IN UINT8 CTSPeriod) +{ + UINT8 DfsActiveTime = (pAd->CommonCfg.RadarDetect.DfsSessionTime & 0x1f); + UINT8 CtsProtect = (CTSProtect == 1) ? 0x02 : 0x01; // CTS protect. + + if (CTSProtect != 0) + { + switch(pAd->CommonCfg.RadarDetect.RDDurRegion) + { + case FCC: + case JAP_W56: + CtsProtect = 0x03; + break; + + case JAP: + { + UCHAR RDDurRegion; + RDDurRegion = JapRadarType(pAd); + if (RDDurRegion == JAP_W56) + CtsProtect = 0x03; + else + CtsProtect = 0x02; + break; + } + + case CE: + case JAP_W53: + default: + CtsProtect = 0x02; + break; + } + } + else + CtsProtect = 0x01; + + + // send start-RD with CTS protection command to MCU + // highbyte [7] reserve + // highbyte [6:5] 0x: stop Carrier/Radar detection + // highbyte [10]: Start Carrier/Radar detection without CTS protection, 11: Start Carrier/Radar detection with CTS protection + // highbyte [4:0] Radar/carrier detection duration. In 1ms. + + // lowbyte [7:0] Radar/carrier detection period, in 1ms. + AsicSendCommandToMcu(pAd, 0x60, 0xff, CTSPeriod, DfsActiveTime | (CtsProtect << 5)); + //AsicSendCommandToMcu(pAd, 0x63, 0xff, 10, 0); + + return; +} + +/* + ======================================================================== + + Routine Description: + Radar detection routine + + Arguments: + pAd Pointer to our adapter + + Return Value: + TRUE Found radar signal + FALSE Not found radar signal + + ======================================================================== +*/ +VOID RadarDetectionStop( + IN PRTMP_ADAPTER pAd) +{ + DBGPRINT(RT_DEBUG_TRACE,("RadarDetectionStop.\n")); + AsicSendCommandToMcu(pAd, 0x60, 0xff, 0x00, 0x00); // send start-RD with CTS protection command to MCU + + return; +} +#endif // DFS_SUPPORT // + + +/* + ======================================================================== + + Routine Description: + Radar channel check routine + + Arguments: + pAd Pointer to our adapter + + Return Value: + TRUE need to do radar detect + FALSE need not to do radar detect + + ======================================================================== +*/ +BOOLEAN RadarChannelCheck( + IN PRTMP_ADAPTER pAd, + IN UCHAR Ch) +{ + INT i; + BOOLEAN result = FALSE; + + for (i=0; i<pAd->ChannelListNum; i++) + { + if (Ch == pAd->ChannelList[i].Channel) + { + result = pAd->ChannelList[i].DfsReq; + break; + } + } + + return result; +} + +#ifdef DFS_SUPPORT + +ULONG JapRadarType( + IN PRTMP_ADAPTER pAd) +{ + ULONG i; + const UCHAR Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}; + + if (pAd->CommonCfg.RadarDetect.RDDurRegion != JAP) + { + return pAd->CommonCfg.RadarDetect.RDDurRegion; + } + + for (i=0; i<15; i++) + { + if (pAd->CommonCfg.Channel == Channel[i]) + { + break; + } + } + + if (i < 4) + return JAP_W53; + else if (i < 15) + return JAP_W56; + else + return JAP; // W52 + +} + +ULONG RTMPBbpReadRadarDuration( + IN PRTMP_ADAPTER pAd) +{ + UINT8 byteValue = 0; + ULONG result; + + BBP_IO_READ8_BY_REG_ID(pAd, BBP_R115, &byteValue); + + result = 0; + switch (byteValue) + { + case 1: // radar signal detected by pulse mode. + case 2: // radar signal detected by width mode. + result = RTMPReadRadarDuration(pAd); + break; + + case 0: // No radar signal. + default: + + result = 0; + break; + } + + return result; +} + +ULONG RTMPReadRadarDuration( + IN PRTMP_ADAPTER pAd) +{ + ULONG result = 0; + +#ifdef DFS_SUPPORT + UINT8 duration1 = 0, duration2 = 0, duration3 = 0; + + + BBP_IO_READ8_BY_REG_ID(pAd, BBP_R116, &duration1); + BBP_IO_READ8_BY_REG_ID(pAd, BBP_R117, &duration2); + BBP_IO_READ8_BY_REG_ID(pAd, BBP_R118, &duration3); + result = (duration1 << 16) + (duration2 << 8) + duration3; +#endif // DFS_SUPPORT // + + return result; + +} + +VOID RTMPCleanRadarDuration( + IN PRTMP_ADAPTER pAd) +{ + return; +} + +/* + ======================================================================== + Routine Description: + Radar wave detection. The API should be invoke each second. + + Arguments: + pAd - Adapter pointer + + Return Value: + None + + ======================================================================== +*/ +VOID ApRadarDetectPeriodic( + IN PRTMP_ADAPTER pAd) +{ + INT i; + + pAd->CommonCfg.RadarDetect.InServiceMonitorCount++; + + for (i=0; i<pAd->ChannelListNum; i++) + { + + if (pAd->ChannelList[i].RemainingTimeForUse > 0) + { + pAd->ChannelList[i].RemainingTimeForUse --; + if ((pAd->Mlme.PeriodicRound%5) == 0) + { + DBGPRINT(RT_DEBUG_TRACE, ("RadarDetectPeriodic - ch=%d, RemainingTimeForUse=%d\n", pAd->ChannelList[i].Channel, pAd->ChannelList[i].RemainingTimeForUse)); + } + } + } + + //radar detect + if ((pAd->CommonCfg.Channel > 14) + && (pAd->CommonCfg.bIEEE80211H == 1) + && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) + { + RadarDetectPeriodic(pAd); + } + + return; +} + +// Periodic Radar detection, switch channel will occur in RTMPHandleTBTTInterrupt() +// Before switch channel, driver needs doing channel switch announcement. +VOID RadarDetectPeriodic( + IN PRTMP_ADAPTER pAd) +{ + + // need to check channel availability, after switch channel + if (pAd->CommonCfg.RadarDetect.RDMode != RD_SILENCE_MODE) + return; + + + + // channel availability check time is 60sec, use 65 for assurance + if (pAd->CommonCfg.RadarDetect.RDCount++ > pAd->CommonCfg.RadarDetect.ChMovingTime) + { + DBGPRINT(RT_DEBUG_TRACE, ("Not found radar signal, start send beacon and radar detection in service monitor\n\n")); + BbpRadarDetectionStop(pAd); + + + AsicEnableBssSync(pAd); + pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE; + + + + return; + } + + return; +} +#endif // DFS_SUPPORT // + +#ifdef DFS_SUPPORT +/* + ========================================================================== + Description: + change channel moving time for DFS testing. + + Arguments: + pAdapter Pointer to our adapter + wrq Pointer to the ioctl argument + + Return Value: + None + + Note: + Usage: + 1.) iwpriv ra0 set ChMovTime=[value] + ========================================================================== +*/ +INT Set_ChMovingTime_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT8 Value; + + Value = (UINT8) simple_strtol(arg, 0, 10); + + pAd->CommonCfg.RadarDetect.ChMovingTime = Value; + + DBGPRINT(RT_DEBUG_TRACE, ("%s:: %d\n", __FUNCTION__, + pAd->CommonCfg.RadarDetect.ChMovingTime)); + + return TRUE; +} + +INT Set_LongPulseRadarTh_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT8 Value; + + Value = (UINT8) simple_strtol(arg, 0, 10) > 10 ? 10 : simple_strtol(arg, 0, 10); + + pAd->CommonCfg.RadarDetect.LongPulseRadarTh = Value; + + DBGPRINT(RT_DEBUG_TRACE, ("%s:: %d\n", __FUNCTION__, + pAd->CommonCfg.RadarDetect.LongPulseRadarTh)); + + return TRUE; +} +#endif // DFS_SUPPORT // + + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ee_efuse.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ee_efuse.c new file mode 100644 index 000000000..f67694d4c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ee_efuse.c @@ -0,0 +1,1590 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + ee_efuse.c + + Abstract: + Miniport generic portion header file + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#ifdef RTMP_EFUSE_SUPPORT + +#include "rt_config.h" + +#ifndef RT35xx +#define EFUSE_USAGE_MAP_START 0x2d0 +#define EFUSE_USAGE_MAP_END 0x2fc +#define EFUSE_USAGE_MAP_SIZE 45 +#endif // !RT35xx // + +#ifdef RT35xx +#define EFUSE_USAGE_MAP_START 0x3c0 +#define EFUSE_USAGE_MAP_END 0x3fb +#define EFUSE_USAGE_MAP_SIZE 60 +#endif // RT35xx // + + +#define EFUSE_EEPROM_DEFULT_FILE "RT30xxEEPROM.bin" +#define MAX_EEPROM_BIN_FILE_SIZE 1024 + + + +#define EFUSE_TAG 0x2fe + + +#ifdef RT_BIG_ENDIAN +typedef union _EFUSE_CTRL_STRUC { + struct { + UINT32 SEL_EFUSE:1; + UINT32 EFSROM_KICK:1; + UINT32 RESERVED:4; + UINT32 EFSROM_AIN:10; + UINT32 EFSROM_LDO_ON_TIME:2; + UINT32 EFSROM_LDO_OFF_TIME:6; + UINT32 EFSROM_MODE:2; + UINT32 EFSROM_AOUT:6; + } field; + UINT32 word; +} EFUSE_CTRL_STRUC, *PEFUSE_CTRL_STRUC; +#else +typedef union _EFUSE_CTRL_STRUC { + struct { + UINT32 EFSROM_AOUT:6; + UINT32 EFSROM_MODE:2; + UINT32 EFSROM_LDO_OFF_TIME:6; + UINT32 EFSROM_LDO_ON_TIME:2; + UINT32 EFSROM_AIN:10; + UINT32 RESERVED:4; + UINT32 EFSROM_KICK:1; + UINT32 SEL_EFUSE:1; + } field; + UINT32 word; +} EFUSE_CTRL_STRUC, *PEFUSE_CTRL_STRUC; +#endif // RT_BIG_ENDIAN // + +static UCHAR eFuseReadRegisters( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + OUT USHORT* pData); + +static VOID eFuseReadPhysical( + IN PRTMP_ADAPTER pAd, + IN PUSHORT lpInBuffer, + IN ULONG nInBufferSize, + OUT PUSHORT lpOutBuffer, + IN ULONG nOutBufferSize); + +static VOID eFusePhysicalWriteRegisters( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + OUT USHORT* pData); + +static NTSTATUS eFuseWriteRegisters( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + IN USHORT* pData); + +static VOID eFuseWritePhysical( + IN PRTMP_ADAPTER pAd, + PUSHORT lpInBuffer, + ULONG nInBufferSize, + PUCHAR lpOutBuffer, + ULONG nOutBufferSize); + + +static NTSTATUS eFuseWriteRegistersFromBin( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + IN USHORT* pData); + + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +UCHAR eFuseReadRegisters( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + OUT USHORT* pData) +{ + EFUSE_CTRL_STRUC eFuseCtrlStruc; + int i; + USHORT efuseDataOffset; + UINT32 data; + + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + + //Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment. + //Use the eeprom logical address and covert to address to block number + eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0; + + //Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 0. + eFuseCtrlStruc.field.EFSROM_MODE = 0; + + //Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure. + eFuseCtrlStruc.field.EFSROM_KICK = 1; + + NdisMoveMemory(&data, &eFuseCtrlStruc, 4); + RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data); + + //Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. + i = 0; + while(i < 500) + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return 0; + + //rtmp.HwMemoryReadDword(EFUSE_CTRL, (DWORD *) &eFuseCtrlStruc, 4); + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + if(eFuseCtrlStruc.field.EFSROM_KICK == 0) + { + break; + } + RTMPusecDelay(2); + i++; + } + + //if EFSROM_AOUT is not found in physical address, write 0xffff + if (eFuseCtrlStruc.field.EFSROM_AOUT == 0x3f) + { + for(i=0; i<Length/2; i++) + *(pData+2*i) = 0xffff; + } + else + { + //Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x590-0x59C) + efuseDataOffset = EFUSE_DATA3 - (Offset & 0xC); + //data hold 4 bytes data. + //In RTMP_IO_READ32 will automatically execute 32-bytes swapping + RTMP_IO_READ32(pAd, efuseDataOffset, &data); + //Decide the upper 2 bytes or the bottom 2 bytes. + // Little-endian S | S Big-endian + // addr 3 2 1 0 | 0 1 2 3 + // Ori-V D C B A | A B C D + //After swapping + // D C B A | D C B A + //Return 2-bytes + //The return byte statrs from S. Therefore, the little-endian will return BA, the Big-endian will return DC. + //For returning the bottom 2 bytes, the Big-endian should shift right 2-bytes. +#ifdef RT_BIG_ENDIAN + data = data << (8*((Offset & 0x3)^0x2)); +#else + data = data >> (8*(Offset & 0x3)); +#endif // RT_BIG_ENDIAN // + + NdisMoveMemory(pData, &data, Length); + } + + return (UCHAR) eFuseCtrlStruc.field.EFSROM_AOUT; + +} + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +VOID eFusePhysicalReadRegisters( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + OUT USHORT* pData) +{ + EFUSE_CTRL_STRUC eFuseCtrlStruc; + int i; + USHORT efuseDataOffset; + UINT32 data; + + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + + //Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment. + eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0; + + //Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 1. + //Read in physical view + eFuseCtrlStruc.field.EFSROM_MODE = 1; + + //Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure. + eFuseCtrlStruc.field.EFSROM_KICK = 1; + + NdisMoveMemory(&data, &eFuseCtrlStruc, 4); + RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data); + + //Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. + i = 0; + while(i < 500) + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + if(eFuseCtrlStruc.field.EFSROM_KICK == 0) + break; + RTMPusecDelay(2); + i++; + } + + //Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590) + //Because the size of each EFUSE_DATA is 4 Bytes, the size of address of each is 2 bits. + //The previous 2 bits is the EFUSE_DATA number, the last 2 bits is used to decide which bytes + //Decide which EFUSE_DATA to read + //590:F E D C + //594:B A 9 8 + //598:7 6 5 4 + //59C:3 2 1 0 + efuseDataOffset = EFUSE_DATA3 - (Offset & 0xC) ; + + RTMP_IO_READ32(pAd, efuseDataOffset, &data); + +#ifdef RT_BIG_ENDIAN + data = data << (8*((Offset & 0x3)^0x2)); +#else + data = data >> (8*(Offset & 0x3)); +#endif // RT_BIG_ENDIAN // + + NdisMoveMemory(pData, &data, Length); + +} + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +static VOID eFuseReadPhysical( + IN PRTMP_ADAPTER pAd, + IN PUSHORT lpInBuffer, + IN ULONG nInBufferSize, + OUT PUSHORT lpOutBuffer, + IN ULONG nOutBufferSize +) +{ + USHORT* pInBuf = (USHORT*)lpInBuffer; + USHORT* pOutBuf = (USHORT*)lpOutBuffer; + + USHORT Offset = pInBuf[0]; //addr + USHORT Length = pInBuf[1]; //length + int i; + + for(i=0; i<Length; i+=2) + { + eFusePhysicalReadRegisters(pAd,Offset+i, 2, &pOutBuf[i/2]); + } +} + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +NTSTATUS eFuseRead( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + OUT PUSHORT pData, + IN USHORT Length) +{ + NTSTATUS Status = STATUS_SUCCESS; + UCHAR EFSROM_AOUT; + int i; + + for(i=0; i<Length; i+=2) + { + EFSROM_AOUT = eFuseReadRegisters(pAd, Offset+i, 2, &pData[i/2]); + } + return Status; +} + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +static VOID eFusePhysicalWriteRegisters( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + OUT USHORT* pData) +{ + EFUSE_CTRL_STRUC eFuseCtrlStruc; + int i; + USHORT efuseDataOffset; + UINT32 data, eFuseDataBuffer[4]; + + //Step0. Write 16-byte of data to EFUSE_DATA0-3 (0x590-0x59C), where EFUSE_DATA0 is the LSB DW, EFUSE_DATA3 is the MSB DW. + + ///////////////////////////////////////////////////////////////// + //read current values of 16-byte block + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + + //Step0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment. + eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0; + + //Step1. Write EFSROM_MODE (0x580, bit7:bit6) to 1. + eFuseCtrlStruc.field.EFSROM_MODE = 1; + + //Step2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure. + eFuseCtrlStruc.field.EFSROM_KICK = 1; + + NdisMoveMemory(&data, &eFuseCtrlStruc, 4); + RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data); + + //Step3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. + i = 0; + while(i < 500) + { + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + + if(eFuseCtrlStruc.field.EFSROM_KICK == 0) + break; + RTMPusecDelay(2); + i++; + } + + //Step4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590) + efuseDataOffset = EFUSE_DATA3; + for(i=0; i< 4; i++) + { + RTMP_IO_READ32(pAd, efuseDataOffset, (PUINT32) &eFuseDataBuffer[i]); + efuseDataOffset -= 4; + } + + //Update the value, the offset is multiple of 2, length is 2 + efuseDataOffset = (Offset & 0xc) >> 2; + data = pData[0] & 0xffff; + //The offset should be 0x***10 or 0x***00 + if((Offset % 4) != 0) + { + eFuseDataBuffer[efuseDataOffset] = (eFuseDataBuffer[efuseDataOffset] & 0xffff) | (data << 16); + } + else + { + eFuseDataBuffer[efuseDataOffset] = (eFuseDataBuffer[efuseDataOffset] & 0xffff0000) | data; + } + + efuseDataOffset = EFUSE_DATA3; + for(i=0; i< 4; i++) + { + RTMP_IO_WRITE32(pAd, efuseDataOffset, eFuseDataBuffer[i]); + efuseDataOffset -= 4; + } + ///////////////////////////////////////////////////////////////// + + //Step1. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment. + + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + + eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0; + + //Step2. Write EFSROM_MODE (0x580, bit7:bit6) to 3. + eFuseCtrlStruc.field.EFSROM_MODE = 3; + + //Step3. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical write procedure. + eFuseCtrlStruc.field.EFSROM_KICK = 1; + + NdisMoveMemory(&data, &eFuseCtrlStruc, 4); + RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data); + + //Step4. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. It��s done. + i = 0; + + while(i < 500) + { + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + + if(eFuseCtrlStruc.field.EFSROM_KICK == 0) + break; + + RTMPusecDelay(2); + i++; + } +} + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +static NTSTATUS eFuseWriteRegisters( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + IN USHORT* pData) +{ + USHORT i,Loop=0; + USHORT eFuseData; + USHORT LogicalAddress, BlkNum = 0xffff; + UCHAR EFSROM_AOUT; + + USHORT addr,tmpaddr, InBuf[3], tmpOffset; + USHORT buffer[8]; + BOOLEAN bWriteSuccess = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters Offset=%x, pData=%x\n", Offset, *pData)); + + //Step 0. find the entry in the mapping table + //The address of EEPROM is 2-bytes alignment. + //The last bit is used for alignment, so it must be 0. + tmpOffset = Offset & 0xfffe; + EFSROM_AOUT = eFuseReadRegisters(pAd, tmpOffset, 2, &eFuseData); + + if( EFSROM_AOUT == 0x3f) + { //find available logical address pointer + //the logical address does not exist, find an empty one + //from the first address of block 45=16*45=0x2d0 to the last address of block 47 + //==>48*16-3(reserved)=2FC + for (i=EFUSE_USAGE_MAP_START; i<=EFUSE_USAGE_MAP_END; i+=2) + { + //Retrive the logical block nubmer form each logical address pointer + //It will access two logical address pointer each time. + eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress); + if( (LogicalAddress & 0xff) == 0) + {//Not used logical address pointer + BlkNum = i-EFUSE_USAGE_MAP_START; + break; + } + else if(( (LogicalAddress >> 8) & 0xff) == 0) + {//Not used logical address pointer + if (i != EFUSE_USAGE_MAP_END) + { + BlkNum = i-EFUSE_USAGE_MAP_START+1; + } + break; + } + } + } + else + { + BlkNum = EFSROM_AOUT; + } + + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters BlkNum = %d \n", BlkNum)); + + if(BlkNum == 0xffff) + { + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters: out of free E-fuse space!!!\n")); + return FALSE; + } + + //Step 1. Save data of this block which is pointed by the avaible logical address pointer + // read and save the original block data + for(i =0; i<8; i++) + { + addr = BlkNum * 0x10 ; + + InBuf[0] = addr+2*i; + InBuf[1] = 2; + InBuf[2] = 0x0; + + eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2); + + buffer[i] = InBuf[2]; + } + + //Step 2. Update the data in buffer, and write the data to Efuse + buffer[ (Offset >> 1) % 8] = pData[0]; + + do + { Loop++; + //Step 3. Write the data to Efuse + if(!bWriteSuccess) + { + for(i =0; i<8; i++) + { + addr = BlkNum * 0x10 ; + + InBuf[0] = addr+2*i; + InBuf[1] = 2; + InBuf[2] = buffer[i]; + + eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2); + } + } + else + { + addr = BlkNum * 0x10 ; + + InBuf[0] = addr+(Offset % 16); + InBuf[1] = 2; + InBuf[2] = pData[0]; + + eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2); + } + + //Step 4. Write mapping table + addr = EFUSE_USAGE_MAP_START+BlkNum; + + tmpaddr = addr; + + if(addr % 2 != 0) + addr = addr -1; + InBuf[0] = addr; + InBuf[1] = 2; + + //convert the address from 10 to 8 bit ( bit7, 6 = parity and bit5 ~ 0 = bit9~4), and write to logical map entry + tmpOffset = Offset; + tmpOffset >>= 4; + tmpOffset |= ((~((tmpOffset & 0x01) ^ ( tmpOffset >> 1 & 0x01) ^ (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01))) << 6) & 0x40; + tmpOffset |= ((~( (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01) ^ (tmpOffset >> 4 & 0x01) ^ ( tmpOffset >> 5 & 0x01))) << 7) & 0x80; + + // write the logical address + if(tmpaddr%2 != 0) + InBuf[2] = tmpOffset<<8; + else + InBuf[2] = tmpOffset; + + eFuseWritePhysical(pAd,&InBuf[0], 6, NULL, 0); + + //Step 5. Compare data if not the same, invalidate the mapping entry, then re-write the data until E-fuse is exhausted + bWriteSuccess = TRUE; + for(i =0; i<8; i++) + { + addr = BlkNum * 0x10 ; + + InBuf[0] = addr+2*i; + InBuf[1] = 2; + InBuf[2] = 0x0; + + eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2); + + if(buffer[i] != InBuf[2]) + { + bWriteSuccess = FALSE; + break; + } + } + + //Step 6. invlidate mapping entry and find a free mapping entry if not succeed + if (!bWriteSuccess) + { + DBGPRINT(RT_DEBUG_TRACE, ("Not bWriteSuccess BlkNum = %d\n", BlkNum)); + + // the offset of current mapping entry + addr = EFUSE_USAGE_MAP_START+BlkNum; + + //find a new mapping entry + BlkNum = 0xffff; + for (i=EFUSE_USAGE_MAP_START; i<=EFUSE_USAGE_MAP_END; i+=2) + { + eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress); + if( (LogicalAddress & 0xff) == 0) + { + BlkNum = i-EFUSE_USAGE_MAP_START; + break; + } + else if(( (LogicalAddress >> 8) & 0xff) == 0) + { + if (i != EFUSE_USAGE_MAP_END) + { + BlkNum = i+1-EFUSE_USAGE_MAP_START; + } + break; + } + } + DBGPRINT(RT_DEBUG_TRACE, ("Not bWriteSuccess new BlkNum = %d\n", BlkNum)); + if(BlkNum == 0xffff) + { + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters: out of free E-fuse space!!!\n")); + return FALSE; + } + + //invalidate the original mapping entry if new entry is not found + tmpaddr = addr; + + if(addr % 2 != 0) + addr = addr -1; + InBuf[0] = addr; + InBuf[1] = 2; + + eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2); + + // write the logical address + if(tmpaddr%2 != 0) + { + // Invalidate the high byte + for (i=8; i<15; i++) + { + if( ( (InBuf[2] >> i) & 0x01) == 0) + { + InBuf[2] |= (0x1 <<i); + break; + } + } + } + else + { + // invalidate the low byte + for (i=0; i<8; i++) + { + if( ( (InBuf[2] >> i) & 0x01) == 0) + { + InBuf[2] |= (0x1 <<i); + break; + } + } + } + eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 0); + } + } + while (!bWriteSuccess&&Loop<2); + if(!bWriteSuccess) + DBGPRINT(RT_DEBUG_ERROR,("Efsue Write Failed!!\n")); + return TRUE; +} + + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +static VOID eFuseWritePhysical( + IN PRTMP_ADAPTER pAd, + PUSHORT lpInBuffer, + ULONG nInBufferSize, + PUCHAR lpOutBuffer, + ULONG nOutBufferSize +) +{ + USHORT* pInBuf = (USHORT*)lpInBuffer; + int i; + //USHORT* pOutBuf = (USHORT*)ioBuffer; + USHORT Offset = pInBuf[0]; // addr + USHORT Length = pInBuf[1]; // length + USHORT* pValueX = &pInBuf[2]; // value ... + + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWritePhysical Offset=0x%x, length=%d\n", Offset, Length)); + + { + // Little-endian S | S Big-endian + // addr 3 2 1 0 | 0 1 2 3 + // Ori-V D C B A | A B C D + // After swapping + // D C B A | D C B A + // Both the little and big-endian use the same sequence to write data. + // Therefore, we only need swap data when read the data. + for (i=0; i<Length; i+=2) + { + eFusePhysicalWriteRegisters(pAd, Offset+i, 2, &pValueX[i/2]); + } + } +} + + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +NTSTATUS eFuseWrite( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN PUSHORT pData, + IN USHORT length) +{ + int i; + USHORT* pValueX = (PUSHORT) pData; //value ... + PUSHORT OddWriteByteBuf; + OddWriteByteBuf=(PUSHORT)kmalloc(sizeof(USHORT)*2, MEM_ALLOC_FLAG); + // The input value=3070 will be stored as following + // Little-endian S | S Big-endian + // addr 1 0 | 0 1 + // Ori-V 30 70 | 30 70 + // After swapping + // 30 70 | 70 30 + // Casting + // 3070 | 7030 (x) + // The swapping should be removed for big-endian + if((Offset%2)!=0) + { + length+=2; + Offset-=1; + eFuseRead(pAd,Offset,OddWriteByteBuf,2); + eFuseRead(pAd,Offset+2,(OddWriteByteBuf+1),2); + *OddWriteByteBuf&=0x00ff; + *OddWriteByteBuf|=((*pData)&0xff)<<8; + *(OddWriteByteBuf+1)&=0xff00; + *(OddWriteByteBuf+1)|=(*pData&0xff00)>>8; + pValueX=OddWriteByteBuf; + + } + + for(i=0; i<length; i+=2) + { + eFuseWriteRegisters(pAd, Offset+i, 2, &pValueX[i/2]); + } + kfree(OddWriteByteBuf); + return TRUE; +} + + +/* +======================================================================== + + Routine Description: + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +INT set_eFuseGetFreeBlockCount_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + USHORT i; + USHORT LogicalAddress; + USHORT efusefreenum=0; + if (!pAd->bUseEfuse) + return FALSE; + for (i = EFUSE_USAGE_MAP_START; i <= EFUSE_USAGE_MAP_END; i+=2) + { + eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress); + if( (LogicalAddress & 0xff) == 0) + { + efusefreenum= (UCHAR) (EFUSE_USAGE_MAP_END-i+1); + break; + } + else if(( (LogicalAddress >> 8) & 0xff) == 0) + { + efusefreenum = (UCHAR) (EFUSE_USAGE_MAP_END-i); + break; + } + + if(i == EFUSE_USAGE_MAP_END) + efusefreenum = 0; + } + printk("efuseFreeNumber is %d\n",efusefreenum); + return TRUE; +} + + +INT set_eFusedump_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + USHORT InBuf[3]; + INT i=0; + if (!pAd->bUseEfuse) + return FALSE; + for(i =0; i<EFUSE_USAGE_MAP_END/2; i++) + { + InBuf[0] = 2*i; + InBuf[1] = 2; + InBuf[2] = 0x0; + + eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2); + if(i%4==0) + printk("\nBlock %x:",i/8); + printk("%04x ",InBuf[2]); + } + return TRUE; +} + + +INT set_eFuseLoadFromBin_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + PSTRING src; + RTMP_OS_FD srcf; + RTMP_OS_FS_INFO osfsInfo; + INT retval, memSize; + PSTRING buffer, memPtr; + INT TotalByte= 0,ReadedByte=0,CompareBuf=1; + USHORT *PDATA; + USHORT DATA; + + memSize = 128 + MAX_EEPROM_BIN_FILE_SIZE + sizeof(USHORT) * 8; + memPtr = kmalloc(memSize, MEM_ALLOC_FLAG); + if (memPtr == NULL) + return FALSE; + + NdisZeroMemory(memPtr, memSize); + src = memPtr; // kmalloc(128, MEM_ALLOC_FLAG); + buffer = src + 128; // kmalloc(MAX_EEPROM_BIN_FILE_SIZE, MEM_ALLOC_FLAG); + PDATA = (USHORT*)(buffer + MAX_EEPROM_BIN_FILE_SIZE); // kmalloc(sizeof(USHORT)*8,MEM_ALLOC_FLAG); + + if(strlen(arg)>0) + NdisMoveMemory(src, arg, strlen(arg)); + else + NdisMoveMemory(src, EFUSE_EEPROM_DEFULT_FILE, strlen(EFUSE_EEPROM_DEFULT_FILE)); + DBGPRINT(RT_DEBUG_TRACE, ("FileName=%s\n",src)); + + RtmpOSFSInfoChange(&osfsInfo, TRUE); + + srcf = RtmpOSFileOpen(src, O_RDONLY, 0); + if (IS_FILE_OPEN_ERR(srcf)) + { + DBGPRINT(RT_DEBUG_ERROR, ("--> Error opening file %s\n", src)); + retval = FALSE; + goto recoverFS; + } + else + { + // The object must have a read method + while(RtmpOSFileRead(srcf, &buffer[TotalByte], 1)==1) + { + TotalByte++; + if(TotalByte>MAX_EEPROM_BIN_FILE_SIZE) + { + DBGPRINT(RT_DEBUG_ERROR, ("--> Error reading file %s, file size too large[>%d]\n", src, MAX_EEPROM_BIN_FILE_SIZE)); + retval = FALSE; + goto closeFile; + } + } + + retval = RtmpOSFileClose(srcf); + if (retval) + DBGPRINT(RT_DEBUG_TRACE, ("--> Error closing file %s\n", src)); + } + + + RtmpOSFSInfoChange(&osfsInfo, FALSE); + + for(ReadedByte=0;ReadedByte<TotalByte;ReadedByte++) + { + DBGPRINT(RT_DEBUG_TRACE, ("%02X ",buffer[ReadedByte]&0xff)); + if((ReadedByte+1)%2==0) + PDATA[ReadedByte/2%8]=((buffer[ReadedByte]<<8)&0xff00)|(buffer[ReadedByte-1]&0xff); + if(ReadedByte%16==0) + { + CompareBuf=buffer[ReadedByte]&0xff; + + } + else + { + CompareBuf&=buffer[ReadedByte]; + if((ReadedByte+1)%16==0) + { + DBGPRINT(RT_DEBUG_TRACE, (" result=%02X,blk=%02x\n",CompareBuf,ReadedByte/16)); + + if(CompareBuf!=0xff) + eFuseWriteRegistersFromBin(pAd,(USHORT)ReadedByte-15, 16, PDATA); + else + { + if(eFuseReadRegisters(pAd,ReadedByte, 2,(PUSHORT)&DATA)!=0x3f) + eFuseWriteRegistersFromBin(pAd,(USHORT)ReadedByte-15, 16, PDATA); + } + /* + for(l=0;l<8;l++) + printk("%04x ",PDATA[l]); + printk("\n"); + */ + NdisZeroMemory(PDATA,16); + } + } + } + + return TRUE; + +closeFile: + if (srcf) + RtmpOSFileClose(srcf); + +recoverFS: + RtmpOSFSInfoChange(&osfsInfo, FALSE); + + + if (memPtr) + kfree(memPtr); + + return retval; +} + + +static NTSTATUS eFuseWriteRegistersFromBin( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + IN USHORT* pData) +{ + USHORT i; + USHORT eFuseData; + USHORT LogicalAddress, BlkNum = 0xffff; + UCHAR EFSROM_AOUT,Loop=0; + EFUSE_CTRL_STRUC eFuseCtrlStruc; + USHORT efuseDataOffset; + UINT32 data,tempbuffer; + USHORT addr,tmpaddr, InBuf[3], tmpOffset; + UINT32 buffer[4]; + BOOLEAN bWriteSuccess = TRUE; + BOOLEAN bNotWrite=TRUE; + BOOLEAN bAllocateNewBlk=TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegistersFromBin Offset=%x, pData=%04x:%04x:%04x:%04x\n", Offset, *pData,*(pData+1),*(pData+2),*(pData+3))); + + do + { + //Step 0. find the entry in the mapping table + //The address of EEPROM is 2-bytes alignment. + //The last bit is used for alignment, so it must be 0. + Loop++; + tmpOffset = Offset & 0xfffe; + EFSROM_AOUT = eFuseReadRegisters(pAd, tmpOffset, 2, &eFuseData); + + if( EFSROM_AOUT == 0x3f) + { //find available logical address pointer + //the logical address does not exist, find an empty one + //from the first address of block 45=16*45=0x2d0 to the last address of block 47 + //==>48*16-3(reserved)=2FC + bAllocateNewBlk=TRUE; + for (i=EFUSE_USAGE_MAP_START; i<=EFUSE_USAGE_MAP_END; i+=2) + { + //Retrive the logical block nubmer form each logical address pointer + //It will access two logical address pointer each time. + eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress); + if( (LogicalAddress & 0xff) == 0) + {//Not used logical address pointer + BlkNum = i-EFUSE_USAGE_MAP_START; + break; + } + else if(( (LogicalAddress >> 8) & 0xff) == 0) + {//Not used logical address pointer + if (i != EFUSE_USAGE_MAP_END) + { + BlkNum = i-EFUSE_USAGE_MAP_START+1; + } + break; + } + } + } + else + { + bAllocateNewBlk=FALSE; + BlkNum = EFSROM_AOUT; + } + + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters BlkNum = %d \n", BlkNum)); + + if(BlkNum == 0xffff) + { + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegisters: out of free E-fuse space!!!\n")); + return FALSE; + } + //Step 1.1.0 + //If the block is not existing in mapping table, create one + //and write down the 16-bytes data to the new block + if(bAllocateNewBlk) + { + DBGPRINT(RT_DEBUG_TRACE, ("Allocate New Blk\n")); + efuseDataOffset = EFUSE_DATA3; + for(i=0; i< 4; i++) + { + DBGPRINT(RT_DEBUG_TRACE, ("Allocate New Blk, Data%d=%04x%04x\n",3-i,pData[2*i+1],pData[2*i])); + tempbuffer=((pData[2*i+1]<<16)&0xffff0000)|pData[2*i]; + + + RTMP_IO_WRITE32(pAd, efuseDataOffset,tempbuffer); + efuseDataOffset -= 4; + + } + ///////////////////////////////////////////////////////////////// + + //Step1.1.1. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment. + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + eFuseCtrlStruc.field.EFSROM_AIN = BlkNum* 0x10 ; + + //Step1.1.2. Write EFSROM_MODE (0x580, bit7:bit6) to 3. + eFuseCtrlStruc.field.EFSROM_MODE = 3; + + //Step1.1.3. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical write procedure. + eFuseCtrlStruc.field.EFSROM_KICK = 1; + + NdisMoveMemory(&data, &eFuseCtrlStruc, 4); + + RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data); + + //Step1.1.4. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. It��s done. + i = 0; + while(i < 100) + { + RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc); + + if(eFuseCtrlStruc.field.EFSROM_KICK == 0) + break; + + RTMPusecDelay(2); + i++; + } + + } + else + { //Step1.2. + //If the same logical number is existing, check if the writting data and the data + //saving in this block are the same. + ///////////////////////////////////////////////////////////////// + //read current values of 16-byte block + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrlStruc.word); + + //Step1.2.0. Write 10-bit of address to EFSROM_AIN (0x580, bit25:bit16). The address must be 16-byte alignment. + eFuseCtrlStruc.field.EFSROM_AIN = Offset & 0xfff0; + + //Step1.2.1. Write EFSROM_MODE (0x580, bit7:bit6) to 1. + eFuseCtrlStruc.field.EFSROM_MODE = 0; + + //Step1.2.2. Write EFSROM_KICK (0x580, bit30) to 1 to kick-off physical read procedure. + eFuseCtrlStruc.field.EFSROM_KICK = 1; + + NdisMoveMemory(&data, &eFuseCtrlStruc, 4); + RTMP_IO_WRITE32(pAd, EFUSE_CTRL, data); + + //Step1.2.3. Polling EFSROM_KICK(0x580, bit30) until it become 0 again. + i = 0; + while(i < 500) + { + RTMP_IO_READ32(pAd, EFUSE_CTRL, (PUINT32) &eFuseCtrlStruc); + + if(eFuseCtrlStruc.field.EFSROM_KICK == 0) + break; + RTMPusecDelay(2); + i++; + } + + //Step1.2.4. Read 16-byte of data from EFUSE_DATA0-3 (0x59C-0x590) + efuseDataOffset = EFUSE_DATA3; + for(i=0; i< 4; i++) + { + RTMP_IO_READ32(pAd, efuseDataOffset, (PUINT32) &buffer[i]); + efuseDataOffset -= 4; + } + //Step1.2.5. Check if the data of efuse and the writing data are the same. + for(i =0; i<4; i++) + { + tempbuffer=((pData[2*i+1]<<16)&0xffff0000)|pData[2*i]; + DBGPRINT(RT_DEBUG_TRACE, ("buffer[%d]=%x,pData[%d]=%x,pData[%d]=%x,tempbuffer=%x\n",i,buffer[i],2*i,pData[2*i],2*i+1,pData[2*i+1],tempbuffer)); + + if(((buffer[i]&0xffff0000)==(pData[2*i+1]<<16))&&((buffer[i]&0xffff)==pData[2*i])) + bNotWrite&=TRUE; + else + { + bNotWrite&=FALSE; + break; + } + } + if(!bNotWrite) + { + printk("The data is not the same\n"); + + for(i =0; i<8; i++) + { + addr = BlkNum * 0x10 ; + + InBuf[0] = addr+2*i; + InBuf[1] = 2; + InBuf[2] = pData[i]; + + eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 2); + } + + } + else + return TRUE; + } + + + + //Step 2. Write mapping table + addr = EFUSE_USAGE_MAP_START+BlkNum; + + tmpaddr = addr; + + if(addr % 2 != 0) + addr = addr -1; + InBuf[0] = addr; + InBuf[1] = 2; + + //convert the address from 10 to 8 bit ( bit7, 6 = parity and bit5 ~ 0 = bit9~4), and write to logical map entry + tmpOffset = Offset; + tmpOffset >>= 4; + tmpOffset |= ((~((tmpOffset & 0x01) ^ ( tmpOffset >> 1 & 0x01) ^ (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01))) << 6) & 0x40; + tmpOffset |= ((~( (tmpOffset >> 2 & 0x01) ^ (tmpOffset >> 3 & 0x01) ^ (tmpOffset >> 4 & 0x01) ^ ( tmpOffset >> 5 & 0x01))) << 7) & 0x80; + + // write the logical address + if(tmpaddr%2 != 0) + InBuf[2] = tmpOffset<<8; + else + InBuf[2] = tmpOffset; + + eFuseWritePhysical(pAd,&InBuf[0], 6, NULL, 0); + + //Step 3. Compare data if not the same, invalidate the mapping entry, then re-write the data until E-fuse is exhausted + bWriteSuccess = TRUE; + for(i =0; i<8; i++) + { + addr = BlkNum * 0x10 ; + + InBuf[0] = addr+2*i; + InBuf[1] = 2; + InBuf[2] = 0x0; + + eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2); + DBGPRINT(RT_DEBUG_TRACE, ("addr=%x, buffer[i]=%x,InBuf[2]=%x\n",InBuf[0],pData[i],InBuf[2])); + if(pData[i] != InBuf[2]) + { + bWriteSuccess = FALSE; + break; + } + } + + //Step 4. invlidate mapping entry and find a free mapping entry if not succeed + + if (!bWriteSuccess&&Loop<2) + { + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegistersFromBin::Not bWriteSuccess BlkNum = %d\n", BlkNum)); + + // the offset of current mapping entry + addr = EFUSE_USAGE_MAP_START+BlkNum; + + //find a new mapping entry + BlkNum = 0xffff; + for (i=EFUSE_USAGE_MAP_START; i<=EFUSE_USAGE_MAP_END; i+=2) + { + eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress); + if( (LogicalAddress & 0xff) == 0) + { + BlkNum = i-EFUSE_USAGE_MAP_START; + break; + } + else if(( (LogicalAddress >> 8) & 0xff) == 0) + { + if (i != EFUSE_USAGE_MAP_END) + { + BlkNum = i+1-EFUSE_USAGE_MAP_START; + } + break; + } + } + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegistersFromBin::Not bWriteSuccess new BlkNum = %d\n", BlkNum)); + if(BlkNum == 0xffff) + { + DBGPRINT(RT_DEBUG_TRACE, ("eFuseWriteRegistersFromBin: out of free E-fuse space!!!\n")); + return FALSE; + } + + //invalidate the original mapping entry if new entry is not found + tmpaddr = addr; + + if(addr % 2 != 0) + addr = addr -1; + InBuf[0] = addr; + InBuf[1] = 2; + + eFuseReadPhysical(pAd, &InBuf[0], 4, &InBuf[2], 2); + + // write the logical address + if(tmpaddr%2 != 0) + { + // Invalidate the high byte + for (i=8; i<15; i++) + { + if( ( (InBuf[2] >> i) & 0x01) == 0) + { + InBuf[2] |= (0x1 <<i); + break; + } + } + } + else + { + // invalidate the low byte + for (i=0; i<8; i++) + { + if( ( (InBuf[2] >> i) & 0x01) == 0) + { + InBuf[2] |= (0x1 <<i); + break; + } + } + } + eFuseWritePhysical(pAd, &InBuf[0], 6, NULL, 0); + } + + } + while(!bWriteSuccess&&Loop<2); + + return TRUE; +} + + +int rtmp_ee_efuse_read16( + IN RTMP_ADAPTER *pAd, + IN USHORT Offset, + OUT USHORT *pValue) +{ + if (pAd->bFroceEEPROMBuffer +#ifdef RALINK_ATE + ||pAd->bEEPROMFile +#endif // RALINK_ATE // + ) + { + DBGPRINT(RT_DEBUG_TRACE, ("Read from EEPROM Buffer\n")); + NdisMoveMemory(pValue, &(pAd->EEPROMImage[Offset]), 2); + } + else + eFuseReadRegisters(pAd, Offset, 2, pValue); + return (*pValue); +} + + +int rtmp_ee_efuse_write16( + IN RTMP_ADAPTER *pAd, + IN USHORT Offset, + IN USHORT data) +{ + if (pAd->bFroceEEPROMBuffer +#ifdef RALINK_ATE + ||pAd->bEEPROMFile +#endif // RALINK_ATE // + ) + { + DBGPRINT(RT_DEBUG_TRACE, ("Write to EEPROM Buffer\n")); + NdisMoveMemory(&(pAd->EEPROMImage[Offset]), &data, 2); + } + else + eFuseWrite(pAd,Offset ,&data, 2); + return 0; +} + + +int RtmpEfuseSupportCheck( + IN RTMP_ADAPTER *pAd) +{ + USHORT value; + + if (IS_RT30xx(pAd)) + { + eFusePhysicalReadRegisters(pAd, EFUSE_TAG, 2, &value); + pAd->EFuseTag = (value & 0xff); + } + return 0; +} + + +#ifdef RALINK_ATE +INT set_eFuseBufferModeWriteBack_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT Enable; + + + if(strlen(arg)>0) + { + Enable= simple_strtol(arg, 0, 16); + } + else + return FALSE; + if(Enable==1) + { + DBGPRINT(RT_DEBUG_TRACE, ("set_eFuseBufferMode_Proc:: Call WRITEEEPROMBUF")); + eFuseWriteEeeppromBuf(pAd); + } + else + return FALSE; + return TRUE; +} +#endif // RALINK_ATE // + + +/* + ======================================================================== + + Routine Description: + Load EEPROM from bin file for eFuse mode + + Arguments: + Adapter Pointer to our adapter + + Return Value: + NDIS_STATUS_SUCCESS firmware image load ok + NDIS_STATUS_FAILURE image not found + + IRQL = PASSIVE_LEVEL + + ======================================================================== +*/ +INT eFuseLoadEEPROM( + IN PRTMP_ADAPTER pAd) +{ + PSTRING src = NULL; + INT retval; + RTMP_OS_FD srcf; + RTMP_OS_FS_INFO osFSInfo; + + + src=EFUSE_BUFFER_PATH; + DBGPRINT(RT_DEBUG_TRACE, ("FileName=%s\n",src)); + + + RtmpOSFSInfoChange(&osFSInfo, TRUE); + + if (src && *src) + { + srcf = RtmpOSFileOpen(src, O_RDONLY, 0); + if (IS_FILE_OPEN_ERR(srcf)) + { + DBGPRINT(RT_DEBUG_ERROR, ("--> Error opening %s\n", src)); + return FALSE; + } + else + { + + memset(pAd->EEPROMImage, 0x00, MAX_EEPROM_BIN_FILE_SIZE); + + + retval =RtmpOSFileRead(srcf, (PSTRING)pAd->EEPROMImage, MAX_EEPROM_BIN_FILE_SIZE); + if (retval > 0) + { + + retval = NDIS_STATUS_SUCCESS; + } + else + DBGPRINT(RT_DEBUG_ERROR, ("Read file \"%s\" failed(errCode=%d)!\n", src, retval)); + + } + + + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("--> Error src or srcf is null\n")); + return FALSE; + + } + + retval=RtmpOSFileClose(srcf); + + if (retval) + { + DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src)); + } + + + RtmpOSFSInfoChange(&osFSInfo, FALSE); + + return TRUE; +} + +INT eFuseWriteEeeppromBuf( + IN PRTMP_ADAPTER pAd) +{ + + PSTRING src = NULL; + INT retval; + RTMP_OS_FD srcf; + RTMP_OS_FS_INFO osFSInfo; + + + src=EFUSE_BUFFER_PATH; + DBGPRINT(RT_DEBUG_TRACE, ("FileName=%s\n",src)); + + RtmpOSFSInfoChange(&osFSInfo, TRUE); + + + + if (src && *src) + { + srcf = RtmpOSFileOpen(src, O_WRONLY|O_CREAT, 0); + + if (IS_FILE_OPEN_ERR(srcf)) + { + DBGPRINT(RT_DEBUG_ERROR, ("--> Error opening %s\n", src)); + return FALSE; + } + else + { +/* + // The object must have a read method + if (srcf->f_op && srcf->f_op->write) + { + // The object must have a read method + srcf->f_op->write(srcf, pAd->EEPROMImage, 1024, &srcf->f_pos); + + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("--> Error!! System doest not support read function\n")); + return FALSE; + } +*/ + + RtmpOSFileWrite(srcf, (PSTRING)pAd->EEPROMImage,MAX_EEPROM_BIN_FILE_SIZE); + + } + + + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("--> Error src or srcf is null\n")); + return FALSE; + + } + + retval=RtmpOSFileClose(srcf); + + if (retval) + { + DBGPRINT(RT_DEBUG_TRACE, ("--> Error %d closing %s\n", -retval, src)); + } + + RtmpOSFSInfoChange(&osFSInfo, FALSE); + return TRUE; +} + + +VOID eFuseGetFreeBlockCount(IN PRTMP_ADAPTER pAd, + PUINT EfuseFreeBlock) +{ + USHORT i; + USHORT LogicalAddress; + if(!pAd->bUseEfuse) + { + DBGPRINT(RT_DEBUG_TRACE,("eFuseGetFreeBlockCount Only supports efuse Mode\n")); + return ; + } + for (i = EFUSE_USAGE_MAP_START; i <= EFUSE_USAGE_MAP_END; i+=2) + { + eFusePhysicalReadRegisters(pAd, i, 2, &LogicalAddress); + if( (LogicalAddress & 0xff) == 0) + { + *EfuseFreeBlock= (UCHAR) (EFUSE_USAGE_MAP_END-i+1); + break; + } + else if(( (LogicalAddress >> 8) & 0xff) == 0) + { + *EfuseFreeBlock = (UCHAR) (EFUSE_USAGE_MAP_END-i); + break; + } + + if(i == EFUSE_USAGE_MAP_END) + *EfuseFreeBlock = 0; + } + DBGPRINT(RT_DEBUG_TRACE,("eFuseGetFreeBlockCount is 0x%x\n",*EfuseFreeBlock)); +} + +INT eFuse_init( + IN PRTMP_ADAPTER pAd) +{ + UINT EfuseFreeBlock=0; + DBGPRINT(RT_DEBUG_ERROR, ("NVM is Efuse and its size =%x[%x-%x] \n",EFUSE_USAGE_MAP_SIZE,EFUSE_USAGE_MAP_START,EFUSE_USAGE_MAP_END)); + eFuseGetFreeBlockCount(pAd, &EfuseFreeBlock); + //If the used block of efuse is less than 5. We assume the default value + // of this efuse is empty and change to the buffer mode in odrder to + //bring up interfaces successfully. + if(EfuseFreeBlock > (EFUSE_USAGE_MAP_END-5)) + { + DBGPRINT(RT_DEBUG_ERROR, ("NVM is Efuse and the information is too less to bring up interface. Force to use EEPROM Buffer Mode\n")); + pAd->bFroceEEPROMBuffer = TRUE; + eFuseLoadEEPROM(pAd); + } + else + pAd->bFroceEEPROMBuffer = FALSE; + DBGPRINT(RT_DEBUG_TRACE, ("NVM is Efuse and force to use EEPROM Buffer Mode=%x\n",pAd->bFroceEEPROMBuffer)); + + return 0; +} + +#endif // RTMP_EFUSE_SUPPORT // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ee_prom.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ee_prom.c new file mode 100644 index 000000000..ee712eb8d --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/ee_prom.c @@ -0,0 +1,272 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + ee_prom.c + + Abstract: + Miniport generic portion header file + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + + +#include "rt_config.h" + + + +// IRQL = PASSIVE_LEVEL +static inline VOID RaiseClock( + IN PRTMP_ADAPTER pAd, + IN UINT32 *x) +{ + *x = *x | EESK; + RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x); + RTMPusecDelay(1); // Max frequency = 1MHz in Spec. definition +} + +// IRQL = PASSIVE_LEVEL +static inline VOID LowerClock( + IN PRTMP_ADAPTER pAd, + IN UINT32 *x) +{ + *x = *x & ~EESK; + RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x); + RTMPusecDelay(1); +} + +// IRQL = PASSIVE_LEVEL +static inline USHORT ShiftInBits( + IN PRTMP_ADAPTER pAd) +{ + UINT32 x,i; + USHORT data=0; + + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + + x &= ~( EEDO | EEDI); + + for(i=0; i<16; i++) + { + data = data << 1; + RaiseClock(pAd, &x); + + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + LowerClock(pAd, &x); //prevent read failed + + x &= ~(EEDI); + if(x & EEDO) + data |= 1; + } + + return data; +} + + +// IRQL = PASSIVE_LEVEL +static inline VOID ShiftOutBits( + IN PRTMP_ADAPTER pAd, + IN USHORT data, + IN USHORT count) +{ + UINT32 x,mask; + + mask = 0x01 << (count - 1); + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + + x &= ~(EEDO | EEDI); + + do + { + x &= ~EEDI; + if(data & mask) x |= EEDI; + + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); + + RaiseClock(pAd, &x); + LowerClock(pAd, &x); + + mask = mask >> 1; + } while(mask); + + x &= ~EEDI; + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); +} + + +// IRQL = PASSIVE_LEVEL +static inline VOID EEpromCleanup( + IN PRTMP_ADAPTER pAd) +{ + UINT32 x; + + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + + x &= ~(EECS | EEDI); + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); + + RaiseClock(pAd, &x); + LowerClock(pAd, &x); +} + + +static inline VOID EWEN( + IN PRTMP_ADAPTER pAd) +{ + UINT32 x; + + // reset bits and set EECS + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + x &= ~(EEDI | EEDO | EESK); + x |= EECS; + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); + + // kick a pulse + RaiseClock(pAd, &x); + LowerClock(pAd, &x); + + // output the read_opcode and six pulse in that order + ShiftOutBits(pAd, EEPROM_EWEN_OPCODE, 5); + ShiftOutBits(pAd, 0, 6); + + EEpromCleanup(pAd); +} + + +static inline VOID EWDS( + IN PRTMP_ADAPTER pAd) +{ + UINT32 x; + + // reset bits and set EECS + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + x &= ~(EEDI | EEDO | EESK); + x |= EECS; + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); + + // kick a pulse + RaiseClock(pAd, &x); + LowerClock(pAd, &x); + + // output the read_opcode and six pulse in that order + ShiftOutBits(pAd, EEPROM_EWDS_OPCODE, 5); + ShiftOutBits(pAd, 0, 6); + + EEpromCleanup(pAd); +} + + +// IRQL = PASSIVE_LEVEL +int rtmp_ee_prom_read16( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + OUT USHORT *pValue) +{ + UINT32 x; + USHORT data; + + + Offset /= 2; + // reset bits and set EECS + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + x &= ~(EEDI | EEDO | EESK); + x |= EECS; + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); + + // patch can not access e-Fuse issue + if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) + { + // kick a pulse + RaiseClock(pAd, &x); + LowerClock(pAd, &x); + } + + // output the read_opcode and register number in that order + ShiftOutBits(pAd, EEPROM_READ_OPCODE, 3); + ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum); + + // Now read the data (16 bits) in from the selected EEPROM word + data = ShiftInBits(pAd); + + EEpromCleanup(pAd); + + + *pValue = data; + + return NDIS_STATUS_SUCCESS; +} + + +int rtmp_ee_prom_write16( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Data) +{ + UINT32 x; + + + Offset /= 2; + + EWEN(pAd); + + // reset bits and set EECS + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + x &= ~(EEDI | EEDO | EESK); + x |= EECS; + RTMP_IO_WRITE32(pAd, E2PROM_CSR, x); + + // patch can not access e-Fuse issue + if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) + { + // kick a pulse + RaiseClock(pAd, &x); + LowerClock(pAd, &x); + } + + // output the read_opcode ,register number and data in that order + ShiftOutBits(pAd, EEPROM_WRITE_OPCODE, 3); + ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum); + ShiftOutBits(pAd, Data, 16); // 16-bit access + + // read DO status + RTMP_IO_READ32(pAd, E2PROM_CSR, &x); + + EEpromCleanup(pAd); + + RTMPusecDelay(10000); //delay for twp(MAX)=10ms + + EWDS(pAd); + + EEpromCleanup(pAd); + + + return NDIS_STATUS_SUCCESS; + +} + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/eeprom.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/eeprom.c new file mode 100644 index 000000000..2971fd01a --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/eeprom.c @@ -0,0 +1,104 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + eeprom.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs +*/ +#include "rt_config.h" + + +INT RtmpChipOpsEepromHook( + IN RTMP_ADAPTER *pAd, + IN INT infType) +{ + RTMP_CHIP_OP *pChipOps = &pAd->chipOps; +#ifdef RT30xx +#ifdef RTMP_EFUSE_SUPPORT + UINT32 eFuseCtrl, MacCsr0; + int index; + + index = 0; + do + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return -1; + + RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); + pAd->MACVersion = MacCsr0; + + if ((pAd->MACVersion != 0x00) && (pAd->MACVersion != 0xFFFFFFFF)) + break; + + RTMPusecDelay(10); + } while (index++ < 100); + + pAd->bUseEfuse=FALSE; + RTMP_IO_READ32(pAd, EFUSE_CTRL, &eFuseCtrl); + pAd->bUseEfuse = ( (eFuseCtrl & 0x80000000) == 0x80000000) ? 1 : 0; + if(pAd->bUseEfuse) + { + pChipOps->eeinit = eFuse_init; + pChipOps->eeread = rtmp_ee_efuse_read16; + pChipOps->eewrite = rtmp_ee_efuse_write16; + DBGPRINT(RT_DEBUG_TRACE, ("NVM is EFUSE\n")); + return 0 ; + } + else + { + pAd->bFroceEEPROMBuffer = FALSE; + DBGPRINT(RT_DEBUG_TRACE, ("NVM is EEPROM\n")); + } +#endif // RTMP_EFUSE_SUPPORT // +#endif // RT30xx // + + switch(infType) + { +#ifdef RTMP_PCI_SUPPORT + case RTMP_DEV_INF_PCI: + case RTMP_DEV_INF_PCIE: + + pChipOps->eeinit = NULL; + pChipOps->eeread = rtmp_ee_prom_read16; + pChipOps->eewrite = rtmp_ee_prom_write16; + break; +#endif // RTMP_PCI_SUPPORT // + + + default: + DBGPRINT(RT_DEBUG_ERROR, ("RtmpChipOpsEepromHook() failed!\n")); + break; + } + + return 0; +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/mlme.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/mlme.c new file mode 100644 index 000000000..166e5b74d --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/mlme.c @@ -0,0 +1,6766 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + mlme.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John Chang 2004-08-25 Modify from RT2500 code base + John Chang 2004-09-06 modified for RT2600 +*/ + +#include "rt_config.h" +#include <stdarg.h> + +UCHAR CISCO_OUI[] = {0x00, 0x40, 0x96}; + +UCHAR WPA_OUI[] = {0x00, 0x50, 0xf2, 0x01}; +UCHAR RSN_OUI[] = {0x00, 0x0f, 0xac}; +UCHAR WAPI_OUI[] = {0x00, 0x14, 0x72}; +UCHAR WME_INFO_ELEM[] = {0x00, 0x50, 0xf2, 0x02, 0x00, 0x01}; +UCHAR WME_PARM_ELEM[] = {0x00, 0x50, 0xf2, 0x02, 0x01, 0x01}; +UCHAR Ccx2QosInfo[] = {0x00, 0x40, 0x96, 0x04}; +//UCHAR RALINK_OUI[] = {0x00, 0x0c, 0x43}; +UCHAR BROADCOM_OUI[] = {0x00, 0x90, 0x4c}; +UCHAR WPS_OUI[] = {0x00, 0x50, 0xf2, 0x04}; +#ifdef CONFIG_STA_SUPPORT +#ifdef DOT11_N_SUPPORT +UCHAR PRE_N_HT_OUI[] = {0x00, 0x90, 0x4c}; +#endif // DOT11_N_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +UCHAR RateSwitchTable[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x11, 0x00, 0, 0, 0, // Initial used item after association + 0x00, 0x00, 0, 40, 101, + 0x01, 0x00, 1, 40, 50, + 0x02, 0x00, 2, 35, 45, + 0x03, 0x00, 3, 20, 45, + 0x04, 0x21, 0, 30, 50, + 0x05, 0x21, 1, 20, 50, + 0x06, 0x21, 2, 20, 50, + 0x07, 0x21, 3, 15, 50, + 0x08, 0x21, 4, 15, 30, + 0x09, 0x21, 5, 10, 25, + 0x0a, 0x21, 6, 8, 25, + 0x0b, 0x21, 7, 8, 25, + 0x0c, 0x20, 12, 15, 30, + 0x0d, 0x20, 13, 8, 20, + 0x0e, 0x20, 14, 8, 20, + 0x0f, 0x20, 15, 8, 25, + 0x10, 0x22, 15, 8, 25, + 0x11, 0x00, 0, 0, 0, + 0x12, 0x00, 0, 0, 0, + 0x13, 0x00, 0, 0, 0, + 0x14, 0x00, 0, 0, 0, + 0x15, 0x00, 0, 0, 0, + 0x16, 0x00, 0, 0, 0, + 0x17, 0x00, 0, 0, 0, + 0x18, 0x00, 0, 0, 0, + 0x19, 0x00, 0, 0, 0, + 0x1a, 0x00, 0, 0, 0, + 0x1b, 0x00, 0, 0, 0, + 0x1c, 0x00, 0, 0, 0, + 0x1d, 0x00, 0, 0, 0, + 0x1e, 0x00, 0, 0, 0, + 0x1f, 0x00, 0, 0, 0, +}; + +UCHAR RateSwitchTable11B[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x04, 0x03, 0, 0, 0, // Initial used item after association + 0x00, 0x00, 0, 40, 101, + 0x01, 0x00, 1, 40, 50, + 0x02, 0x00, 2, 35, 45, + 0x03, 0x00, 3, 20, 45, +}; + +UCHAR RateSwitchTable11BG[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0a, 0x00, 0, 0, 0, // Initial used item after association + 0x00, 0x00, 0, 40, 101, + 0x01, 0x00, 1, 40, 50, + 0x02, 0x00, 2, 35, 45, + 0x03, 0x00, 3, 20, 45, + 0x04, 0x10, 2, 20, 35, + 0x05, 0x10, 3, 16, 35, + 0x06, 0x10, 4, 10, 25, + 0x07, 0x10, 5, 16, 25, + 0x08, 0x10, 6, 10, 25, + 0x09, 0x10, 7, 10, 13, +}; + +UCHAR RateSwitchTable11G[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x08, 0x00, 0, 0, 0, // Initial used item after association + 0x00, 0x10, 0, 20, 101, + 0x01, 0x10, 1, 20, 35, + 0x02, 0x10, 2, 20, 35, + 0x03, 0x10, 3, 16, 35, + 0x04, 0x10, 4, 10, 25, + 0x05, 0x10, 5, 16, 25, + 0x06, 0x10, 6, 10, 25, + 0x07, 0x10, 7, 10, 13, +}; + +#ifdef DOT11_N_SUPPORT +UCHAR RateSwitchTable11N1S[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0c, 0x0a, 0, 0, 0, // Initial used item after association + 0x00, 0x00, 0, 40, 101, + 0x01, 0x00, 1, 40, 50, + 0x02, 0x00, 2, 25, 45, + 0x03, 0x21, 0, 20, 35, + 0x04, 0x21, 1, 20, 35, + 0x05, 0x21, 2, 20, 35, + 0x06, 0x21, 3, 15, 35, + 0x07, 0x21, 4, 15, 30, + 0x08, 0x21, 5, 10, 25, + 0x09, 0x21, 6, 8, 14, + 0x0a, 0x21, 7, 8, 14, + 0x0b, 0x23, 7, 8, 14, +}; + +UCHAR RateSwitchTable11N2S[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0e, 0x0c, 0, 0, 0, // Initial used item after association + 0x00, 0x00, 0, 40, 101, + 0x01, 0x00, 1, 40, 50, + 0x02, 0x00, 2, 25, 45, + 0x03, 0x21, 0, 20, 35, + 0x04, 0x21, 1, 20, 35, + 0x05, 0x21, 2, 20, 35, + 0x06, 0x21, 3, 15, 35, + 0x07, 0x21, 4, 15, 30, + 0x08, 0x20, 11, 15, 30, + 0x09, 0x20, 12, 15, 30, + 0x0a, 0x20, 13, 8, 20, + 0x0b, 0x20, 14, 8, 20, + 0x0c, 0x20, 15, 8, 25, + 0x0d, 0x22, 15, 8, 15, +}; + +#ifdef NEW_RATE_ADAPT_SUPPORT +UCHAR RateSwitchTable11N3S[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) +// item no. mcs highPERThrd +// mode lowPERThrd +// downMcs upMcs2 +// upMcs3 upMcs1 + 0x19, 0x18, 0, 0, 0, 0, 0, 0, 0, 0,// Initial used item after association: the number of rate indexes, the initial mcs + 0x00, 0x21, 0, 30, 101, 0, 16, 8, 1, 7,//mcs0 + 0x01, 0x21, 1, 20, 50, 0, 16, 9, 2, 13,//mcs1 + 0x02, 0x21, 2, 20, 50, 1, 17, 9, 3, 20,//mcs2 + 0x03, 0x21, 3, 15, 50, 2, 17, 10, 4, 26,//mcs3 + 0x04, 0x21, 4, 15, 30, 3, 18, 11, 5, 39,//mcs4 + 0x05, 0x21, 5, 10, 25, 4, 18, 12, 6, 52,//mcs5 + 0x06, 0x21, 6, 8, 14, 5, 19, 12, 7, 59,//mcs6 + 0x07, 0x21, 7, 8, 14, 6, 19, 12, 7, 65,//mcs7 + 0x08, 0x20, 8, 30, 50, 0, 16, 9, 2, 13,//mcs8 + 0x09, 0x20, 9, 20, 50, 8, 17, 10, 4, 26,//mcs9 + 0x0a, 0x20, 10, 20, 50, 9, 18, 11, 5, 39,//mcs10 + 0x0b, 0x20, 11, 15, 30, 10, 18, 12, 6, 52,//mcs11 + 0x0c, 0x20, 12, 15, 30, 11, 20, 13, 12, 78,//mcs12 + 0x0d, 0x20, 13, 8, 20, 12, 20, 14, 13, 104,//mcs13 + 0x0e, 0x20, 14, 8, 20, 13, 21, 15, 14, 117,//mcs14 + 0x0f, 0x20, 15, 8, 25, 14, 21, 15, 15, 130,//mcs15 + 0x10, 0x20, 16, 30, 50, 8, 17, 9, 3, 20,//mcs16 + 0x11, 0x20, 17, 20, 50, 16, 18, 11, 5, 39,//mcs17 + 0x12, 0x20, 18, 20, 50, 17, 19, 12, 7, 59,//mcs18 + 0x13, 0x20, 19, 15, 30, 18, 20, 13, 19, 78,//mcs19 + 0x14, 0x20, 20, 15, 30, 19, 21, 15, 20, 117,//mcs20 + 0x15, 0x20, 21, 8, 20, 20, 22, 21, 21, 156,//mcs21 + 0x16, 0x20, 22, 8, 20, 21, 23, 22, 22, 176,//mcs22 + 0x17, 0x20, 23, 8, 25, 22, 24, 23, 23, 196,//mcs23 + 0x18, 0x22, 23, 8, 25, 23, 24, 24, 24, 217,//mcs23+shortGI + + }; +#else +UCHAR RateSwitchTable11N3S[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0e, 0x00, 0, 0, 0, // 0x0a, 0x00, 0, 0, 0, // Initial used item after association + 0x00, 0x21, 0, 30, 101, + 0x01, 0x21, 1, 20, 50, + 0x02, 0x21, 2, 20, 50, + 0x03, 0x21, 3, 15, 50, + 0x04, 0x21, 4, 15, 30, + 0x05, 0x20, 11, 15, 30, // Required by System-Alan @ 20080812 + 0x06, 0x20, 12, 15, 30, // 0x05, 0x20, 12, 15, 30, + 0x07, 0x20, 13, 8, 20, // 0x06, 0x20, 13, 8, 20, + 0x08, 0x20, 14, 8, 20, // 0x07, 0x20, 14, 8, 20, + 0x09, 0x20, 15, 8, 25, // 0x08, 0x20, 15, 8, 25, + //0x0a, 0x22, 15, 8, 15, // 0x09, 0x22, 15, 8, 25, + //0x0a, 0x20, 20, 15, 30, + 0x0a, 0x20, 21, 8, 20, + 0x0b, 0x20, 22, 8, 20, + 0x0c, 0x20, 23, 8, 25, + 0x0d, 0x22, 23, 8, 25, +}; +#endif // NEW_RATE_ADAPT_SUPPORT // + +UCHAR RateSwitchTable11N2SForABand[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0b, 0x09, 0, 0, 0, // Initial used item after association + 0x00, 0x21, 0, 30, 101, + 0x01, 0x21, 1, 20, 50, + 0x02, 0x21, 2, 20, 50, + 0x03, 0x21, 3, 15, 50, + 0x04, 0x21, 4, 15, 30, + 0x05, 0x21, 5, 15, 30, + 0x06, 0x20, 12, 15, 30, + 0x07, 0x20, 13, 8, 20, + 0x08, 0x20, 14, 8, 20, + 0x09, 0x20, 15, 8, 25, + 0x0a, 0x22, 15, 8, 25, +}; + +UCHAR RateSwitchTable11N3SForABand[] = { // 3*3 +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0b, 0x09, 0, 0, 0, // Initial used item after association + 0x00, 0x21, 0, 30, 101, + 0x01, 0x21, 1, 20, 50, + 0x02, 0x21, 2, 20, 50, + 0x03, 0x21, 3, 15, 50, + 0x04, 0x21, 4, 15, 30, + 0x05, 0x21, 5, 15, 30, + 0x06, 0x20, 12, 15, 30, + 0x07, 0x20, 13, 8, 20, + 0x08, 0x20, 14, 8, 20, + 0x09, 0x20, 15, 8, 25, + 0x0a, 0x22, 15, 8, 25, +}; + +UCHAR RateSwitchTable11BGN1S[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0c, 0x0a, 0, 0, 0, // Initial used item after association + 0x00, 0x00, 0, 40, 101, + 0x01, 0x00, 1, 40, 50, + 0x02, 0x00, 2, 25, 45, + 0x03, 0x21, 0, 20, 35, + 0x04, 0x21, 1, 20, 35, + 0x05, 0x21, 2, 20, 35, + 0x06, 0x21, 3, 15, 35, + 0x07, 0x21, 4, 15, 30, + 0x08, 0x21, 5, 10, 25, + 0x09, 0x21, 6, 8, 14, + 0x0a, 0x21, 7, 8, 14, + 0x0b, 0x23, 7, 8, 14, +}; + +UCHAR RateSwitchTable11BGN2S[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0e, 0x0c, 0, 0, 0, // Initial used item after association + 0x00, 0x00, 0, 40, 101, + 0x01, 0x00, 1, 40, 50, + 0x02, 0x00, 2, 25, 45, + 0x03, 0x21, 0, 20, 35, + 0x04, 0x21, 1, 20, 35, + 0x05, 0x21, 2, 20, 35, + 0x06, 0x21, 3, 15, 35, + 0x07, 0x21, 4, 15, 30, + 0x08, 0x20, 11, 15, 30, + 0x09, 0x20, 12, 15, 22, + 0x0a, 0x20, 13, 8, 20, + 0x0b, 0x20, 14, 8, 20, + 0x0c, 0x20, 15, 8, 20, + 0x0d, 0x22, 15, 8, 15, +}; + +UCHAR RateSwitchTable11BGN3S[] = { // 3*3 +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0a, 0x00, 0, 0, 0, // Initial used item after association + 0x00, 0x21, 0, 30,101, //50 + 0x01, 0x21, 1, 20, 50, + 0x02, 0x21, 2, 20, 50, + 0x03, 0x21, 3, 20, 50, + 0x04, 0x21, 4, 15, 50, + 0x05, 0x20, 20, 15, 30, + 0x06, 0x20, 21, 8, 20, + 0x07, 0x20, 22, 8, 20, + 0x08, 0x20, 23, 8, 25, + 0x09, 0x22, 23, 8, 25, +}; + +UCHAR RateSwitchTable11BGN2SForABand[] = { +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0b, 0x09, 0, 0, 0, // Initial used item after association + 0x00, 0x21, 0, 30,101, //50 + 0x01, 0x21, 1, 20, 50, + 0x02, 0x21, 2, 20, 50, + 0x03, 0x21, 3, 15, 50, + 0x04, 0x21, 4, 15, 30, + 0x05, 0x21, 5, 15, 30, + 0x06, 0x20, 12, 15, 30, + 0x07, 0x20, 13, 8, 20, + 0x08, 0x20, 14, 8, 20, + 0x09, 0x20, 15, 8, 25, + 0x0a, 0x22, 15, 8, 25, +}; + +UCHAR RateSwitchTable11BGN3SForABand[] = { // 3*3 +// Item No. Mode Curr-MCS TrainUp TrainDown // Mode- Bit0: STBC, Bit1: Short GI, Bit4,5: Mode(0:CCK, 1:OFDM, 2:HT Mix, 3:HT GF) + 0x0c, 0x09, 0, 0, 0, // Initial used item after association + 0x00, 0x21, 0, 30,101, //50 + 0x01, 0x21, 1, 20, 50, + 0x02, 0x21, 2, 20, 50, + 0x03, 0x21, 3, 15, 50, + 0x04, 0x21, 4, 15, 30, + 0x05, 0x21, 5, 15, 30, + 0x06, 0x21, 12, 15, 30, + 0x07, 0x20, 20, 15, 30, + 0x08, 0x20, 21, 8, 20, + 0x09, 0x20, 22, 8, 20, + 0x0a, 0x20, 23, 8, 25, + 0x0b, 0x22, 23, 8, 25, +}; +#endif // DOT11_N_SUPPORT // + + +extern UCHAR OfdmRateToRxwiMCS[]; +// since RT61 has better RX sensibility, we have to limit TX ACK rate not to exceed our normal data TX rate. +// otherwise the WLAN peer may not be able to receive the ACK thus downgrade its data TX rate +ULONG BasicRateMask[12] = {0xfffff001 /* 1-Mbps */, 0xfffff003 /* 2 Mbps */, 0xfffff007 /* 5.5 */, 0xfffff00f /* 11 */, + 0xfffff01f /* 6 */ , 0xfffff03f /* 9 */ , 0xfffff07f /* 12 */ , 0xfffff0ff /* 18 */, + 0xfffff1ff /* 24 */ , 0xfffff3ff /* 36 */ , 0xfffff7ff /* 48 */ , 0xffffffff /* 54 */}; + +UCHAR BROADCAST_ADDR[MAC_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; +UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +// e.g. RssiSafeLevelForTxRate[RATE_36]" means if the current RSSI is greater than +// this value, then it's quaranteed capable of operating in 36 mbps TX rate in +// clean environment. +// TxRate: 1 2 5.5 11 6 9 12 18 24 36 48 54 72 100 +signed char RssiSafeLevelForTxRate[] ={ -92, -91, -90, -87, -88, -86, -85, -83, -81, -78, -72, -71, -40, -40 }; + +unsigned char RateIdToMbps[] = { 1, 2, 5, 11, 6, 9, 12, 18, 24, 36, 48, 54, 72, 100}; +USHORT RateIdTo500Kbps[] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108, 144, 200}; + +UCHAR SsidIe = IE_SSID; +UCHAR SupRateIe = IE_SUPP_RATES; +UCHAR ExtRateIe = IE_EXT_SUPP_RATES; +#ifdef DOT11_N_SUPPORT +UCHAR HtCapIe = IE_HT_CAP; +UCHAR AddHtInfoIe = IE_ADD_HT; +UCHAR NewExtChanIe = IE_SECONDARY_CH_OFFSET; +UCHAR BssCoexistIe = IE_2040_BSS_COEXIST; +UCHAR ExtHtCapIe = IE_EXT_CAPABILITY; +#endif // DOT11_N_SUPPORT // +UCHAR ExtCapIe = IE_EXT_CAPABILITY; +UCHAR ErpIe = IE_ERP; +UCHAR DsIe = IE_DS_PARM; +UCHAR TimIe = IE_TIM; +UCHAR WpaIe = IE_WPA; +UCHAR Wpa2Ie = IE_WPA2; +UCHAR IbssIe = IE_IBSS_PARM; +UCHAR Ccx2Ie = IE_CCX_V2; +UCHAR WapiIe = IE_WAPI; + +extern UCHAR WPA_OUI[]; + +UCHAR SES_OUI[] = {0x00, 0x90, 0x4c}; + +UCHAR ZeroSsid[32] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; + + +#ifdef INF_AMAZON_SE +UINT16 MaxBulkOutsSizeLimit[5][4] = +{ + // Priority high -> low + { 24576, 2048, 2048, 2048 }, // 0 AC + { 24576, 2048, 2048, 2048 }, // 1 AC + { 24576, 2048, 2048, 2048 }, // 2 ACs + { 24576, 6144, 2048, 2048 }, // 3 ACs + { 24576, 6144, 4096, 2048 } // 4 ACs +}; + +VOID SoftwareFlowControl( + IN PRTMP_ADAPTER pAd) +{ + + BOOLEAN ResetBulkOutSize=FALSE; + UCHAR i=0,RunningQueueNo=0,QueIdx=0,HighWorkingAcCount=0; + UINT PacketsInQueueSize=0; + UCHAR Priority[]={1,0,2,3}; + + for (i=0;i<NUM_OF_TX_RING;i++) + { + + if (pAd->TxContext[i].CurWritePosition>=pAd->TxContext[i].NextBulkOutPosition) + { + PacketsInQueueSize=pAd->TxContext[i].CurWritePosition-pAd->TxContext[i].NextBulkOutPosition; + } + else + { + PacketsInQueueSize=MAX_TXBULK_SIZE-pAd->TxContext[i].NextBulkOutPosition+pAd->TxContext[i].CurWritePosition; + } + + if (pAd->BulkOutDataSizeCount[i]>20480 || PacketsInQueueSize>6144) + { + RunningQueueNo++; + pAd->BulkOutDataFlag[i]=TRUE; + } + else + pAd->BulkOutDataFlag[i]=FALSE; + + pAd->BulkOutDataSizeCount[i]=0; + } + + if (RunningQueueNo>pAd->LastRunningQueueNo) + { + DBGPRINT(RT_DEBUG_INFO,("SoftwareFlowControl reset %d > %d \n",RunningQueueNo,pAd->LastRunningQueueNo)); + +ResetBulkOutSize=TRUE; + pAd->RunningQueueNoCount=0; + pAd->LastRunningQueueNo=RunningQueueNo; + } + else if (RunningQueueNo==pAd->LastRunningQueueNo) + { +pAd->RunningQueueNoCount=0; + } + else if (RunningQueueNo<pAd->LastRunningQueueNo) + { + DBGPRINT(RT_DEBUG_INFO,("SoftwareFlowControl reset %d < %d \n",RunningQueueNo,pAd->LastRunningQueueNo)); + pAd->RunningQueueNoCount++; + if (pAd->RunningQueueNoCount>=6) + { + ResetBulkOutSize=TRUE; + pAd->RunningQueueNoCount=0; + pAd->LastRunningQueueNo=RunningQueueNo; + } + } + + if (ResetBulkOutSize==TRUE) + { + for (QueIdx=0;QueIdx<NUM_OF_TX_RING;QueIdx++) + { + HighWorkingAcCount=0; + for (i=0;i<NUM_OF_TX_RING;i++) + { + if (QueIdx==i) + continue; + + if (pAd->BulkOutDataFlag[i]==TRUE && Priority[i]>Priority[QueIdx]) + HighWorkingAcCount++; + + } + pAd->BulkOutDataSizeLimit[QueIdx]=MaxBulkOutsSizeLimit[RunningQueueNo][HighWorkingAcCount]; + } + + DBGPRINT(RT_DEBUG_TRACE, ("Reset bulkout size AC0(BE):%7d AC1(BK):%7d AC2(VI):%7d AC3(VO):%7d %d\n",pAd->BulkOutDataSizeLimit[0] + ,pAd->BulkOutDataSizeLimit[1] + ,pAd->BulkOutDataSizeLimit[2] + ,pAd->BulkOutDataSizeLimit[3] + ,RunningQueueNo)); + } + +} +#endif // INF_AMAZON_SE // + +/* + ========================================================================== + Description: + initialize the MLME task and its data structure (queue, spinlock, + timer, state machines). + + IRQL = PASSIVE_LEVEL + + Return: + always return NDIS_STATUS_SUCCESS + + ========================================================================== +*/ +NDIS_STATUS MlmeInit( + IN PRTMP_ADAPTER pAd) +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + DBGPRINT(RT_DEBUG_TRACE, ("--> MLME Initialize\n")); + + do + { + Status = MlmeQueueInit(&pAd->Mlme.Queue); + if(Status != NDIS_STATUS_SUCCESS) + break; + + pAd->Mlme.bRunning = FALSE; + NdisAllocateSpinLock(&pAd->Mlme.TaskLock); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + BssTableInit(&pAd->ScanTab); + + // init STA state machines + AssocStateMachineInit(pAd, &pAd->Mlme.AssocMachine, pAd->Mlme.AssocFunc); + AuthStateMachineInit(pAd, &pAd->Mlme.AuthMachine, pAd->Mlme.AuthFunc); + AuthRspStateMachineInit(pAd, &pAd->Mlme.AuthRspMachine, pAd->Mlme.AuthRspFunc); + SyncStateMachineInit(pAd, &pAd->Mlme.SyncMachine, pAd->Mlme.SyncFunc); + +#ifdef QOS_DLS_SUPPORT + DlsStateMachineInit(pAd, &pAd->Mlme.DlsMachine, pAd->Mlme.DlsFunc); +#endif // QOS_DLS_SUPPORT // + + + + + + // Since we are using switch/case to implement it, the init is different from the above + // state machine init + MlmeCntlInit(pAd, &pAd->Mlme.CntlMachine, NULL); + } +#endif // CONFIG_STA_SUPPORT // + + + WpaStateMachineInit(pAd, &pAd->Mlme.WpaMachine, pAd->Mlme.WpaFunc); + + + ActionStateMachineInit(pAd, &pAd->Mlme.ActMachine, pAd->Mlme.ActFunc); + + // Init mlme periodic timer + RTMPInitTimer(pAd, &pAd->Mlme.PeriodicTimer, GET_TIMER_FUNCTION(MlmePeriodicExec), pAd, TRUE); + + // Set mlme periodic timer + RTMPSetTimer(&pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV); + + // software-based RX Antenna diversity + RTMPInitTimer(pAd, &pAd->Mlme.RxAntEvalTimer, GET_TIMER_FUNCTION(AsicRxAntEvalTimeout), pAd, FALSE); + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + { + // only PCIe cards need these two timers + RTMPInitTimer(pAd, &pAd->Mlme.PsPollTimer, GET_TIMER_FUNCTION(PsPollWakeExec), pAd, FALSE); + RTMPInitTimer(pAd, &pAd->Mlme.RadioOnOffTimer, GET_TIMER_FUNCTION(RadioOnExec), pAd, FALSE); + } +#endif // PCIE_PS_SUPPORT // + + RTMPInitTimer(pAd, &pAd->Mlme.LinkDownTimer, GET_TIMER_FUNCTION(LinkDownExec), pAd, FALSE); + + } +#endif // CONFIG_STA_SUPPORT // + + } while (FALSE); + + DBGPRINT(RT_DEBUG_TRACE, ("<-- MLME Initialize\n")); + + return Status; +} + +/* + ========================================================================== + Description: + main loop of the MLME + Pre: + Mlme has to be initialized, and there are something inside the queue + Note: + This function is invoked from MPSetInformation and MPReceive; + This task guarantee only one MlmeHandler will run. + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeHandler( + IN PRTMP_ADAPTER pAd) +{ + MLME_QUEUE_ELEM *Elem = NULL; +#ifdef APCLI_SUPPORT + SHORT apcliIfIndex; +#endif // APCLI_SUPPORT // + + // Only accept MLME and Frame from peer side, no other (control/data) frame should + // get into this state machine + + NdisAcquireSpinLock(&pAd->Mlme.TaskLock); + if(pAd->Mlme.bRunning) + { + NdisReleaseSpinLock(&pAd->Mlme.TaskLock); + return; + } + else + { + pAd->Mlme.bRunning = TRUE; + } + NdisReleaseSpinLock(&pAd->Mlme.TaskLock); + + while (!MlmeQueueEmpty(&pAd->Mlme.Queue)) + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MLME_RESET_IN_PROGRESS) || + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS) || + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + { + DBGPRINT(RT_DEBUG_TRACE, ("Device Halted or Removed or MlmeRest, exit MlmeHandler! (queue num = %ld)\n", pAd->Mlme.Queue.Num)); + break; + } + +#ifdef RALINK_ATE + if(ATE_ON(pAd)) + { + DBGPRINT(RT_DEBUG_TRACE, ("The driver is in ATE mode now in MlmeHandler\n")); + break; + } +#endif // RALINK_ATE // + + //From message type, determine which state machine I should drive + if (MlmeDequeue(&pAd->Mlme.Queue, &Elem)) + { + + // if dequeue success + switch (Elem->Machine) + { + // STA state machines +#ifdef CONFIG_STA_SUPPORT + case ASSOC_STATE_MACHINE: + StateMachinePerformAction(pAd, &pAd->Mlme.AssocMachine, + Elem, pAd->Mlme.AssocMachine.CurrState); + break; + + case AUTH_STATE_MACHINE: + StateMachinePerformAction(pAd, &pAd->Mlme.AuthMachine, + Elem, pAd->Mlme.AuthMachine.CurrState); + break; + + case AUTH_RSP_STATE_MACHINE: + StateMachinePerformAction(pAd, &pAd->Mlme.AuthRspMachine, + Elem, pAd->Mlme.AuthRspMachine.CurrState); + break; + + case SYNC_STATE_MACHINE: + StateMachinePerformAction(pAd, &pAd->Mlme.SyncMachine, + Elem, pAd->Mlme.SyncMachine.CurrState); + break; + + case MLME_CNTL_STATE_MACHINE: + MlmeCntlMachinePerformAction(pAd, &pAd->Mlme.CntlMachine, Elem); + break; + + case WPA_PSK_STATE_MACHINE: + StateMachinePerformAction(pAd, &pAd->Mlme.WpaPskMachine, + Elem, pAd->Mlme.WpaPskMachine.CurrState); + break; + +#ifdef QOS_DLS_SUPPORT + case DLS_STATE_MACHINE: + StateMachinePerformAction(pAd, &pAd->Mlme.DlsMachine, + Elem, pAd->Mlme.DlsMachine.CurrState); + break; +#endif // QOS_DLS_SUPPORT // + + + + +#endif // CONFIG_STA_SUPPORT // + + case ACTION_STATE_MACHINE: + StateMachinePerformAction(pAd, &pAd->Mlme.ActMachine, + Elem, pAd->Mlme.ActMachine.CurrState); + break; + + case WPA_STATE_MACHINE: + StateMachinePerformAction(pAd, &pAd->Mlme.WpaMachine, Elem, pAd->Mlme.WpaMachine.CurrState); + break; + + + default: + DBGPRINT(RT_DEBUG_TRACE, ("ERROR: Illegal machine %ld in MlmeHandler()\n", Elem->Machine)); + break; + } // end of switch + + // free MLME element + Elem->Occupied = FALSE; + Elem->MsgLen = 0; + + } + else { + DBGPRINT_ERR(("MlmeHandler: MlmeQueue empty\n")); + } + } + + NdisAcquireSpinLock(&pAd->Mlme.TaskLock); + pAd->Mlme.bRunning = FALSE; + NdisReleaseSpinLock(&pAd->Mlme.TaskLock); +} + +/* + ========================================================================== + Description: + Destructor of MLME (Destroy queue, state machine, spin lock and timer) + Parameters: + Adapter - NIC Adapter pointer + Post: + The MLME task will no longer work properly + + IRQL = PASSIVE_LEVEL + + ========================================================================== + */ +VOID MlmeHalt( + IN PRTMP_ADAPTER pAd) +{ + BOOLEAN Cancelled; + + DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeHalt\n")); + + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + { + // disable BEACON generation and other BEACON related hardware timers + AsicDisableSync(pAd); + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef QOS_DLS_SUPPORT + UCHAR i; +#endif // QOS_DLS_SUPPORT // + + // Cancel pending timers + RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); + + +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE) + &&(pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) + { + RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); + RTMPCancelTimer(&pAd->Mlme.RadioOnOffTimer, &Cancelled); + } +#endif // PCIE_PS_SUPPORT // + +#ifdef QOS_DLS_SUPPORT + for (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &Cancelled); + } +#endif // QOS_DLS_SUPPORT // + RTMPCancelTimer(&pAd->Mlme.LinkDownTimer, &Cancelled); + + + + } +#endif // CONFIG_STA_SUPPORT // + + RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled); + RTMPCancelTimer(&pAd->Mlme.RxAntEvalTimer, &Cancelled); + + + + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + { + RTMP_CHIP_OP *pChipOps = &pAd->chipOps; + + // Set LED + RTMPSetLED(pAd, LED_HALT); + RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, firmware is not done it. + + if (pChipOps->AsicHaltAction) + pChipOps->AsicHaltAction(pAd); + } + + RTMPusecDelay(5000); // 5 msec to gurantee Ant Diversity timer canceled + + MlmeQueueDestroy(&pAd->Mlme.Queue); + NdisFreeSpinLock(&pAd->Mlme.TaskLock); + + DBGPRINT(RT_DEBUG_TRACE, ("<== MlmeHalt\n")); +} + +VOID MlmeResetRalinkCounters( + IN PRTMP_ADAPTER pAd) +{ + pAd->RalinkCounters.LastOneSecRxOkDataCnt = pAd->RalinkCounters.OneSecRxOkDataCnt; + + + /* for performace enchanement */ + NdisZeroMemory(&pAd->RalinkCounters, + (UINT32)&pAd->RalinkCounters.OneSecEnd - + (UINT32)&pAd->RalinkCounters.OneSecStart); + + return; +} + + +/* + ========================================================================== + Description: + This routine is executed periodically to - + 1. Decide if it's a right time to turn on PwrMgmt bit of all + outgoiing frames + 2. Calculate ChannelQuality based on statistics of the last + period, so that TX rate won't toggling very frequently between a + successful TX and a failed TX. + 3. If the calculated ChannelQuality indicated current connection not + healthy, then a ROAMing attempt is tried here. + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +#define ADHOC_BEACON_LOST_TIME (8*OS_HZ) // 8 sec +VOID MlmePeriodicExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + ULONG TxTotalCnt; + PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)FunctionContext; + +#ifdef INF_AMAZON_SE + SoftwareFlowControl(pAd); +#endif // INF_AMAZON_SE // + +#ifdef CONFIG_STA_SUPPORT +#ifdef RTMP_MAC_PCI + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // If Hardware controlled Radio enabled, we have to check GPIO pin2 every 2 second. + // Move code to here, because following code will return when radio is off + if ((pAd->Mlme.PeriodicRound % (MLME_TASK_EXEC_MULTIPLE * 2) == 0) && (pAd->StaCfg.bHardwareRadio == TRUE) && + (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && + (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) + /*&&(pAd->bPCIclkOff == FALSE)*/) + { + UINT32 data = 0; + + // Read GPIO pin2 as Hardware controlled radio state +//#ifndef RT3090 + //RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data); +//#endif // RT3090 // +//KH(PCIE PS):Added based on Jane<-- +#ifdef PCIE_PS_SUPPORT +// Read GPIO pin2 as Hardware controlled radio state +// We need to Read GPIO if HW said so no mater what advance power saving +if ((pAd->OpMode == OPMODE_STA) && (IDLE_ON(pAd)) + && (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)) + && (pAd->StaCfg.PSControl.field.EnablePSinIdle == TRUE)) + { + // Want to make sure device goes to L0 state before reading register. + RTMPPCIeLinkCtrlValueRestore(pAd, 0); + RTMP_IO_FORCE_READ32(pAd, GPIO_CTRL_CFG, &data); + RTMPPCIeLinkCtrlSetting(pAd, 3); + } +else + RTMP_IO_FORCE_READ32(pAd, GPIO_CTRL_CFG, &data); +#else + RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data); +#endif // defined(RT3090) || defined(RT3592) || defined(RT3390) // +//KH(PCIE PS):Added based on Jane--> + + if (data & 0x04) + { + pAd->StaCfg.bHwRadio = TRUE; + } + else + { + pAd->StaCfg.bHwRadio = FALSE; + } + if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) + { + pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio); + if (pAd->StaCfg.bRadio == TRUE) + { + MlmeRadioOn(pAd); + // Update extra information + pAd->ExtraInfo = EXTRA_INFO_CLEAR; + } + else + { + MlmeRadioOff(pAd); + // Update extra information + pAd->ExtraInfo = HW_RADIO_OFF; + } + } + } + } +#endif // RTMP_MAC_PCI // +#endif // CONFIG_STA_SUPPORT // + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_HALT_IN_PROGRESS | + fRTMP_ADAPTER_RADIO_OFF | + fRTMP_ADAPTER_RADIO_MEASUREMENT | + fRTMP_ADAPTER_RESET_IN_PROGRESS | + fRTMP_ADAPTER_NIC_NOT_EXIST)))) + return; + + RTMP_MLME_PRE_SANITY_CHECK(pAd); + +#ifdef RALINK_ATE + /* Do not show RSSI until "Normal 1 second Mlme PeriodicExec". */ + if (ATE_ON(pAd)) + { + if (pAd->Mlme.PeriodicRound % MLME_TASK_EXEC_MULTIPLE != (MLME_TASK_EXEC_MULTIPLE - 1)) + { + pAd->Mlme.PeriodicRound ++; + return; + } + } +#endif // RALINK_ATE // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Do nothing if monitor mode is on + if (MONITOR_ON(pAd)) + return; + + if (pAd->Mlme.PeriodicRound & 0x1) + { + // This is the fix for wifi 11n extension channel overlapping test case. for 2860D + if (((pAd->MACVersion & 0xffff) == 0x0101) && + (STA_TGN_WIFI_ON(pAd)) && + (pAd->CommonCfg.IOTestParm.bToggle == FALSE)) + + { + RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x24Bf); + pAd->CommonCfg.IOTestParm.bToggle = TRUE; + } + else if ((STA_TGN_WIFI_ON(pAd)) && + ((pAd->MACVersion & 0xffff) == 0x0101)) + { + RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x243f); + pAd->CommonCfg.IOTestParm.bToggle = FALSE; + } + } + } +#endif // CONFIG_STA_SUPPORT // + + pAd->bUpdateBcnCntDone = FALSE; + +// RECBATimerTimeout(SystemSpecific1,FunctionContext,SystemSpecific2,SystemSpecific3); + pAd->Mlme.PeriodicRound ++; + + + // execute every 500ms + if ((pAd->Mlme.PeriodicRound % 5 == 0) && RTMPAutoRateSwitchCheck(pAd)/*(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED))*/) + { +#ifdef CONFIG_STA_SUPPORT + // perform dynamic tx rate switching based on past TX history + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) + ) + && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))) + MlmeDynamicTxRateSwitching(pAd); + } +#endif // CONFIG_STA_SUPPORT // + } + + // Normal 1 second Mlme PeriodicExec. + if (pAd->Mlme.PeriodicRound %MLME_TASK_EXEC_MULTIPLE == 0) + { + pAd->Mlme.OneSecPeriodicRound ++; + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + { + /* request from Baron : move this routine from later to here */ + /* for showing Rx error count in ATE RXFRAME */ + NICUpdateRawCounters(pAd); + if (pAd->ate.bRxFER == 1) + { + pAd->ate.RxTotalCnt += pAd->ate.RxCntPerSec; + ate_print(KERN_EMERG "MlmePeriodicExec: Rx packet cnt = %d/%d\n", pAd->ate.RxCntPerSec, pAd->ate.RxTotalCnt); + pAd->ate.RxCntPerSec = 0; + + if (pAd->ate.RxAntennaSel == 0) + ate_print(KERN_EMERG "MlmePeriodicExec: Rx AvgRssi0=%d, AvgRssi1=%d, AvgRssi2=%d\n\n", + pAd->ate.AvgRssi0, pAd->ate.AvgRssi1, pAd->ate.AvgRssi2); + else + ate_print(KERN_EMERG "MlmePeriodicExec: Rx AvgRssi=%d\n\n", pAd->ate.AvgRssi0); + } + MlmeResetRalinkCounters(pAd); + return; + } +#endif // RALINK_ATE // + + + + //ORIBATimerTimeout(pAd); + + // Media status changed, report to NDIS + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE)) + { + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE); + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) + { + pAd->IndicateMediaState = NdisMediaStateConnected; + RTMP_IndicateMediaState(pAd); + } + else + { + pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_IndicateMediaState(pAd); + } + } + + NdisGetSystemUpTime(&pAd->Mlme.Now32); + + // add the most up-to-date h/w raw counters into software variable, so that + // the dynamic tuning mechanism below are based on most up-to-date information + /* Hint: throughput impact is very serious in the function */ + NICUpdateRawCounters(pAd); + + +#ifdef DOT11_N_SUPPORT + // Need statistics after read counter. So put after NICUpdateRawCounters + ORIBATimerTimeout(pAd); +#endif // DOT11_N_SUPPORT // + + // if MGMT RING is full more than twice within 1 second, we consider there's + // a hardware problem stucking the TX path. In this case, try a hardware reset + // to recover the system + // if (pAd->RalinkCounters.MgmtRingFullCount >= 2) + // RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HARDWARE_ERROR); + // else + // pAd->RalinkCounters.MgmtRingFullCount = 0; + + // The time period for checking antenna is according to traffic + { + if (pAd->Mlme.bEnableAutoAntennaCheck) + { + TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + + pAd->RalinkCounters.OneSecTxRetryOkCount + + pAd->RalinkCounters.OneSecTxFailCount; + + // dynamic adjust antenna evaluation period according to the traffic + if (TxTotalCnt > 50) + { + if (pAd->Mlme.OneSecPeriodicRound % 10 == 0) + { + AsicEvaluateRxAnt(pAd); + } + } + else + { + if (pAd->Mlme.OneSecPeriodicRound % 3 == 0) + { + AsicEvaluateRxAnt(pAd); + } + } + } + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + STAMlmePeriodicExec(pAd); +#endif // CONFIG_STA_SUPPORT // + + MlmeResetRalinkCounters(pAd); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef RTMP_MAC_PCI + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) && (pAd->bPCIclkOff == FALSE)) +#endif // RTMP_MAC_PCI // + { + + + UINT32 MacReg = 0; + + RTMP_IO_READ32(pAd, 0x10F4, &MacReg); + if (((MacReg & 0x20000000) && (MacReg & 0x80)) || ((MacReg & 0x20000000) && (MacReg & 0x20))) + { + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1); + RTMPusecDelay(1); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xC); + + DBGPRINT(RT_DEBUG_WARN,("Warning, MAC specific condition occurs \n")); + } + } + } +#endif // CONFIG_STA_SUPPORT // + + RTMP_MLME_HANDLER(pAd); + } + + + pAd->bUpdateBcnCntDone = FALSE; +} + + +/* + ========================================================================== + Validate SSID for connection try and rescan purpose + Valid SSID will have visible chars only. + The valid length is from 0 to 32. + IRQL = DISPATCH_LEVEL + ========================================================================== + */ +BOOLEAN MlmeValidateSSID( + IN PUCHAR pSsid, + IN UCHAR SsidLen) +{ + int index; + + if (SsidLen > MAX_LEN_OF_SSID) + return (FALSE); + + // Check each character value + for (index = 0; index < SsidLen; index++) + { + if (pSsid[index] < 0x20) + return (FALSE); + } + + // All checked + return (TRUE); +} + +VOID MlmeSelectTxRateTable( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PUCHAR *ppTable, + IN PUCHAR pTableSize, + IN PUCHAR pInitTxRateIdx) +{ + + do + { + // decide the rate table for tuning + if (pAd->CommonCfg.TxRateTableSize > 0) + { + *ppTable = RateSwitchTable; + *pTableSize = RateSwitchTable[0]; + *pInitTxRateIdx = RateSwitchTable[1]; + + break; + } + +#ifdef CONFIG_STA_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && ADHOC_ON(pAd)) + { +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && + (pEntry->HTCapability.MCSSet[0] == 0xff) && + ((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1))) + {// 11N 1S Adhoc + *ppTable = RateSwitchTable11N1S; + *pTableSize = RateSwitchTable11N1S[0]; + *pInitTxRateIdx = RateSwitchTable11N1S[1]; + + } + else if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && + (pEntry->HTCapability.MCSSet[0] == 0xff) && + (pEntry->HTCapability.MCSSet[1] == 0xff) && + (pAd->Antenna.field.TxPath == 2)) + {// 11N 2S Adhoc + if (pAd->LatchRfRegs.Channel <= 14) + { + *ppTable = RateSwitchTable11N2S; + *pTableSize = RateSwitchTable11N2S[0]; + *pInitTxRateIdx = RateSwitchTable11N2S[1]; + } + else + { + *ppTable = RateSwitchTable11N2SForABand; + *pTableSize = RateSwitchTable11N2SForABand[0]; + *pInitTxRateIdx = RateSwitchTable11N2SForABand[1]; + } + + } + else +#endif // DOT11_N_SUPPORT // + if ((pEntry->RateLen == 4) +#ifdef DOT11_N_SUPPORT + && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0) +#endif // DOT11_N_SUPPORT // + ) + { + *ppTable = RateSwitchTable11B; + *pTableSize = RateSwitchTable11B[0]; + *pInitTxRateIdx = RateSwitchTable11B[1]; + + } + else if (pAd->LatchRfRegs.Channel <= 14) + { + *ppTable = RateSwitchTable11BG; + *pTableSize = RateSwitchTable11BG[0]; + *pInitTxRateIdx = RateSwitchTable11BG[1]; + + } + else + { + *ppTable = RateSwitchTable11G; + *pTableSize = RateSwitchTable11G[0]; + *pInitTxRateIdx = RateSwitchTable11G[1]; + + } + break; + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef DOT11_N_SUPPORT + //if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && + // ((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1))) + if (((pEntry->RateLen == 12) || (pAd->OpMode == OPMODE_STA)) && (pEntry->HTCapability.MCSSet[0] == 0xff) && + ((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1))) + {// 11BGN 1S AP + *ppTable = RateSwitchTable11BGN1S; + *pTableSize = RateSwitchTable11BGN1S[0]; + *pInitTxRateIdx = RateSwitchTable11BGN1S[1]; + + break; + } + + //else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 12) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && + // (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2)) + if (((pEntry->RateLen == 12) || (pAd->OpMode == OPMODE_STA)) && (pEntry->HTCapability.MCSSet[0] == 0xff) && + (pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->CommonCfg.TxStream == 2)) + {// 11BGN 2S AP + if (pAd->LatchRfRegs.Channel <= 14) + { + *ppTable = RateSwitchTable11BGN2S; + *pTableSize = RateSwitchTable11BGN2S[0]; + *pInitTxRateIdx = RateSwitchTable11BGN2S[1]; + + } + else + { + *ppTable = RateSwitchTable11BGN2SForABand; + *pTableSize = RateSwitchTable11BGN2SForABand[0]; + *pInitTxRateIdx = RateSwitchTable11BGN2SForABand[1]; + + } + break; + } + + + //else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && ((pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0x00) || (pAd->Antenna.field.TxPath == 1))) + if ((pEntry->HTCapability.MCSSet[0] == 0xff) && ((pEntry->HTCapability.MCSSet[1] == 0x00) || (pAd->CommonCfg.TxStream == 1))) + {// 11N 1S AP + *ppTable = RateSwitchTable11N1S; + *pTableSize = RateSwitchTable11N1S[0]; + *pInitTxRateIdx = RateSwitchTable11N1S[1]; + + break; + } + + //else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0xff) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0xff) && (pAd->Antenna.field.TxPath == 2)) + if ((pEntry->HTCapability.MCSSet[0] == 0xff) && (pEntry->HTCapability.MCSSet[1] == 0xff) && (pAd->CommonCfg.TxStream == 2)) + {// 11N 2S AP + if (pAd->LatchRfRegs.Channel <= 14) + { + *ppTable = RateSwitchTable11N2S; + *pTableSize = RateSwitchTable11N2S[0]; + *pInitTxRateIdx = RateSwitchTable11N2S[1]; + } + else + { + *ppTable = RateSwitchTable11N2SForABand; + *pTableSize = RateSwitchTable11N2SForABand[0]; + *pInitTxRateIdx = RateSwitchTable11N2SForABand[1]; + } + + break; + } + + +#endif // DOT11_N_SUPPORT // + //else if ((pAd->StaActive.SupRateLen == 4) && (pAd->StaActive.ExtRateLen == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) + if ((pEntry->RateLen == 4 || pAd->CommonCfg.PhyMode==PHY_11B) +#ifdef DOT11_N_SUPPORT + //Iverson mark for Adhoc b mode,sta will use rate 54 Mbps when connect with sta b/g/n mode + /* && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)*/ +#endif // DOT11_N_SUPPORT // + ) + {// B only AP + *ppTable = RateSwitchTable11B; + *pTableSize = RateSwitchTable11B[0]; + *pInitTxRateIdx = RateSwitchTable11B[1]; + + break; + } + + //else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen > 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) + if ((pEntry->RateLen > 8) +#ifdef DOT11_N_SUPPORT + && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0) +#endif // DOT11_N_SUPPORT // + ) + {// B/G mixed AP + *ppTable = RateSwitchTable11BG; + *pTableSize = RateSwitchTable11BG[0]; + *pInitTxRateIdx = RateSwitchTable11BG[1]; + + break; + } + + //else if ((pAd->StaActive.SupRateLen + pAd->StaActive.ExtRateLen == 8) && (pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) + if ((pEntry->RateLen == 8) +#ifdef DOT11_N_SUPPORT + && (pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0) +#endif // DOT11_N_SUPPORT // + ) + {// G only AP + *ppTable = RateSwitchTable11G; + *pTableSize = RateSwitchTable11G[0]; + *pInitTxRateIdx = RateSwitchTable11G[1]; + + break; + } +#ifdef DOT11_N_SUPPORT +#endif // DOT11_N_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef DOT11_N_SUPPORT + //else if ((pAd->StaActive.SupportedPhyInfo.MCSSet[0] == 0) && (pAd->StaActive.SupportedPhyInfo.MCSSet[1] == 0)) + if ((pEntry->HTCapability.MCSSet[0] == 0) && (pEntry->HTCapability.MCSSet[1] == 0)) +#endif // DOT11_N_SUPPORT // + { // Legacy mode + if (pAd->CommonCfg.MaxTxRate <= RATE_11) + { + *ppTable = RateSwitchTable11B; + *pTableSize = RateSwitchTable11B[0]; + *pInitTxRateIdx = RateSwitchTable11B[1]; + } + else if ((pAd->CommonCfg.MaxTxRate > RATE_11) && (pAd->CommonCfg.MinTxRate > RATE_11)) + { + *ppTable = RateSwitchTable11G; + *pTableSize = RateSwitchTable11G[0]; + *pInitTxRateIdx = RateSwitchTable11G[1]; + + } + else + { + *ppTable = RateSwitchTable11BG; + *pTableSize = RateSwitchTable11BG[0]; + *pInitTxRateIdx = RateSwitchTable11BG[1]; + } + break; + } +#ifdef DOT11_N_SUPPORT + if (pAd->LatchRfRegs.Channel <= 14) + { + if (pAd->CommonCfg.TxStream == 1) + { + *ppTable = RateSwitchTable11N1S; + *pTableSize = RateSwitchTable11N1S[0]; + *pInitTxRateIdx = RateSwitchTable11N1S[1]; + DBGPRINT_RAW(RT_DEBUG_ERROR,("DRS: unkown mode,default use 11N 1S AP \n")); + } + else + { + *ppTable = RateSwitchTable11N2S; + *pTableSize = RateSwitchTable11N2S[0]; + *pInitTxRateIdx = RateSwitchTable11N2S[1]; + } + } + else + { + if (pAd->CommonCfg.TxStream == 1) + { + *ppTable = RateSwitchTable11N1S; + *pTableSize = RateSwitchTable11N1S[0]; + *pInitTxRateIdx = RateSwitchTable11N1S[1]; + DBGPRINT_RAW(RT_DEBUG_ERROR,("DRS: unkown mode,default use 11N 1S AP \n")); + } + else + { + *ppTable = RateSwitchTable11N2SForABand; + *pTableSize = RateSwitchTable11N2SForABand[0]; + *pInitTxRateIdx = RateSwitchTable11N2SForABand[1]; + } + } +#endif // DOT11_N_SUPPORT // + DBGPRINT_RAW(RT_DEBUG_ERROR,("DRS: unkown mode (SupRateLen=%d, ExtRateLen=%d, MCSSet[0]=0x%x, MCSSet[1]=0x%x)\n", + pAd->StaActive.SupRateLen, pAd->StaActive.ExtRateLen, pAd->StaActive.SupportedPhyInfo.MCSSet[0], pAd->StaActive.SupportedPhyInfo.MCSSet[1])); + } +#endif // CONFIG_STA_SUPPORT // + } while(FALSE); + +} + + +#ifdef CONFIG_STA_SUPPORT +VOID STAMlmePeriodicExec( + PRTMP_ADAPTER pAd) +{ + ULONG TxTotalCnt; + int i; + + + /* + We return here in ATE mode, because the statistics + that ATE need are not collected via this routine. + */ +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) +#endif // WPA_SUPPLICANT_SUPPORT // + { + // WPA MIC error should block association attempt for 60 seconds + if (pAd->StaCfg.bBlockAssoc && + RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastMicErrorTime + (60*OS_HZ))) + pAd->StaCfg.bBlockAssoc = FALSE; + } + + if (pAd->PreMediaState != pAd->IndicateMediaState) + { + if (pAd->IndicateMediaState == NdisMediaStateConnected) + { + RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, NULL, BSS0, 0); + } + pAd->PreMediaState = pAd->IndicateMediaState; + } + + + + + if (ADHOC_ON(pAd)) + { + } + else + { + AsicStaBbpTuning(pAd); + } + + TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + + pAd->RalinkCounters.OneSecTxRetryOkCount + + pAd->RalinkCounters.OneSecTxFailCount; + + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) + { + // update channel quality for Roaming and UI LinkQuality display + MlmeCalculateChannelQuality(pAd, NULL, pAd->Mlme.Now32); + } + + // must be AFTER MlmeDynamicTxRateSwitching() because it needs to know if + // Radio is currently in noisy environment + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + AsicAdjustTxPower(pAd); + + /* + Driver needs to up date value of LastOneSecTotalTxCount here; + otherwise UI couldn't do scanning sometimes when STA doesn't connect to AP or peer Ad-Hoc. + */ + pAd->RalinkCounters.LastOneSecTotalTxCount = TxTotalCnt; + + if (INFRA_ON(pAd)) + { +#ifdef QOS_DLS_SUPPORT + // Check DLS time out, then tear down those session + RTMPCheckDLSTimeOut(pAd); +#endif // QOS_DLS_SUPPORT // + + + // Is PSM bit consistent with user power management policy? + // This is the only place that will set PSM bit ON. + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + MlmeCheckPsmChange(pAd, pAd->Mlme.Now32); + + /* + When we are connected and do the scan progress, it's very possible we cannot receive + the beacon of the AP. So, here we simulate that we received the beacon. + */ + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) && + (RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastBeaconRxTime + (1*OS_HZ)))) + { + ULONG BPtoJiffies; + LONG timeDiff; + + BPtoJiffies = (((pAd->CommonCfg.BeaconPeriod * 1024 / 1000) * OS_HZ) / 1000); + timeDiff = (pAd->Mlme.Now32 - pAd->StaCfg.LastBeaconRxTime) / BPtoJiffies; + if (timeDiff > 0) + pAd->StaCfg.LastBeaconRxTime += (timeDiff * BPtoJiffies); + + if (RTMP_TIME_AFTER(pAd->StaCfg.LastBeaconRxTime, pAd->Mlme.Now32)) + { + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - BeaconRxTime adjust wrong(BeaconRx=0x%lx, Now=0x%lx)\n", + pAd->StaCfg.LastBeaconRxTime, pAd->Mlme.Now32)); + } + } + + if ((RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastBeaconRxTime + (1*OS_HZ))) && + (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) && + (((TxTotalCnt + pAd->RalinkCounters.OneSecRxOkCnt) < 600))) + { + RTMPSetAGCInitValue(pAd, BW_20); + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - No BEACON. restore R66 to the low bound(%d) \n", (0x2E + GET_LNA_GAIN(pAd)))); + } + + //if ((pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) && + // (pAd->RalinkCounters.OneSecTxRetryOkCount == 0)) + if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))) + { + if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable) + { + // When APSD is enabled, the period changes as 20 sec + if ((pAd->Mlme.OneSecPeriodicRound % 20) == 8) + { + RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE); + } + } + else + { + // Send out a NULL frame every 10 sec to inform AP that STA is still alive (Avoid being age out) + if ((pAd->Mlme.OneSecPeriodicRound % 10) == 8) + { + RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, pAd->CommonCfg.bWmmCapable); + } + } + } + + if (CQI_IS_DEAD(pAd->Mlme.ChannelQuality)) + { + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - No BEACON. Dead CQI. Auto Recovery attempt #%ld\n", pAd->RalinkCounters.BadCQIAutoRecoveryCount)); + +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) && + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)) + pAd->StaCfg.bLostAp = TRUE; +#endif // WPA_SUPPLICANT_SUPPORT // + + pAd->MlmeAux.CurrReqIsFromNdis = FALSE; + // Lost AP, send disconnect & link down event + LinkDown(pAd, FALSE); + + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + //send disassociate event to wpa_supplicant + if (pAd->StaCfg.WpaSupplicantUP) + { + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_DISASSOC_EVENT_FLAG, NULL, NULL, 0); + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + + // RTMPPatchMacBbpBug(pAd); + MlmeAutoReconnectLastSSID(pAd); + } + else if (CQI_IS_BAD(pAd->Mlme.ChannelQuality)) + { + pAd->RalinkCounters.BadCQIAutoRecoveryCount ++; + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Bad CQI. Auto Recovery attempt #%ld\n", pAd->RalinkCounters.BadCQIAutoRecoveryCount)); + MlmeAutoReconnectLastSSID(pAd); + } + + if (pAd->StaCfg.bAutoRoaming) + { + BOOLEAN rv = FALSE; + CHAR dBmToRoam = pAd->StaCfg.dBmToRoam; + CHAR MaxRssi = RTMPMaxRssi(pAd, + pAd->StaCfg.RssiSample.LastRssi0, + pAd->StaCfg.RssiSample.LastRssi1, + pAd->StaCfg.RssiSample.LastRssi2); + + // Scanning, ignore Roaming + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) && + (pAd->Mlme.SyncMachine.CurrState == SYNC_IDLE) && + (MaxRssi <= dBmToRoam)) + { + DBGPRINT(RT_DEBUG_TRACE, ("Rssi=%d, dBmToRoam=%d\n", MaxRssi, (CHAR)dBmToRoam)); + + + // Add auto seamless roaming + if (rv == FALSE) + rv = MlmeCheckForFastRoaming(pAd); + + if (rv == FALSE) + { + if ((pAd->StaCfg.LastScanTime + 10 * OS_HZ) < pAd->Mlme.Now32) + { + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Roaming, No eligable entry, try new scan!\n")); + pAd->StaCfg.ScanCnt = 2; + pAd->StaCfg.LastScanTime = pAd->Mlme.Now32; + MlmeAutoScan(pAd); + } + } + } + } + } + else if (ADHOC_ON(pAd)) + { + + // If all peers leave, and this STA becomes the last one in this IBSS, then change MediaState + // to DISCONNECTED. But still holding this IBSS (i.e. sending BEACON) so that other STAs can + // join later. + if ((RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastBeaconRxTime + ADHOC_BEACON_LOST_TIME) + || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) + { + + for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) + { + MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[i]; + + if (!IS_ENTRY_CLIENT(pEntry)) + continue; + + if (RTMP_TIME_AFTER(pAd->Mlme.Now32, pEntry->LastBeaconRxTime + ADHOC_BEACON_LOST_TIME)) + MlmeDeAuthAction(pAd, pEntry, REASON_DISASSOC_STA_LEAVING, FALSE); + } + + if (pAd->MacTab.Size == 0) + { + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_IndicateMediaState(pAd); + } + pAd->StaCfg.LastScanTime = pAd->Mlme.Now32; + } + + } + else // no INFRA nor ADHOC connection + { + +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP & 0x80) + goto SKIP_AUTO_SCAN_CONN; +#endif // WPA_SUPPLICANT_SUPPORT // + + if (pAd->StaCfg.bScanReqIsFromWebUI && + RTMP_TIME_BEFORE(pAd->Mlme.Now32, pAd->StaCfg.LastScanTime + (30 * OS_HZ))) + goto SKIP_AUTO_SCAN_CONN; + else + pAd->StaCfg.bScanReqIsFromWebUI = FALSE; + + if ((pAd->StaCfg.bAutoReconnect == TRUE) + && RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP) + && (MlmeValidateSSID(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen) == TRUE)) + { + if ((pAd->ScanTab.BssNr==0) && (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE)) + { + MLME_SCAN_REQ_STRUCT ScanReq; + + if (RTMP_TIME_AFTER(pAd->Mlme.Now32, pAd->StaCfg.LastScanTime + (10 * OS_HZ)) + ||(pAd->StaCfg.bNotFirstScan == FALSE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("STAMlmePeriodicExec():CNTL - ScanTab.BssNr==0, start a new ACTIVE scan SSID[%s]\n", pAd->MlmeAux.AutoReconnectSsid)); + pAd->StaCfg.bNotFirstScan = TRUE; + ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen, BSS_ANY, SCAN_ACTIVE); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; + // Reset Missed scan number + pAd->StaCfg.LastScanTime = pAd->Mlme.Now32; + } + else if (pAd->StaCfg.BssType == BSS_ADHOC) // Quit the forever scan when in a very clean room + MlmeAutoReconnectLastSSID(pAd); + } + else if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) + { +#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier + if (pAd->CommonCfg.CarrierDetect.Enable == TRUE) + { + if ((pAd->Mlme.OneSecPeriodicRound % 5) == 1) + MlmeAutoReconnectLastSSID(pAd); + } + else +#endif // CARRIER_DETECTION_SUPPORT // + MlmeAutoReconnectLastSSID(pAd); + } + } + } + +SKIP_AUTO_SCAN_CONN: + +#ifdef DOT11_N_SUPPORT + if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap !=0) && (pAd->MacTab.fAnyBASession == FALSE)) + { + pAd->MacTab.fAnyBASession = TRUE; + AsicUpdateProtect(pAd, HT_FORCERTSCTS, ALLN_SETPROTECT, FALSE, FALSE); + } + else if ((pAd->MacTab.Content[BSSID_WCID].TXBAbitmap ==0) && (pAd->MacTab.fAnyBASession == TRUE)) + { + pAd->MacTab.fAnyBASession = FALSE; + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, FALSE); + } +#endif // DOT11_N_SUPPORT // + + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + // Perform 20/40 BSS COEX scan every Dot11BssWidthTriggerScanInt + if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040)) && + (pAd->CommonCfg.Dot11BssWidthTriggerScanInt != 0) && + ((pAd->Mlme.OneSecPeriodicRound % pAd->CommonCfg.Dot11BssWidthTriggerScanInt) == (pAd->CommonCfg.Dot11BssWidthTriggerScanInt-1))) + { + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - LastOneSecTotalTxCount/LastOneSecRxOkDataCnt = %d/%d \n", + pAd->RalinkCounters.LastOneSecTotalTxCount, + pAd->RalinkCounters.LastOneSecRxOkDataCnt)); + + // Check last scan time at least 30 seconds from now. + // Check traffic is less than about 1.5~2Mbps. + // it might cause data lost if we enqueue scanning. + // This criteria needs to be considered + if ((pAd->RalinkCounters.LastOneSecTotalTxCount < 70) && (pAd->RalinkCounters.LastOneSecRxOkDataCnt < 70) + /*&& ((pAd->StaCfg.LastScanTime + 10 * OS_HZ) < pAd->Mlme.Now32) */) + { + MLME_SCAN_REQ_STRUCT ScanReq; + // Fill out stuff for scan request and kick to scan + ScanParmFill(pAd, &ScanReq, ZeroSsid, 0, BSS_ANY, SCAN_2040_BSS_COEXIST); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; + // Set InfoReq = 1, So after scan , alwats sebd 20/40 Coexistence frame to AP + pAd->CommonCfg.BSSCoexist2040.field.InfoReq = 1; + RTMP_MLME_HANDLER(pAd); + } + + DBGPRINT(RT_DEBUG_TRACE, (" LastOneSecTotalTxCount/LastOneSecRxOkDataCnt = %d/%d \n", + pAd->RalinkCounters.LastOneSecTotalTxCount, + pAd->RalinkCounters.LastOneSecRxOkDataCnt)); + } +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + + return; +} + +// Link down report +VOID LinkDownExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + + if (pAd != NULL) + { + MLME_DISASSOC_REQ_STRUCT DisassocReq; + + if ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) && + (INFRA_ON(pAd))) + { + DBGPRINT(RT_DEBUG_TRACE, ("LinkDownExec(): disassociate with current AP...\n")); + DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, + sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; + + pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_IndicateMediaState(pAd); + pAd->ExtraInfo = GENERAL_LINK_DOWN; + } + } +} + +// IRQL = DISPATCH_LEVEL +VOID MlmeAutoScan( + IN PRTMP_ADAPTER pAd) +{ + // check CntlMachine.CurrState to avoid collision with NDIS SetOID request + if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) + { + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Driver auto scan\n")); + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_BSSID_LIST_SCAN, + pAd->MlmeAux.AutoReconnectSsidLen, + pAd->MlmeAux.AutoReconnectSsid, 0); + RTMP_MLME_HANDLER(pAd); + } +} + +// IRQL = DISPATCH_LEVEL +VOID MlmeAutoReconnectLastSSID( + IN PRTMP_ADAPTER pAd) +{ + if (pAd->StaCfg.bAutoConnectByBssid) + { + DBGPRINT(RT_DEBUG_TRACE, ("Driver auto reconnect to last OID_802_11_BSSID setting - %02X:%02X:%02X:%02X:%02X:%02X\n", + pAd->MlmeAux.Bssid[0], + pAd->MlmeAux.Bssid[1], + pAd->MlmeAux.Bssid[2], + pAd->MlmeAux.Bssid[3], + pAd->MlmeAux.Bssid[4], + pAd->MlmeAux.Bssid[5])); + + pAd->MlmeAux.Channel = pAd->CommonCfg.Channel; + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_BSSID, + MAC_ADDR_LEN, + pAd->MlmeAux.Bssid, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + + RTMP_MLME_HANDLER(pAd); + } + // check CntlMachine.CurrState to avoid collision with NDIS SetOID request + else if ((pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) && + (MlmeValidateSSID(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen) == TRUE)) + { + NDIS_802_11_SSID OidSsid; + OidSsid.SsidLength = pAd->MlmeAux.AutoReconnectSsidLen; + NdisMoveMemory(OidSsid.Ssid, pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); + + DBGPRINT(RT_DEBUG_TRACE, ("Driver auto reconnect to last OID_802_11_SSID setting - %s, len - %d\n", pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen)); + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_SSID, + sizeof(NDIS_802_11_SSID), + &OidSsid, 0); + RTMP_MLME_HANDLER(pAd); + } +} + + +/* + ========================================================================== + Description: + This routine checks if there're other APs out there capable for + roaming. Caller should call this routine only when Link up in INFRA mode + and channel quality is below CQI_GOOD_THRESHOLD. + + IRQL = DISPATCH_LEVEL + + Output: + ========================================================================== + */ +VOID MlmeCheckForRoaming( + IN PRTMP_ADAPTER pAd, + IN ULONG Now32) +{ + USHORT i; + BSS_TABLE *pRoamTab = &pAd->MlmeAux.RoamTab; + BSS_ENTRY *pBss; + + DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeCheckForRoaming\n")); + // put all roaming candidates into RoamTab, and sort in RSSI order + BssTableInit(pRoamTab); + for (i = 0; i < pAd->ScanTab.BssNr; i++) + { + pBss = &pAd->ScanTab.BssEntry[i]; + + if ((pBss->LastBeaconRxTime + pAd->StaCfg.BeaconLostTime) < Now32) + continue; // AP disappear + if (pBss->Rssi <= RSSI_THRESHOLD_FOR_ROAMING) + continue; // RSSI too weak. forget it. + if (MAC_ADDR_EQUAL(pBss->Bssid, pAd->CommonCfg.Bssid)) + continue; // skip current AP + if (pBss->Rssi < (pAd->StaCfg.RssiSample.LastRssi0 + RSSI_DELTA)) + continue; // only AP with stronger RSSI is eligible for roaming + + // AP passing all above rules is put into roaming candidate table + NdisMoveMemory(&pRoamTab->BssEntry[pRoamTab->BssNr], pBss, sizeof(BSS_ENTRY)); + pRoamTab->BssNr += 1; + } + + if (pRoamTab->BssNr > 0) + { + // check CntlMachine.CurrState to avoid collision with NDIS SetOID request + if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) + { + pAd->RalinkCounters.PoorCQIRoamingCount ++; + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Roaming attempt #%ld\n", pAd->RalinkCounters.PoorCQIRoamingCount)); + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_MLME_ROAMING_REQ, 0, NULL, 0); + RTMP_MLME_HANDLER(pAd); + } + } + DBGPRINT(RT_DEBUG_TRACE, ("<== MlmeCheckForRoaming(# of candidate= %d)\n",pRoamTab->BssNr)); +} + +/* + ========================================================================== + Description: + This routine checks if there're other APs out there capable for + roaming. Caller should call this routine only when link up in INFRA mode + and channel quality is below CQI_GOOD_THRESHOLD. + + IRQL = DISPATCH_LEVEL + + Output: + ========================================================================== + */ +BOOLEAN MlmeCheckForFastRoaming( + IN PRTMP_ADAPTER pAd) +{ + USHORT i; + BSS_TABLE *pRoamTab = &pAd->MlmeAux.RoamTab; + BSS_ENTRY *pBss; + + DBGPRINT(RT_DEBUG_TRACE, ("==> MlmeCheckForFastRoaming\n")); + // put all roaming candidates into RoamTab, and sort in RSSI order + BssTableInit(pRoamTab); + for (i = 0; i < pAd->ScanTab.BssNr; i++) + { + pBss = &pAd->ScanTab.BssEntry[i]; + + if ((pBss->Rssi <= -50) && (pBss->Channel == pAd->CommonCfg.Channel)) + continue; // RSSI too weak. forget it. + if (MAC_ADDR_EQUAL(pBss->Bssid, pAd->CommonCfg.Bssid)) + continue; // skip current AP + if (!SSID_EQUAL(pBss->Ssid, pBss->SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen)) + continue; // skip different SSID + if (pBss->Rssi < (RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2) + RSSI_DELTA)) + continue; // skip AP without better RSSI + + DBGPRINT(RT_DEBUG_TRACE, ("LastRssi0 = %d, pBss->Rssi = %d\n", RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, pAd->StaCfg.RssiSample.LastRssi1, pAd->StaCfg.RssiSample.LastRssi2), pBss->Rssi)); + // AP passing all above rules is put into roaming candidate table + NdisMoveMemory(&pRoamTab->BssEntry[pRoamTab->BssNr], pBss, sizeof(BSS_ENTRY)); + pRoamTab->BssNr += 1; + } + + DBGPRINT(RT_DEBUG_TRACE, ("<== MlmeCheckForFastRoaming (BssNr=%d)\n", pRoamTab->BssNr)); + if (pRoamTab->BssNr > 0) + { + // check CntlMachine.CurrState to avoid collision with NDIS SetOID request + if (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) + { + pAd->RalinkCounters.PoorCQIRoamingCount ++; + DBGPRINT(RT_DEBUG_TRACE, ("MMCHK - Roaming attempt #%ld\n", pAd->RalinkCounters.PoorCQIRoamingCount)); + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_MLME_ROAMING_REQ, 0, NULL, 0); + RTMP_MLME_HANDLER(pAd); + return TRUE; + } + } + + return FALSE; +} + +VOID MlmeSetTxRate( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PRTMP_TX_RATE_SWITCH pTxRate) +{ + UCHAR MaxMode = MODE_OFDM; + +#ifdef DOT11_N_SUPPORT + MaxMode = MODE_HTGREENFIELD; + + if (pTxRate->STBC && (pAd->StaCfg.MaxHTPhyMode.field.STBC) && (pAd->Antenna.field.TxPath == 2)) + pAd->StaCfg.HTPhyMode.field.STBC = STBC_USE; + else +#endif // DOT11_N_SUPPORT // + pAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE; + + if (pTxRate->CurrMCS < MCS_AUTO) + pAd->StaCfg.HTPhyMode.field.MCS = pTxRate->CurrMCS; + + if (pAd->StaCfg.HTPhyMode.field.MCS > 7) + pAd->StaCfg.HTPhyMode.field.STBC = STBC_NONE; + + if (ADHOC_ON(pAd)) + { + // If peer adhoc is b-only mode, we can't send 11g rate. + pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800; + pEntry->HTPhyMode.field.STBC = STBC_NONE; + + // + // For Adhoc MODE_CCK, driver will use AdhocBOnlyJoined flag to roll back to B only if necessary + // + pEntry->HTPhyMode.field.MODE = pTxRate->Mode; + pEntry->HTPhyMode.field.ShortGI = pAd->StaCfg.HTPhyMode.field.ShortGI; + pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + + // Patch speed error in status page + pAd->StaCfg.HTPhyMode.field.MODE = pEntry->HTPhyMode.field.MODE; + } + else + { +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.RegTransmitSetting.field.HTMODE == HTMODE_GF) && + (pAd->MlmeAux.HtCapability.HtCapInfo.GF == HTMODE_GF)) + pAd->StaCfg.HTPhyMode.field.MODE = MODE_HTGREENFIELD; + else +#endif // DOT11_N_SUPPORT // + if (pTxRate->Mode <= MaxMode) + pAd->StaCfg.HTPhyMode.field.MODE = pTxRate->Mode; + +#ifdef DOT11_N_SUPPORT + if (pTxRate->ShortGI && (pAd->StaCfg.MaxHTPhyMode.field.ShortGI)) + pAd->StaCfg.HTPhyMode.field.ShortGI = GI_400; + else +#endif // DOT11_N_SUPPORT // + pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800; + +#ifdef DOT11_N_SUPPORT + // Reexam each bandwidth's SGI support. + if (pAd->StaCfg.HTPhyMode.field.ShortGI == GI_400) + { + if ((pEntry->HTPhyMode.field.BW == BW_20) && (!CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE))) + pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800; + if ((pEntry->HTPhyMode.field.BW == BW_40) && (!CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE))) + pAd->StaCfg.HTPhyMode.field.ShortGI = GI_800; + } + + // Turn RTS/CTS rate to 6Mbps. + if ((pEntry->HTPhyMode.field.MCS == 0) && (pAd->StaCfg.HTPhyMode.field.MCS != 0)) + { + pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + if (pAd->MacTab.fAnyBASession) + { + AsicUpdateProtect(pAd, HT_FORCERTSCTS, ALLN_SETPROTECT, TRUE, (BOOLEAN)pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent); + } + else + { + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, TRUE, (BOOLEAN)pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent); + } + } + else if ((pEntry->HTPhyMode.field.MCS == 8) && (pAd->StaCfg.HTPhyMode.field.MCS != 8)) + { + pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + if (pAd->MacTab.fAnyBASession) + { + AsicUpdateProtect(pAd, HT_FORCERTSCTS, ALLN_SETPROTECT, TRUE, (BOOLEAN)pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent); + } + else + { + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, TRUE, (BOOLEAN)pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent); + } + } + else if ((pEntry->HTPhyMode.field.MCS != 0) && (pAd->StaCfg.HTPhyMode.field.MCS == 0)) + { + AsicUpdateProtect(pAd, HT_RTSCTS_6M, ALLN_SETPROTECT, TRUE, (BOOLEAN)pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent); + + } + else if ((pEntry->HTPhyMode.field.MCS != 8) && (pAd->StaCfg.HTPhyMode.field.MCS == 8)) + { + AsicUpdateProtect(pAd, HT_RTSCTS_6M, ALLN_SETPROTECT, TRUE, (BOOLEAN)pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent); + } +#endif // DOT11_N_SUPPORT // + + pEntry->HTPhyMode.field.STBC = pAd->StaCfg.HTPhyMode.field.STBC; + pEntry->HTPhyMode.field.ShortGI = pAd->StaCfg.HTPhyMode.field.ShortGI; + pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE; + } + + pAd->LastTxRate = (USHORT)(pEntry->HTPhyMode.word); +} + +/* + ========================================================================== + Description: + This routine calculates the acumulated TxPER of eaxh TxRate. And + according to the calculation result, change CommonCfg.TxRate which + is the stable TX Rate we expect the Radio situation could sustained. + + CommonCfg.TxRate will change dynamically within {RATE_1/RATE_6, MaxTxRate} + Output: + CommonCfg.TxRate - + + IRQL = DISPATCH_LEVEL + + NOTE: + call this routine every second + ========================================================================== + */ +VOID MlmeDynamicTxRateSwitching( + IN PRTMP_ADAPTER pAd) +{ + UCHAR UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx; + ULONG i, AccuTxTotalCnt = 0, TxTotalCnt; + ULONG TxErrorRatio = 0; + BOOLEAN bTxRateChanged = FALSE, bUpgradeQuality = FALSE; + PRTMP_TX_RATE_SWITCH pCurrTxRate, pNextTxRate = NULL; + PUCHAR pTable; + UCHAR TableSize = 0; + UCHAR InitTxRateIdx = 0, TrainUp, TrainDown; + CHAR Rssi, RssiOffset = 0; + TX_STA_CNT1_STRUC StaTx1; + TX_STA_CNT0_STRUC TxStaCnt0; + ULONG TxRetransmit = 0, TxSuccess = 0, TxFailCount = 0; + MAC_TABLE_ENTRY *pEntry; + RSSI_SAMPLE *pRssi = &pAd->StaCfg.RssiSample; + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + { + return; + } +#endif // RALINK_ATE // + + // Update statistic counter + RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word); + RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word); + pAd->bUpdateBcnCntDone = TRUE; + TxRetransmit = StaTx1.field.TxRetransmit; + TxSuccess = StaTx1.field.TxSuccess; + TxFailCount = TxStaCnt0.field.TxFailCount; + TxTotalCnt = TxRetransmit + TxSuccess + TxFailCount; + + pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit; + pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess; + pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount; + +#ifdef STATS_COUNT_SUPPORT + pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess; + pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit; + pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount; +#endif // STATS_COUNT_SUPPORT // + + // + // walk through MAC table, see if need to change AP's TX rate toward each entry + // + for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) + { + pEntry = &pAd->MacTab.Content[i]; + + // check if this entry need to switch rate automatically + if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE) + continue; + + if ((pAd->MacTab.Size == 1) || IS_ENTRY_DLS(pEntry)) + { + Rssi = RTMPMaxRssi(pAd, + pRssi->AvgRssi0, + pRssi->AvgRssi1, + pRssi->AvgRssi2); + + // if no traffic in the past 1-sec period, don't change TX rate, + // but clear all bad history. because the bad history may affect the next + // Chariot throughput test + AccuTxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + + pAd->RalinkCounters.OneSecTxRetryOkCount + + pAd->RalinkCounters.OneSecTxFailCount; + + if (TxTotalCnt) + TxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt; + } + else + { + if (INFRA_ON(pAd) && (i == 1)) + Rssi = RTMPMaxRssi(pAd, + pRssi->AvgRssi0, + pRssi->AvgRssi1, + pRssi->AvgRssi2); + else + Rssi = RTMPMaxRssi(pAd, + pEntry->RssiSample.AvgRssi0, + pEntry->RssiSample.AvgRssi1, + pEntry->RssiSample.AvgRssi2); + + TxTotalCnt = pEntry->OneSecTxNoRetryOkCount + + pEntry->OneSecTxRetryOkCount + + pEntry->OneSecTxFailCount; + + if (TxTotalCnt) + TxErrorRatio = ((pEntry->OneSecTxRetryOkCount + pEntry->OneSecTxFailCount) * 100) / TxTotalCnt; + } + + if (TxTotalCnt) + { + /* + Three AdHoc connections can not work normally if one AdHoc connection is disappeared from a heavy traffic environment generated by ping tool + We force to set LongRtyLimit and ShortRtyLimit to 0 to stop retransmitting packet, after a while, resoring original settings + */ + if (TxErrorRatio == 100) + { + TX_RTY_CFG_STRUC TxRtyCfg,TxRtyCfgtmp; + ULONG Index; + ULONG MACValue; + + RTMP_IO_READ32(pAd, TX_RTY_CFG, &TxRtyCfg.word); + TxRtyCfgtmp.word = TxRtyCfg.word; + TxRtyCfg.field.LongRtyLimit = 0x0; + TxRtyCfg.field.ShortRtyLimit = 0x0; + RTMP_IO_WRITE32(pAd, TX_RTY_CFG, TxRtyCfg.word); + + RTMPusecDelay(1); + + Index = 0; + MACValue = 0; + do + { + RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue); + if ((MACValue & 0xffffff) == 0) + break; + Index++; + RTMPusecDelay(1000); + }while((Index < 330)&&(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))); + + RTMP_IO_READ32(pAd, TX_RTY_CFG, &TxRtyCfg.word); + TxRtyCfg.field.LongRtyLimit = TxRtyCfgtmp.field.LongRtyLimit; + TxRtyCfg.field.ShortRtyLimit = TxRtyCfgtmp.field.ShortRtyLimit; + RTMP_IO_WRITE32(pAd, TX_RTY_CFG, TxRtyCfg.word); + } + } + + CurrRateIdx = pEntry->CurrTxRateIndex; + + MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &InitTxRateIdx); + + if (CurrRateIdx >= TableSize) + { + CurrRateIdx = TableSize - 1; + } + + // When switch from Fixed rate -> auto rate, the REAL TX rate might be different from pAd->CommonCfg.TxRateIndex. + // So need to sync here. + pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(CurrRateIdx+1)*5]; + if ((pEntry->HTPhyMode.field.MCS != pCurrTxRate->CurrMCS) + //&& (pAd->StaCfg.bAutoTxRateSwitch == TRUE) + ) + { + + // Need to sync Real Tx rate and our record. + // Then return for next DRS. + pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(InitTxRateIdx+1)*5]; + pEntry->CurrTxRateIndex = InitTxRateIdx; + MlmeSetTxRate(pAd, pEntry, pCurrTxRate); + + // reset all OneSecTx counters + RESET_ONE_SEC_TX_CNT(pEntry); + continue; + } + + // decide the next upgrade rate and downgrade rate, if any + if ((CurrRateIdx > 0) && (CurrRateIdx < (TableSize - 1))) + { + UpRateIdx = CurrRateIdx + 1; + DownRateIdx = CurrRateIdx -1; + } + else if (CurrRateIdx == 0) + { + UpRateIdx = CurrRateIdx + 1; + DownRateIdx = CurrRateIdx; + } + else if (CurrRateIdx == (TableSize - 1)) + { + UpRateIdx = CurrRateIdx; + DownRateIdx = CurrRateIdx - 1; + } + + pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(CurrRateIdx+1)*5]; + +#ifdef DOT11_N_SUPPORT + if ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX)) + { + TrainUp = (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1)); + TrainDown = (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1)); + } + else +#endif // DOT11_N_SUPPORT // + { + TrainUp = pCurrTxRate->TrainUp; + TrainDown = pCurrTxRate->TrainDown; + } + + //pAd->DrsCounters.LastTimeTxRateChangeAction = pAd->DrsCounters.LastSecTxRateChangeAction; + + // + // Keep the last time TxRateChangeAction status. + // + pEntry->LastTimeTxRateChangeAction = pEntry->LastSecTxRateChangeAction; + + + + // + // CASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI + // (criteria copied from RT2500 for Netopia case) + // + if (TxTotalCnt <= 15) + { + CHAR idx = 0; + UCHAR TxRateIdx; + UCHAR MCS0 = 0, MCS1 = 0, MCS2 = 0, MCS3 = 0, MCS4 = 0, MCS5 =0, MCS6 = 0, MCS7 = 0; + UCHAR MCS12 = 0, MCS13 = 0, MCS14 = 0, MCS15 = 0; + UCHAR MCS20 = 0, MCS21 = 0, MCS22 = 0, MCS23 = 0; // 3*3 + + // check the existence and index of each needed MCS + while (idx < pTable[0]) + { + pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(idx+1)*5]; + + if (pCurrTxRate->CurrMCS == MCS_0) + { + MCS0 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_1) + { + MCS1 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_2) + { + MCS2 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_3) + { + MCS3 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_4) + { + MCS4 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_5) + { + MCS5 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_6) + { + MCS6 = idx; + } + //else if (pCurrTxRate->CurrMCS == MCS_7) + else if ((pCurrTxRate->CurrMCS == MCS_7) && (pCurrTxRate->ShortGI == GI_800)) // prevent the highest MCS using short GI when 1T and low throughput + { + MCS7 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_12) + { + MCS12 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_13) + { + MCS13 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_14) + { + MCS14 = idx; + } + //else if ((pCurrTxRate->CurrMCS == MCS_15)/* && (pCurrTxRate->ShortGI == GI_800)*/) //we hope to use ShortGI as initial rate + else if ((pCurrTxRate->CurrMCS == MCS_15) && (pCurrTxRate->ShortGI == GI_800)) //we hope to use ShortGI as initial rate, however Atheros's chip has bugs when short GI + { + MCS15 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_20) // 3*3 + { + MCS20 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_21) + { + MCS21 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_22) + { + MCS22 = idx; + } + else if (pCurrTxRate->CurrMCS == MCS_23) + { + MCS23 = idx; + } + idx ++; + } + + if (pAd->LatchRfRegs.Channel <= 14) + { + if (pAd->NicConfig2.field.ExternalLNAForG) + { + RssiOffset = 2; + } + else + { + RssiOffset = 5; + } + } + else + { + if (pAd->NicConfig2.field.ExternalLNAForA) + { + RssiOffset = 5; + } + else + { + RssiOffset = 8; + } + } +#ifdef DOT11_N_SUPPORT + /*if (MCS15)*/ + if ((pTable == RateSwitchTable11BGN3S) || + (pTable == RateSwitchTable11N3S) || + (pTable == RateSwitchTable)) + {// N mode with 3 stream // 3*3 + if (MCS23 && (Rssi >= -70)) + TxRateIdx = MCS23; + else if (MCS22 && (Rssi >= -72)) + TxRateIdx = MCS22; + else if (MCS21 && (Rssi >= -76)) + TxRateIdx = MCS21; + else if (MCS20 && (Rssi >= -78)) + TxRateIdx = MCS20; + else if (MCS4 && (Rssi >= -82)) + TxRateIdx = MCS4; + else if (MCS3 && (Rssi >= -84)) + TxRateIdx = MCS3; + else if (MCS2 && (Rssi >= -86)) + TxRateIdx = MCS2; + else if (MCS1 && (Rssi >= -88)) + TxRateIdx = MCS1; + else + TxRateIdx = MCS0; + } +// else if ((pTable == RateSwitchTable11BGN2S) || (pTable == RateSwitchTable11BGN2SForABand) ||(pTable == RateSwitchTable11N2S) ||(pTable == RateSwitchTable11N2SForABand) || (pTable == RateSwitchTable)) + else if ((pTable == RateSwitchTable11BGN2S) || (pTable == RateSwitchTable11BGN2SForABand) ||(pTable == RateSwitchTable11N2S) ||(pTable == RateSwitchTable11N2SForABand)) // 3*3 + {// N mode with 2 stream + if (MCS15 && (Rssi >= (-70+RssiOffset))) + TxRateIdx = MCS15; + else if (MCS14 && (Rssi >= (-72+RssiOffset))) + TxRateIdx = MCS14; + else if (MCS13 && (Rssi >= (-76+RssiOffset))) + TxRateIdx = MCS13; + else if (MCS12 && (Rssi >= (-78+RssiOffset))) + TxRateIdx = MCS12; + else if (MCS4 && (Rssi >= (-82+RssiOffset))) + TxRateIdx = MCS4; + else if (MCS3 && (Rssi >= (-84+RssiOffset))) + TxRateIdx = MCS3; + else if (MCS2 && (Rssi >= (-86+RssiOffset))) + TxRateIdx = MCS2; + else if (MCS1 && (Rssi >= (-88+RssiOffset))) + TxRateIdx = MCS1; + else + TxRateIdx = MCS0; + } + else if ((pTable == RateSwitchTable11BGN1S) || (pTable == RateSwitchTable11N1S)) + {// N mode with 1 stream + if (MCS7 && (Rssi > (-72+RssiOffset))) + TxRateIdx = MCS7; + else if (MCS6 && (Rssi > (-74+RssiOffset))) + TxRateIdx = MCS6; + else if (MCS5 && (Rssi > (-77+RssiOffset))) + TxRateIdx = MCS5; + else if (MCS4 && (Rssi > (-79+RssiOffset))) + TxRateIdx = MCS4; + else if (MCS3 && (Rssi > (-81+RssiOffset))) + TxRateIdx = MCS3; + else if (MCS2 && (Rssi > (-83+RssiOffset))) + TxRateIdx = MCS2; + else if (MCS1 && (Rssi > (-86+RssiOffset))) + TxRateIdx = MCS1; + else + TxRateIdx = MCS0; + } + else +#endif // DOT11_N_SUPPORT // + {// Legacy mode + if (MCS7 && (Rssi > -70)) + TxRateIdx = MCS7; + else if (MCS6 && (Rssi > -74)) + TxRateIdx = MCS6; + else if (MCS5 && (Rssi > -78)) + TxRateIdx = MCS5; + else if (MCS4 && (Rssi > -82)) + TxRateIdx = MCS4; + else if (MCS4 == 0) // for B-only mode + TxRateIdx = MCS3; + else if (MCS3 && (Rssi > -85)) + TxRateIdx = MCS3; + else if (MCS2 && (Rssi > -87)) + TxRateIdx = MCS2; + else if (MCS1 && (Rssi > -90)) + TxRateIdx = MCS1; + else + TxRateIdx = MCS0; + } + + // if (TxRateIdx != pAd->CommonCfg.TxRateIndex) + { + pEntry->CurrTxRateIndex = TxRateIdx; + pNextTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(pEntry->CurrTxRateIndex+1)*5]; + MlmeSetTxRate(pAd, pEntry, pNextTxRate); + } + + NdisZeroMemory(pEntry->TxQuality, sizeof(USHORT) * MAX_STEP_OF_TX_RATE_SWITCH); + NdisZeroMemory(pEntry->PER, sizeof(UCHAR) * MAX_STEP_OF_TX_RATE_SWITCH); + pEntry->fLastSecAccordingRSSI = TRUE; + // reset all OneSecTx counters + RESET_ONE_SEC_TX_CNT(pEntry); + + continue; + } + + if (pEntry->fLastSecAccordingRSSI == TRUE) + { + pEntry->fLastSecAccordingRSSI = FALSE; + pEntry->LastSecTxRateChangeAction = 0; + // reset all OneSecTx counters + RESET_ONE_SEC_TX_CNT(pEntry); + + continue; + } + + do + { + BOOLEAN bTrainUpDown = FALSE; + + pEntry->CurrTxRateStableTime ++; + + // downgrade TX quality if PER >= Rate-Down threshold + if (TxErrorRatio >= TrainDown) + { + bTrainUpDown = TRUE; + pEntry->TxQuality[CurrRateIdx] = DRS_TX_QUALITY_WORST_BOUND; + } + // upgrade TX quality if PER <= Rate-Up threshold + else if (TxErrorRatio <= TrainUp) + { + bTrainUpDown = TRUE; + bUpgradeQuality = TRUE; + if (pEntry->TxQuality[CurrRateIdx]) + pEntry->TxQuality[CurrRateIdx] --; // quality very good in CurrRate + + if (pEntry->TxRateUpPenalty) + pEntry->TxRateUpPenalty --; + else if (pEntry->TxQuality[UpRateIdx]) + pEntry->TxQuality[UpRateIdx] --; // may improve next UP rate's quality + } + + pEntry->PER[CurrRateIdx] = (UCHAR)TxErrorRatio; + + if (bTrainUpDown) + { + // perform DRS - consider TxRate Down first, then rate up. + if ((CurrRateIdx != DownRateIdx) && (pEntry->TxQuality[CurrRateIdx] >= DRS_TX_QUALITY_WORST_BOUND)) + { + pEntry->CurrTxRateIndex = DownRateIdx; + } + else if ((CurrRateIdx != UpRateIdx) && (pEntry->TxQuality[UpRateIdx] <= 0)) + { + pEntry->CurrTxRateIndex = UpRateIdx; + } + } + } while (FALSE); + + // if rate-up happen, clear all bad history of all TX rates + if (pEntry->CurrTxRateIndex > CurrRateIdx) + { + pEntry->CurrTxRateStableTime = 0; + pEntry->TxRateUpPenalty = 0; + pEntry->LastSecTxRateChangeAction = 1; // rate UP + NdisZeroMemory(pEntry->TxQuality, sizeof(USHORT) * MAX_STEP_OF_TX_RATE_SWITCH); + NdisZeroMemory(pEntry->PER, sizeof(UCHAR) * MAX_STEP_OF_TX_RATE_SWITCH); + + // + // For TxRate fast train up + // + if (!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning) + { + RTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, 100); + + pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = TRUE; + } + bTxRateChanged = TRUE; + } + // if rate-down happen, only clear DownRate's bad history + else if (pEntry->CurrTxRateIndex < CurrRateIdx) + { + pEntry->CurrTxRateStableTime = 0; + pEntry->TxRateUpPenalty = 0; // no penalty + pEntry->LastSecTxRateChangeAction = 2; // rate DOWN + pEntry->TxQuality[pEntry->CurrTxRateIndex] = 0; + pEntry->PER[pEntry->CurrTxRateIndex] = 0; + + // + // For TxRate fast train down + // + if (!pAd->StaCfg.StaQuickResponeForRateUpTimerRunning) + { + RTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, 100); + + pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = TRUE; + } + bTxRateChanged = TRUE; + } + else + { + pEntry->LastSecTxRateChangeAction = 0; // rate no change + bTxRateChanged = FALSE; + } + + pEntry->LastTxOkCount = TxSuccess; + + pNextTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(pEntry->CurrTxRateIndex+1)*5]; + if (bTxRateChanged && pNextTxRate) + { + MlmeSetTxRate(pAd, pEntry, pNextTxRate); + } + // reset all OneSecTx counters + RESET_ONE_SEC_TX_CNT(pEntry); + } +} + +/* + ======================================================================== + Routine Description: + Station side, Auto TxRate faster train up timer call back function. + + Arguments: + SystemSpecific1 - Not used. + FunctionContext - Pointer to our Adapter context. + SystemSpecific2 - Not used. + SystemSpecific3 - Not used. + + Return Value: + None + + ======================================================================== +*/ +VOID StaQuickResponeForRateUpExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)FunctionContext; + UCHAR UpRateIdx = 0, DownRateIdx = 0, CurrRateIdx = 0; + ULONG TxTotalCnt; + ULONG TxErrorRatio = 0; + BOOLEAN bTxRateChanged; //, bUpgradeQuality = FALSE; + PRTMP_TX_RATE_SWITCH pCurrTxRate, pNextTxRate = NULL; + PUCHAR pTable; + UCHAR TableSize = 0; + UCHAR InitTxRateIdx = 0, TrainUp, TrainDown; + TX_STA_CNT1_STRUC StaTx1; + TX_STA_CNT0_STRUC TxStaCnt0; + CHAR Rssi, ratio; + ULONG TxRetransmit = 0, TxSuccess = 0, TxFailCount = 0; + MAC_TABLE_ENTRY *pEntry; + ULONG i; + + pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE; + + // + // walk through MAC table, see if need to change AP's TX rate toward each entry + // + for (i = 1; i < MAX_LEN_OF_MAC_TABLE; i++) + { + pEntry = &pAd->MacTab.Content[i]; + + // check if this entry need to switch rate automatically + if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pEntry) == FALSE) + continue; + + if (INFRA_ON(pAd) && (i == 1)) + Rssi = RTMPMaxRssi(pAd, + pAd->StaCfg.RssiSample.AvgRssi0, + pAd->StaCfg.RssiSample.AvgRssi1, + pAd->StaCfg.RssiSample.AvgRssi2); + else + Rssi = RTMPMaxRssi(pAd, + pEntry->RssiSample.AvgRssi0, + pEntry->RssiSample.AvgRssi1, + pEntry->RssiSample.AvgRssi2); + + CurrRateIdx = pAd->CommonCfg.TxRateIndex; + + MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &InitTxRateIdx); + + // decide the next upgrade rate and downgrade rate, if any + if ((CurrRateIdx > 0) && (CurrRateIdx < (TableSize - 1))) + { + UpRateIdx = CurrRateIdx + 1; + DownRateIdx = CurrRateIdx -1; + } + else if (CurrRateIdx == 0) + { + UpRateIdx = CurrRateIdx + 1; + DownRateIdx = CurrRateIdx; + } + else if (CurrRateIdx == (TableSize - 1)) + { + UpRateIdx = CurrRateIdx; + DownRateIdx = CurrRateIdx - 1; + } + + pCurrTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(CurrRateIdx+1)*5]; + +#ifdef DOT11_N_SUPPORT + if ((Rssi > -65) && (pCurrTxRate->Mode >= MODE_HTMIX)) + { + TrainUp = (pCurrTxRate->TrainUp + (pCurrTxRate->TrainUp >> 1)); + TrainDown = (pCurrTxRate->TrainDown + (pCurrTxRate->TrainDown >> 1)); + } + else +#endif // DOT11_N_SUPPORT // + { + TrainUp = pCurrTxRate->TrainUp; + TrainDown = pCurrTxRate->TrainDown; + } + + if (pAd->MacTab.Size == 1) + { + // Update statistic counter + RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word); + RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word); + + TxRetransmit = StaTx1.field.TxRetransmit; + TxSuccess = StaTx1.field.TxSuccess; + TxFailCount = TxStaCnt0.field.TxFailCount; + TxTotalCnt = TxRetransmit + TxSuccess + TxFailCount; + + pAd->RalinkCounters.OneSecTxRetryOkCount += StaTx1.field.TxRetransmit; + pAd->RalinkCounters.OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess; + pAd->RalinkCounters.OneSecTxFailCount += TxStaCnt0.field.TxFailCount; + +#ifdef STATS_COUNT_SUPPORT + pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess; + pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit; + pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount; +#endif // STATS_COUNT_SUPPORT // + + if (TxTotalCnt) + TxErrorRatio = ((TxRetransmit + TxFailCount) * 100) / TxTotalCnt; + } + else + { + TxTotalCnt = pEntry->OneSecTxNoRetryOkCount + + pEntry->OneSecTxRetryOkCount + + pEntry->OneSecTxFailCount; + + if (TxTotalCnt) + TxErrorRatio = ((pEntry->OneSecTxRetryOkCount + pEntry->OneSecTxFailCount) * 100) / TxTotalCnt; + } + + + // + // CASE 1. when TX samples are fewer than 15, then decide TX rate solely on RSSI + // (criteria copied from RT2500 for Netopia case) + // + if (TxTotalCnt <= 12) + { + NdisZeroMemory(pAd->DrsCounters.TxQuality, sizeof(USHORT) * MAX_STEP_OF_TX_RATE_SWITCH); + NdisZeroMemory(pAd->DrsCounters.PER, sizeof(UCHAR) * MAX_STEP_OF_TX_RATE_SWITCH); + + if ((pAd->DrsCounters.LastSecTxRateChangeAction == 1) && (CurrRateIdx != DownRateIdx)) + { + pAd->CommonCfg.TxRateIndex = DownRateIdx; + pAd->DrsCounters.TxQuality[CurrRateIdx] = DRS_TX_QUALITY_WORST_BOUND; + } + else if ((pAd->DrsCounters.LastSecTxRateChangeAction == 2) && (CurrRateIdx != UpRateIdx)) + { + pAd->CommonCfg.TxRateIndex = UpRateIdx; + } + + DBGPRINT_RAW(RT_DEBUG_TRACE,("QuickDRS: TxTotalCnt <= 15, train back to original rate \n")); + return; + } + + do + { + ULONG OneSecTxNoRetryOKRationCount; + + if (pAd->DrsCounters.LastTimeTxRateChangeAction == 0) + ratio = 5; + else + ratio = 4; + + // downgrade TX quality if PER >= Rate-Down threshold + if (TxErrorRatio >= TrainDown) + { + pAd->DrsCounters.TxQuality[CurrRateIdx] = DRS_TX_QUALITY_WORST_BOUND; + } + + pAd->DrsCounters.PER[CurrRateIdx] = (UCHAR)TxErrorRatio; + + OneSecTxNoRetryOKRationCount = (TxSuccess * ratio); + + // perform DRS - consider TxRate Down first, then rate up. + if ((pAd->DrsCounters.LastSecTxRateChangeAction == 1) && (CurrRateIdx != DownRateIdx)) + { + if ((pAd->DrsCounters.LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount) + { + pAd->CommonCfg.TxRateIndex = DownRateIdx; + pAd->DrsCounters.TxQuality[CurrRateIdx] = DRS_TX_QUALITY_WORST_BOUND; + + } + + } + else if ((pAd->DrsCounters.LastSecTxRateChangeAction == 2) && (CurrRateIdx != UpRateIdx)) + { + if ((TxErrorRatio >= 50) || (TxErrorRatio >= TrainDown)) + { + + } + else if ((pAd->DrsCounters.LastTxOkCount + 2) >= OneSecTxNoRetryOKRationCount) + { + pAd->CommonCfg.TxRateIndex = UpRateIdx; + } + } + }while (FALSE); + + // if rate-up happen, clear all bad history of all TX rates + if (pAd->CommonCfg.TxRateIndex > CurrRateIdx) + { + pAd->DrsCounters.TxRateUpPenalty = 0; + NdisZeroMemory(pAd->DrsCounters.TxQuality, sizeof(USHORT) * MAX_STEP_OF_TX_RATE_SWITCH); + NdisZeroMemory(pAd->DrsCounters.PER, sizeof(UCHAR) * MAX_STEP_OF_TX_RATE_SWITCH); + bTxRateChanged = TRUE; + } + // if rate-down happen, only clear DownRate's bad history + else if (pAd->CommonCfg.TxRateIndex < CurrRateIdx) + { + DBGPRINT_RAW(RT_DEBUG_TRACE,("QuickDRS: --TX rate from %d to %d \n", CurrRateIdx, pAd->CommonCfg.TxRateIndex)); + + pAd->DrsCounters.TxRateUpPenalty = 0; // no penalty + pAd->DrsCounters.TxQuality[pAd->CommonCfg.TxRateIndex] = 0; + pAd->DrsCounters.PER[pAd->CommonCfg.TxRateIndex] = 0; + bTxRateChanged = TRUE; + } + else + { + bTxRateChanged = FALSE; + } + + pNextTxRate = (PRTMP_TX_RATE_SWITCH) &pTable[(pAd->CommonCfg.TxRateIndex+1)*5]; + if (bTxRateChanged && pNextTxRate) + { + MlmeSetTxRate(pAd, pEntry, pNextTxRate); + } + } +} + +/* + ========================================================================== + Description: + This routine is executed periodically inside MlmePeriodicExec() after + association with an AP. + It checks if StaCfg.Psm is consistent with user policy (recorded in + StaCfg.WindowsPowerMode). If not, enforce user policy. However, + there're some conditions to consider: + 1. we don't support power-saving in ADHOC mode, so Psm=PWR_ACTIVE all + the time when Mibss==TRUE + 2. When link up in INFRA mode, Psm should not be switch to PWR_SAVE + if outgoing traffic available in TxRing or MgmtRing. + Output: + 1. change pAd->StaCfg.Psm to PWR_SAVE or leave it untouched + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeCheckPsmChange( + IN PRTMP_ADAPTER pAd, + IN ULONG Now32) +{ + ULONG PowerMode; + + // condition - + // 1. Psm maybe ON only happen in INFRASTRUCTURE mode + // 2. user wants either MAX_PSP or FAST_PSP + // 3. but current psm is not in PWR_SAVE + // 4. CNTL state machine is not doing SCANning + // 5. no TX SUCCESS event for the past 1-sec period + PowerMode = pAd->StaCfg.WindowsPowerMode; + + if (INFRA_ON(pAd) && + (PowerMode != Ndis802_11PowerModeCAM) && + (pAd->StaCfg.Psm == PWR_ACTIVE) && +// (! RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + (pAd->Mlme.CntlMachine.CurrState == CNTL_IDLE) +#ifdef PCIE_PS_SUPPORT + && RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP) +#endif // PCIE_PS_SUPPORT // + + /*&& + (pAd->RalinkCounters.OneSecTxNoRetryOkCount == 0) && + (pAd->RalinkCounters.OneSecTxRetryOkCount == 0)*/) + { + NdisGetSystemUpTime(&pAd->Mlme.LastSendNULLpsmTime); + pAd->RalinkCounters.RxCountSinceLastNULL = 0; + RTMP_SET_PSM_BIT(pAd, PWR_SAVE); + if (!(pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable)) + { + RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, FALSE); + } + else + { + RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE); + } + } +} + +// IRQL = PASSIVE_LEVEL +// IRQL = DISPATCH_LEVEL +VOID MlmeSetPsmBit( + IN PRTMP_ADAPTER pAd, + IN USHORT psm) +{ + + pAd->StaCfg.Psm = psm; + + DBGPRINT(RT_DEBUG_TRACE, ("MlmeSetPsmBit = %d\n", psm)); +} +#endif // CONFIG_STA_SUPPORT // + +/* + ========================================================================== + Description: + This routine calculates TxPER, RxPER of the past N-sec period. And + according to the calculation result, ChannelQuality is calculated here + to decide if current AP is still doing the job. + + If ChannelQuality is not good, a ROAMing attempt may be tried later. + Output: + StaCfg.ChannelQuality - 0..100 + + IRQL = DISPATCH_LEVEL + + NOTE: This routine decide channle quality based on RX CRC error ratio. + Caller should make sure a function call to NICUpdateRawCounters(pAd) + is performed right before this routine, so that this routine can decide + channel quality based on the most up-to-date information + ========================================================================== + */ +VOID MlmeCalculateChannelQuality( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pMacEntry, + IN ULONG Now32) +{ + ULONG TxOkCnt, TxCnt, TxPER, TxPRR; + ULONG RxCnt, RxPER; + UCHAR NorRssi; + CHAR MaxRssi; + RSSI_SAMPLE *pRssiSample = NULL; + UINT32 OneSecTxNoRetryOkCount = 0; + UINT32 OneSecTxRetryOkCount = 0; + UINT32 OneSecTxFailCount = 0; + UINT32 OneSecRxOkCnt = 0; + UINT32 OneSecRxFcsErrCnt = 0; + ULONG ChannelQuality = 0; // 0..100, Channel Quality Indication for Roaming +#ifdef CONFIG_STA_SUPPORT + ULONG BeaconLostTime = pAd->StaCfg.BeaconLostTime; +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT +#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier + // longer beacon lost time when carrier detection enabled + if (pAd->CommonCfg.CarrierDetect.Enable == TRUE) + { + BeaconLostTime = pAd->StaCfg.BeaconLostTime + (pAd->StaCfg.BeaconLostTime/2); + } +#endif // CARRIER_DETECTION_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + if (pAd->OpMode == OPMODE_STA) + { + pRssiSample = &pAd->StaCfg.RssiSample; + OneSecTxNoRetryOkCount = pAd->RalinkCounters.OneSecTxNoRetryOkCount; + OneSecTxRetryOkCount = pAd->RalinkCounters.OneSecTxRetryOkCount; + OneSecTxFailCount = pAd->RalinkCounters.OneSecTxFailCount; + OneSecRxOkCnt = pAd->RalinkCounters.OneSecRxOkCnt; + OneSecRxFcsErrCnt = pAd->RalinkCounters.OneSecRxFcsErrCnt; + } +#endif // CONFIG_STA_SUPPORT // + + MaxRssi = RTMPMaxRssi(pAd, pRssiSample->LastRssi0, + pRssiSample->LastRssi1, + pRssiSample->LastRssi2); + + // + // calculate TX packet error ratio and TX retry ratio - if too few TX samples, skip TX related statistics + // + TxOkCnt = OneSecTxNoRetryOkCount + OneSecTxRetryOkCount; + TxCnt = TxOkCnt + OneSecTxFailCount; + if (TxCnt < 5) + { + TxPER = 0; + TxPRR = 0; + } + else + { + TxPER = (OneSecTxFailCount * 100) / TxCnt; + TxPRR = ((TxCnt - OneSecTxNoRetryOkCount) * 100) / TxCnt; + } + + // + // calculate RX PER - don't take RxPER into consideration if too few sample + // + RxCnt = OneSecRxOkCnt + OneSecRxFcsErrCnt; + if (RxCnt < 5) + RxPER = 0; + else + RxPER = (OneSecRxFcsErrCnt * 100) / RxCnt; + + // + // decide ChannelQuality based on: 1)last BEACON received time, 2)last RSSI, 3)TxPER, and 4)RxPER + // +#ifdef CONFIG_STA_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && + INFRA_ON(pAd) && + (OneSecTxNoRetryOkCount < 2) && // no heavy traffic + RTMP_TIME_AFTER(Now32, pAd->StaCfg.LastBeaconRxTime + BeaconLostTime)) + /*((pAd->StaCfg.LastBeaconRxTime + BeaconLostTime) < Now32))*/ + { + DBGPRINT(RT_DEBUG_TRACE, ("BEACON lost > %ld msec with TxOkCnt=%ld -> CQI=0\n", BeaconLostTime, TxOkCnt)); + ChannelQuality = 0; + } + else +#endif // CONFIG_STA_SUPPORT // + { + // Normalize Rssi + if (MaxRssi > -40) + NorRssi = 100; + else if (MaxRssi < -90) + NorRssi = 0; + else + NorRssi = (MaxRssi + 90) * 2; + + // ChannelQuality = W1*RSSI + W2*TxPRR + W3*RxPER (RSSI 0..100), (TxPER 100..0), (RxPER 100..0) + ChannelQuality = (RSSI_WEIGHTING * NorRssi + + TX_WEIGHTING * (100 - TxPRR) + + RX_WEIGHTING* (100 - RxPER)) / 100; + } + + +#ifdef CONFIG_STA_SUPPORT + if (pAd->OpMode == OPMODE_STA) + pAd->Mlme.ChannelQuality = (ChannelQuality > 100) ? 100 : ChannelQuality; +#endif // CONFIG_STA_SUPPORT // + + +} + + +// IRQL = DISPATCH_LEVEL +VOID MlmeSetTxPreamble( + IN PRTMP_ADAPTER pAd, + IN USHORT TxPreamble) +{ + AUTO_RSP_CFG_STRUC csr4; + + // + // Always use Long preamble before verifiation short preamble functionality works well. + // Todo: remove the following line if short preamble functionality works + // + //TxPreamble = Rt802_11PreambleLong; + + RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &csr4.word); + if (TxPreamble == Rt802_11PreambleLong) + { + DBGPRINT(RT_DEBUG_TRACE, ("MlmeSetTxPreamble (= LONG PREAMBLE)\n")); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); + csr4.field.AutoResponderPreamble = 0; + } + else + { + // NOTE: 1Mbps should always use long preamble + DBGPRINT(RT_DEBUG_TRACE, ("MlmeSetTxPreamble (= SHORT PREAMBLE)\n")); + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); + csr4.field.AutoResponderPreamble = 1; + } + + RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, csr4.word); +} + +/* + ========================================================================== + Description: + Update basic rate bitmap + ========================================================================== + */ + +VOID UpdateBasicRateBitmap( + IN PRTMP_ADAPTER pAdapter) +{ + INT i, j; + /* 1 2 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */ + UCHAR rate[] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 }; + UCHAR *sup_p = pAdapter->CommonCfg.SupRate; + UCHAR *ext_p = pAdapter->CommonCfg.ExtRate; + ULONG bitmap = pAdapter->CommonCfg.BasicRateBitmap; + + + /* if A mode, always use fix BasicRateBitMap */ + //if (pAdapter->CommonCfg.Channel == PHY_11A) + if (pAdapter->CommonCfg.Channel > 14) + pAdapter->CommonCfg.BasicRateBitmap = 0x150; /* 6, 12, 24M */ + /* End of if */ + + if (pAdapter->CommonCfg.BasicRateBitmap > 4095) + { + /* (2 ^ MAX_LEN_OF_SUPPORTED_RATES) -1 */ + return; + } /* End of if */ + + for(i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++) + { + sup_p[i] &= 0x7f; + ext_p[i] &= 0x7f; + } /* End of for */ + + for(i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++) + { + if (bitmap & (1 << i)) + { + for(j=0; j<MAX_LEN_OF_SUPPORTED_RATES; j++) + { + if (sup_p[j] == rate[i]) + sup_p[j] |= 0x80; + /* End of if */ + } /* End of for */ + + for(j=0; j<MAX_LEN_OF_SUPPORTED_RATES; j++) + { + if (ext_p[j] == rate[i]) + ext_p[j] |= 0x80; + /* End of if */ + } /* End of for */ + } /* End of if */ + } /* End of for */ +} /* End of UpdateBasicRateBitmap */ + +// IRQL = PASSIVE_LEVEL +// IRQL = DISPATCH_LEVEL +// bLinkUp is to identify the inital link speed. +// TRUE indicates the rate update at linkup, we should not try to set the rate at 54Mbps. +VOID MlmeUpdateTxRates( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bLinkUp, + IN UCHAR apidx) +{ + int i, num; + UCHAR Rate = RATE_6, MaxDesire = RATE_1, MaxSupport = RATE_1; + UCHAR MinSupport = RATE_54; + ULONG BasicRateBitmap = 0; + UCHAR CurrBasicRate = RATE_1; + UCHAR *pSupRate, SupRateLen, *pExtRate, ExtRateLen; + PHTTRANSMIT_SETTING pHtPhy = NULL; + PHTTRANSMIT_SETTING pMaxHtPhy = NULL; + PHTTRANSMIT_SETTING pMinHtPhy = NULL; + BOOLEAN *auto_rate_cur_p; + UCHAR HtMcs = MCS_AUTO; + + // find max desired rate + UpdateBasicRateBitmap(pAd); + + num = 0; + auto_rate_cur_p = NULL; + for (i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++) + { + switch (pAd->CommonCfg.DesireRate[i] & 0x7f) + { + case 2: Rate = RATE_1; num++; break; + case 4: Rate = RATE_2; num++; break; + case 11: Rate = RATE_5_5; num++; break; + case 22: Rate = RATE_11; num++; break; + case 12: Rate = RATE_6; num++; break; + case 18: Rate = RATE_9; num++; break; + case 24: Rate = RATE_12; num++; break; + case 36: Rate = RATE_18; num++; break; + case 48: Rate = RATE_24; num++; break; + case 72: Rate = RATE_36; num++; break; + case 96: Rate = RATE_48; num++; break; + case 108: Rate = RATE_54; num++; break; + //default: Rate = RATE_1; break; + } + if (MaxDesire < Rate) MaxDesire = Rate; + } + +//=========================================================================== +//=========================================================================== + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pHtPhy = &pAd->StaCfg.HTPhyMode; + pMaxHtPhy = &pAd->StaCfg.MaxHTPhyMode; + pMinHtPhy = &pAd->StaCfg.MinHTPhyMode; + + auto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch; + HtMcs = pAd->StaCfg.DesiredTransmitSetting.field.MCS; + + if ((pAd->StaCfg.BssType == BSS_ADHOC) && + (pAd->CommonCfg.PhyMode == PHY_11B) && + (MaxDesire > RATE_11)) + { + MaxDesire = RATE_11; + } + } +#endif // CONFIG_STA_SUPPORT // + + pAd->CommonCfg.MaxDesiredRate = MaxDesire; + pMinHtPhy->word = 0; + pMaxHtPhy->word = 0; + pHtPhy->word = 0; + + // Auto rate switching is enabled only if more than one DESIRED RATES are + // specified; otherwise disabled + if (num <= 1) + { + //OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); + //pAd->CommonCfg.bAutoTxRateSwitch = FALSE; + *auto_rate_cur_p = FALSE; + } + else + { + //OPSTATUS_SET_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); + //pAd->CommonCfg.bAutoTxRateSwitch = TRUE; + *auto_rate_cur_p = TRUE; + } + + if (HtMcs != MCS_AUTO) + { + //OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); + //pAd->CommonCfg.bAutoTxRateSwitch = FALSE; + *auto_rate_cur_p = FALSE; + } + else + { + //OPSTATUS_SET_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED); + //pAd->CommonCfg.bAutoTxRateSwitch = TRUE; + *auto_rate_cur_p = TRUE; + } + +#ifdef CONFIG_STA_SUPPORT + if ((ADHOC_ON(pAd) || INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) + { + pSupRate = &pAd->StaActive.SupRate[0]; + pExtRate = &pAd->StaActive.ExtRate[0]; + SupRateLen = pAd->StaActive.SupRateLen; + ExtRateLen = pAd->StaActive.ExtRateLen; + } + else +#endif // CONFIG_STA_SUPPORT // + { + pSupRate = &pAd->CommonCfg.SupRate[0]; + pExtRate = &pAd->CommonCfg.ExtRate[0]; + SupRateLen = pAd->CommonCfg.SupRateLen; + ExtRateLen = pAd->CommonCfg.ExtRateLen; + } + + // find max supported rate + for (i=0; i<SupRateLen; i++) + { + switch (pSupRate[i] & 0x7f) + { + case 2: Rate = RATE_1; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0001; break; + case 4: Rate = RATE_2; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0002; break; + case 11: Rate = RATE_5_5; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0004; break; + case 22: Rate = RATE_11; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0008; break; + case 12: Rate = RATE_6; /*if (pSupRate[i] & 0x80)*/ BasicRateBitmap |= 0x0010; break; + case 18: Rate = RATE_9; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0020; break; + case 24: Rate = RATE_12; /*if (pSupRate[i] & 0x80)*/ BasicRateBitmap |= 0x0040; break; + case 36: Rate = RATE_18; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0080; break; + case 48: Rate = RATE_24; /*if (pSupRate[i] & 0x80)*/ BasicRateBitmap |= 0x0100; break; + case 72: Rate = RATE_36; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0200; break; + case 96: Rate = RATE_48; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0400; break; + case 108: Rate = RATE_54; if (pSupRate[i] & 0x80) BasicRateBitmap |= 0x0800; break; + default: Rate = RATE_1; break; + } + if (MaxSupport < Rate) MaxSupport = Rate; + + if (MinSupport > Rate) MinSupport = Rate; + } + + for (i=0; i<ExtRateLen; i++) + { + switch (pExtRate[i] & 0x7f) + { + case 2: Rate = RATE_1; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0001; break; + case 4: Rate = RATE_2; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0002; break; + case 11: Rate = RATE_5_5; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0004; break; + case 22: Rate = RATE_11; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0008; break; + case 12: Rate = RATE_6; /*if (pExtRate[i] & 0x80)*/ BasicRateBitmap |= 0x0010; break; + case 18: Rate = RATE_9; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0020; break; + case 24: Rate = RATE_12; /*if (pExtRate[i] & 0x80)*/ BasicRateBitmap |= 0x0040; break; + case 36: Rate = RATE_18; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0080; break; + case 48: Rate = RATE_24; /*if (pExtRate[i] & 0x80)*/ BasicRateBitmap |= 0x0100; break; + case 72: Rate = RATE_36; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0200; break; + case 96: Rate = RATE_48; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0400; break; + case 108: Rate = RATE_54; if (pExtRate[i] & 0x80) BasicRateBitmap |= 0x0800; break; + default: Rate = RATE_1; break; + } + if (MaxSupport < Rate) MaxSupport = Rate; + + if (MinSupport > Rate) MinSupport = Rate; + } + + RTMP_IO_WRITE32(pAd, LEGACY_BASIC_RATE, BasicRateBitmap); + + // bug fix + // pAd->CommonCfg.BasicRateBitmap = BasicRateBitmap; + + // calculate the exptected ACK rate for each TX rate. This info is used to caculate + // the DURATION field of outgoing uniicast DATA/MGMT frame + for (i=0; i<MAX_LEN_OF_SUPPORTED_RATES; i++) + { + if (BasicRateBitmap & (0x01 << i)) + CurrBasicRate = (UCHAR)i; + pAd->CommonCfg.ExpectedACKRate[i] = CurrBasicRate; + } + + DBGPRINT(RT_DEBUG_TRACE,("MlmeUpdateTxRates[MaxSupport = %d] = MaxDesire %d Mbps\n", RateIdToMbps[MaxSupport], RateIdToMbps[MaxDesire])); + // max tx rate = min {max desire rate, max supported rate} + if (MaxSupport < MaxDesire) + pAd->CommonCfg.MaxTxRate = MaxSupport; + else + pAd->CommonCfg.MaxTxRate = MaxDesire; + + pAd->CommonCfg.MinTxRate = MinSupport; + // 2003-07-31 john - 2500 doesn't have good sensitivity at high OFDM rates. to increase the success + // ratio of initial DHCP packet exchange, TX rate starts from a lower rate depending + // on average RSSI + // 1. RSSI >= -70db, start at 54 Mbps (short distance) + // 2. -70 > RSSI >= -75, start at 24 Mbps (mid distance) + // 3. -75 > RSSI, start at 11 Mbps (long distance) + //if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)/* && + // OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)*/) + if (*auto_rate_cur_p) + { + short dbm = 0; +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + dbm = pAd->StaCfg.RssiSample.AvgRssi0 - pAd->BbpRssiToDbmDelta; +#endif // CONFIG_STA_SUPPORT // + if (bLinkUp == TRUE) + pAd->CommonCfg.TxRate = RATE_24; + else + pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate; + + if (dbm < -75) + pAd->CommonCfg.TxRate = RATE_11; + else if (dbm < -70) + pAd->CommonCfg.TxRate = RATE_24; + + // should never exceed MaxTxRate (consider 11B-only mode) + if (pAd->CommonCfg.TxRate > pAd->CommonCfg.MaxTxRate) + pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate; + + pAd->CommonCfg.TxRateIndex = 0; + } + else + { + pAd->CommonCfg.TxRate = pAd->CommonCfg.MaxTxRate; + //pHtPhy->field.MCS = (pAd->CommonCfg.MaxTxRate > 3) ? (pAd->CommonCfg.MaxTxRate - 4) : pAd->CommonCfg.MaxTxRate; + //pHtPhy->field.MODE = (pAd->CommonCfg.MaxTxRate > 3) ? MODE_OFDM : MODE_CCK; + + /* Choose the Desire Tx MCS in CCK/OFDM mode */ + if (num > RATE_6) + { + if (HtMcs <= MCS_7) + MaxDesire = RxwiMCSToOfdmRate[HtMcs]; + else + MaxDesire = MinSupport; + } + else + { + if (HtMcs <= MCS_3) + MaxDesire = HtMcs; + else + MaxDesire = MinSupport; + } + + pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC = pHtPhy->field.STBC; + pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI = pHtPhy->field.ShortGI; + pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS = pHtPhy->field.MCS; + pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE = pHtPhy->field.MODE; + } + + if (pAd->CommonCfg.TxRate <= RATE_11) + { + pMaxHtPhy->field.MODE = MODE_CCK; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pMaxHtPhy->field.MCS = pAd->CommonCfg.TxRate; + pMinHtPhy->field.MCS = pAd->CommonCfg.MinTxRate; + } +#endif // CONFIG_STA_SUPPORT // + + } + else + { + pMaxHtPhy->field.MODE = MODE_OFDM; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pMaxHtPhy->field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.TxRate]; + if (pAd->CommonCfg.MinTxRate >= RATE_6 && (pAd->CommonCfg.MinTxRate <= RATE_54)) + {pMinHtPhy->field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MinTxRate];} + else + {pMinHtPhy->field.MCS = pAd->CommonCfg.MinTxRate;} + } +#endif // CONFIG_STA_SUPPORT // + + } + + pHtPhy->word = (pMaxHtPhy->word); + if (bLinkUp && (pAd->OpMode == OPMODE_STA)) + { + pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word = pHtPhy->word; + pAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word = pMaxHtPhy->word; + pAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word = pMinHtPhy->word; + } + else + { + switch (pAd->CommonCfg.PhyMode) + { + case PHY_11BG_MIXED: + case PHY_11B: +#ifdef DOT11_N_SUPPORT + case PHY_11BGN_MIXED: +#endif // DOT11_N_SUPPORT // + pAd->CommonCfg.MlmeRate = RATE_1; + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK; + pAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1; + +//#ifdef WIFI_TEST + pAd->CommonCfg.RtsRate = RATE_11; +//#else +// pAd->CommonCfg.RtsRate = RATE_1; +//#endif + break; + case PHY_11G: + case PHY_11A: +#ifdef DOT11_N_SUPPORT + case PHY_11AGN_MIXED: + case PHY_11GN_MIXED: + case PHY_11N_2_4G: + case PHY_11AN_MIXED: + case PHY_11N_5G: +#endif // DOT11_N_SUPPORT // + pAd->CommonCfg.MlmeRate = RATE_6; + pAd->CommonCfg.RtsRate = RATE_6; + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM; + pAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; + break; + case PHY_11ABG_MIXED: +#ifdef DOT11_N_SUPPORT + case PHY_11ABGN_MIXED: +#endif // DOT11_N_SUPPORT // + if (pAd->CommonCfg.Channel <= 14) + { + pAd->CommonCfg.MlmeRate = RATE_1; + pAd->CommonCfg.RtsRate = RATE_1; + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK; + pAd->CommonCfg.MlmeTransmit.field.MCS = RATE_1; + } + else + { + pAd->CommonCfg.MlmeRate = RATE_6; + pAd->CommonCfg.RtsRate = RATE_6; + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM; + pAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; + } + break; + default: // error + pAd->CommonCfg.MlmeRate = RATE_6; + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM; + pAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; + pAd->CommonCfg.RtsRate = RATE_1; + break; + } + // + // Keep Basic Mlme Rate. + // + pAd->MacTab.Content[MCAST_WCID].HTPhyMode.word = pAd->CommonCfg.MlmeTransmit.word; + if (pAd->CommonCfg.MlmeTransmit.field.MODE == MODE_OFDM) + pAd->MacTab.Content[MCAST_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[RATE_24]; + else + pAd->MacTab.Content[MCAST_WCID].HTPhyMode.field.MCS = RATE_1; + pAd->CommonCfg.BasicMlmeRate = pAd->CommonCfg.MlmeRate; + } + + DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (MaxDesire=%d, MaxSupport=%d, MaxTxRate=%d, MinRate=%d, Rate Switching =%d)\n", + RateIdToMbps[MaxDesire], RateIdToMbps[MaxSupport], RateIdToMbps[pAd->CommonCfg.MaxTxRate], RateIdToMbps[pAd->CommonCfg.MinTxRate], + /*OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)*/*auto_rate_cur_p)); + DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (TxRate=%d, RtsRate=%d, BasicRateBitmap=0x%04lx)\n", + RateIdToMbps[pAd->CommonCfg.TxRate], RateIdToMbps[pAd->CommonCfg.RtsRate], BasicRateBitmap)); + DBGPRINT(RT_DEBUG_TRACE, ("MlmeUpdateTxRates (MlmeTransmit=0x%x, MinHTPhyMode=%x, MaxHTPhyMode=0x%x, HTPhyMode=0x%x)\n", + pAd->CommonCfg.MlmeTransmit.word, pAd->MacTab.Content[BSSID_WCID].MinHTPhyMode.word ,pAd->MacTab.Content[BSSID_WCID].MaxHTPhyMode.word ,pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word )); +} + +#ifdef DOT11_N_SUPPORT +/* + ========================================================================== + Description: + This function update HT Rate setting. + Input Wcid value is valid for 2 case : + 1. it's used for Station in infra mode that copy AP rate to Mactable. + 2. OR Station in adhoc mode to copy peer's HT rate to Mactable. + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeUpdateHtTxRates( + IN PRTMP_ADAPTER pAd, + IN UCHAR apidx) +{ + UCHAR StbcMcs; //j, StbcMcs, bitmask; + CHAR i; // 3*3 + RT_HT_CAPABILITY *pRtHtCap = NULL; + RT_HT_PHY_INFO *pActiveHtPhy = NULL; + ULONG BasicMCS; + UCHAR j, bitmask; + PRT_HT_PHY_INFO pDesireHtPhy = NULL; + PHTTRANSMIT_SETTING pHtPhy = NULL; + PHTTRANSMIT_SETTING pMaxHtPhy = NULL; + PHTTRANSMIT_SETTING pMinHtPhy = NULL; + BOOLEAN *auto_rate_cur_p; + + DBGPRINT(RT_DEBUG_TRACE,("MlmeUpdateHtTxRates===> \n")); + + auto_rate_cur_p = NULL; + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + pDesireHtPhy = &pAd->StaCfg.DesiredHtPhyInfo; + pActiveHtPhy = &pAd->StaCfg.DesiredHtPhyInfo; + pHtPhy = &pAd->StaCfg.HTPhyMode; + pMaxHtPhy = &pAd->StaCfg.MaxHTPhyMode; + pMinHtPhy = &pAd->StaCfg.MinHTPhyMode; + + auto_rate_cur_p = &pAd->StaCfg.bAutoTxRateSwitch; + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + if ((ADHOC_ON(pAd) || INFRA_ON(pAd)) && (pAd->OpMode == OPMODE_STA)) + { + if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) + return; + + pRtHtCap = &pAd->StaActive.SupportedHtPhy; + pActiveHtPhy = &pAd->StaActive.SupportedPhyInfo; + StbcMcs = (UCHAR)pAd->MlmeAux.AddHtInfo.AddHtInfo3.StbcMcs; + BasicMCS =pAd->MlmeAux.AddHtInfo.MCSSet[0]+(pAd->MlmeAux.AddHtInfo.MCSSet[1]<<8)+(StbcMcs<<16); + if ((pAd->CommonCfg.DesiredHtPhy.TxSTBC) && (pRtHtCap->RxSTBC) && (pAd->Antenna.field.TxPath == 2)) + pMaxHtPhy->field.STBC = STBC_USE; + else + pMaxHtPhy->field.STBC = STBC_NONE; + } + else +#endif // CONFIG_STA_SUPPORT // + { + if (pDesireHtPhy->bHtEnable == FALSE) + return; + + pRtHtCap = &pAd->CommonCfg.DesiredHtPhy; + StbcMcs = (UCHAR)pAd->CommonCfg.AddHTInfo.AddHtInfo3.StbcMcs; + BasicMCS = pAd->CommonCfg.AddHTInfo.MCSSet[0]+(pAd->CommonCfg.AddHTInfo.MCSSet[1]<<8)+(StbcMcs<<16); + if ((pAd->CommonCfg.DesiredHtPhy.TxSTBC) && (pRtHtCap->RxSTBC) && (pAd->Antenna.field.TxPath == 2)) + pMaxHtPhy->field.STBC = STBC_USE; + else + pMaxHtPhy->field.STBC = STBC_NONE; + } + + // Decide MAX ht rate. + if ((pRtHtCap->GF) && (pAd->CommonCfg.DesiredHtPhy.GF)) + pMaxHtPhy->field.MODE = MODE_HTGREENFIELD; + else + pMaxHtPhy->field.MODE = MODE_HTMIX; + + if ((pAd->CommonCfg.DesiredHtPhy.ChannelWidth) && (pRtHtCap->ChannelWidth)) + pMaxHtPhy->field.BW = BW_40; + else + pMaxHtPhy->field.BW = BW_20; + + if (pMaxHtPhy->field.BW == BW_20) + pMaxHtPhy->field.ShortGI = (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20 & pRtHtCap->ShortGIfor20); + else + pMaxHtPhy->field.ShortGI = (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40 & pRtHtCap->ShortGIfor40); + + if (pDesireHtPhy->MCSSet[4] != 0) + { + pMaxHtPhy->field.MCS = 32; + } + + for (i=23; i>=0; i--) // 3*3 + { + j = i/8; + bitmask = (1<<(i-(j*8))); + + if ((pActiveHtPhy->MCSSet[j] & bitmask) && (pDesireHtPhy->MCSSet[j] & bitmask)) + { + pMaxHtPhy->field.MCS = i; + break; + } + + if (i==0) + break; + } + + // Copy MIN ht rate. rt2860??? + pMinHtPhy->field.BW = BW_20; + pMinHtPhy->field.MCS = 0; + pMinHtPhy->field.STBC = 0; + pMinHtPhy->field.ShortGI = 0; + //If STA assigns fixed rate. update to fixed here. +#ifdef CONFIG_STA_SUPPORT + if ( (pAd->OpMode == OPMODE_STA) && (pDesireHtPhy->MCSSet[0] != 0xff)) + { + if (pDesireHtPhy->MCSSet[4] != 0) + { + pMaxHtPhy->field.MCS = 32; + pMinHtPhy->field.MCS = 32; + DBGPRINT(RT_DEBUG_TRACE,("MlmeUpdateHtTxRates<=== Use Fixed MCS = %d\n",pMinHtPhy->field.MCS)); + } + + for (i=23; (CHAR)i >= 0; i--) // 3*3 + { + j = i/8; + bitmask = (1<<(i-(j*8))); + if ( (pDesireHtPhy->MCSSet[j] & bitmask) && (pActiveHtPhy->MCSSet[j] & bitmask)) + { + pMaxHtPhy->field.MCS = i; + pMinHtPhy->field.MCS = i; + break; + } + if (i==0) + break; + } + } +#endif // CONFIG_STA_SUPPORT // + + + // Decide ht rate + pHtPhy->field.STBC = pMaxHtPhy->field.STBC; + pHtPhy->field.BW = pMaxHtPhy->field.BW; + pHtPhy->field.MODE = pMaxHtPhy->field.MODE; + pHtPhy->field.MCS = pMaxHtPhy->field.MCS; + pHtPhy->field.ShortGI = pMaxHtPhy->field.ShortGI; + + // use default now. rt2860 + if (pDesireHtPhy->MCSSet[0] != 0xff) + *auto_rate_cur_p = FALSE; + else + *auto_rate_cur_p = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateHtTxRates<---.AMsduSize = %d \n", pAd->CommonCfg.DesiredHtPhy.AmsduSize )); + DBGPRINT(RT_DEBUG_TRACE,("TX: MCS[0] = %x (choose %d), BW = %d, ShortGI = %d, MODE = %d, \n", pActiveHtPhy->MCSSet[0],pHtPhy->field.MCS, + pHtPhy->field.BW, pHtPhy->field.ShortGI, pHtPhy->field.MODE)); + DBGPRINT(RT_DEBUG_TRACE,("MlmeUpdateHtTxRates<=== \n")); +} + + +VOID BATableInit( + IN PRTMP_ADAPTER pAd, + IN BA_TABLE *Tab) +{ + int i; + + Tab->numAsOriginator = 0; + Tab->numAsRecipient = 0; + Tab->numDoneOriginator = 0; + NdisAllocateSpinLock(&pAd->BATabLock); + for (i = 0; i < MAX_LEN_OF_BA_REC_TABLE; i++) + { + Tab->BARecEntry[i].REC_BA_Status = Recipient_NONE; + NdisAllocateSpinLock(&(Tab->BARecEntry[i].RxReRingLock)); + } + for (i = 0; i < MAX_LEN_OF_BA_ORI_TABLE; i++) + { + Tab->BAOriEntry[i].ORI_BA_Status = Originator_NONE; + } +} + +VOID BATableExit( + IN RTMP_ADAPTER *pAd) +{ + int i; + for (i=0; i<MAX_LEN_OF_BA_REC_TABLE; i++) + { + NdisFreeSpinLock(&pAd->BATable.BARecEntry[i].RxReRingLock); + } + NdisFreeSpinLock(&pAd->BATabLock); +} +#endif // DOT11_N_SUPPORT // + +// IRQL = DISPATCH_LEVEL +VOID MlmeRadioOff( + IN PRTMP_ADAPTER pAd) +{ + RTMP_MLME_RADIO_OFF(pAd); +} + +// IRQL = DISPATCH_LEVEL +VOID MlmeRadioOn( + IN PRTMP_ADAPTER pAd) +{ + RTMP_MLME_RADIO_ON(pAd); +} + +// =========================================================================================== +// bss_table.c +// =========================================================================================== + + +/*! \brief initialize BSS table + * \param p_tab pointer to the table + * \return none + * \pre + * \post + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + */ +VOID BssTableInit( + IN BSS_TABLE *Tab) +{ + int i; + + Tab->BssNr = 0; + Tab->BssOverlapNr = 0; + + for (i = 0; i < MAX_LEN_OF_BSS_TABLE; i++) + { + UCHAR *pOldAddr = Tab->BssEntry[i].pVarIeFromProbRsp; + NdisZeroMemory(&Tab->BssEntry[i], sizeof(BSS_ENTRY)); + Tab->BssEntry[i].Rssi = -127; // initial the rssi as a minimum value + if (pOldAddr) + { + RTMPZeroMemory(pOldAddr, MAX_VIE_LEN); + Tab->BssEntry[i].pVarIeFromProbRsp = pOldAddr; + } + } +} + + +/*! \brief search the BSS table by SSID + * \param p_tab pointer to the bss table + * \param ssid SSID string + * \return index of the table, BSS_NOT_FOUND if not in the table + * \pre + * \post + * \note search by sequential search + + IRQL = DISPATCH_LEVEL + + */ +ULONG BssTableSearch( + IN BSS_TABLE *Tab, + IN PUCHAR pBssid, + IN UCHAR Channel) +{ + UCHAR i; + + for (i = 0; i < Tab->BssNr; i++) + { + // + // Some AP that support A/B/G mode that may used the same BSSID on 11A and 11B/G. + // We should distinguish this case. + // + if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) || + ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) && + MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid)) + { + return i; + } + } + return (ULONG)BSS_NOT_FOUND; +} + +ULONG BssSsidTableSearch( + IN BSS_TABLE *Tab, + IN PUCHAR pBssid, + IN PUCHAR pSsid, + IN UCHAR SsidLen, + IN UCHAR Channel) +{ + UCHAR i; + + for (i = 0; i < Tab->BssNr; i++) + { + // + // Some AP that support A/B/G mode that may used the same BSSID on 11A and 11B/G. + // We should distinguish this case. + // + if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) || + ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) && + MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid) && + SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, Tab->BssEntry[i].SsidLen)) + { + return i; + } + } + return (ULONG)BSS_NOT_FOUND; +} + +ULONG BssTableSearchWithSSID( + IN BSS_TABLE *Tab, + IN PUCHAR Bssid, + IN PUCHAR pSsid, + IN UCHAR SsidLen, + IN UCHAR Channel) +{ + UCHAR i; + + for (i = 0; i < Tab->BssNr; i++) + { + if ((((Tab->BssEntry[i].Channel <= 14) && (Channel <= 14)) || + ((Tab->BssEntry[i].Channel > 14) && (Channel > 14))) && + MAC_ADDR_EQUAL(&(Tab->BssEntry[i].Bssid), Bssid) && + (SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, Tab->BssEntry[i].SsidLen) || + (NdisEqualMemory(pSsid, ZeroSsid, SsidLen)) || + (NdisEqualMemory(Tab->BssEntry[i].Ssid, ZeroSsid, Tab->BssEntry[i].SsidLen)))) + { + return i; + } + } + return (ULONG)BSS_NOT_FOUND; +} + + +ULONG BssSsidTableSearchBySSID( + IN BSS_TABLE *Tab, + IN PUCHAR pSsid, + IN UCHAR SsidLen) +{ + UCHAR i; + + for (i = 0; i < Tab->BssNr; i++) + { + if (SSID_EQUAL(pSsid, SsidLen, Tab->BssEntry[i].Ssid, Tab->BssEntry[i].SsidLen)) + { + return i; + } + } + return (ULONG)BSS_NOT_FOUND; +} + + +// IRQL = DISPATCH_LEVEL +VOID BssTableDeleteEntry( + IN OUT BSS_TABLE *Tab, + IN PUCHAR pBssid, + IN UCHAR Channel) +{ + UCHAR i, j; + + for (i = 0; i < Tab->BssNr; i++) + { + if ((Tab->BssEntry[i].Channel == Channel) && + (MAC_ADDR_EQUAL(Tab->BssEntry[i].Bssid, pBssid))) + { + UCHAR *pOldAddr = NULL; + + for (j = i; j < Tab->BssNr - 1; j++) + { + pOldAddr = Tab->BssEntry[j].pVarIeFromProbRsp; + NdisMoveMemory(&(Tab->BssEntry[j]), &(Tab->BssEntry[j + 1]), sizeof(BSS_ENTRY)); + if (pOldAddr) + { + RTMPZeroMemory(pOldAddr, MAX_VIE_LEN); + NdisMoveMemory(pOldAddr, + Tab->BssEntry[j + 1].pVarIeFromProbRsp, + Tab->BssEntry[j + 1].VarIeFromProbeRspLen); + Tab->BssEntry[j].pVarIeFromProbRsp = pOldAddr; + } + } + + pOldAddr = Tab->BssEntry[Tab->BssNr - 1].pVarIeFromProbRsp; + NdisZeroMemory(&(Tab->BssEntry[Tab->BssNr - 1]), sizeof(BSS_ENTRY)); + if (pOldAddr) + { + RTMPZeroMemory(pOldAddr, MAX_VIE_LEN); + Tab->BssEntry[Tab->BssNr - 1].pVarIeFromProbRsp = pOldAddr; + } + + Tab->BssNr -= 1; + return; + } + } +} + +#ifdef DOT11_N_SUPPORT +/* + ======================================================================== + Routine Description: + Delete the Originator Entry in BAtable. Or decrease numAs Originator by 1 if needed. + + Arguments: + // IRQL = DISPATCH_LEVEL + ======================================================================== +*/ +VOID BATableDeleteORIEntry( + IN OUT PRTMP_ADAPTER pAd, + IN BA_ORI_ENTRY *pBAORIEntry) +{ + + if (pBAORIEntry->ORI_BA_Status != Originator_NONE) + { + NdisAcquireSpinLock(&pAd->BATabLock); + if (pBAORIEntry->ORI_BA_Status == Originator_Done) + { + pAd->BATable.numAsOriginator -= 1; + DBGPRINT(RT_DEBUG_TRACE, ("BATableDeleteORIEntry numAsOriginator= %ld\n", pAd->BATable.numAsRecipient)); + // Erase Bitmap flag. + } + pAd->MacTab.Content[pBAORIEntry->Wcid].TXBAbitmap &= (~(1<<(pBAORIEntry->TID) )); // If STA mode, erase flag here + pAd->MacTab.Content[pBAORIEntry->Wcid].BAOriWcidArray[pBAORIEntry->TID] = 0; // If STA mode, erase flag here + pBAORIEntry->ORI_BA_Status = Originator_NONE; + pBAORIEntry->Token = 1; + // Not clear Sequence here. + NdisReleaseSpinLock(&pAd->BATabLock); + } +} +#endif // DOT11_N_SUPPORT // + +/*! \brief + * \param + * \return + * \pre + * \post + + IRQL = DISPATCH_LEVEL + + */ +VOID BssEntrySet( + IN PRTMP_ADAPTER pAd, + OUT BSS_ENTRY *pBss, + IN PUCHAR pBssid, + IN CHAR Ssid[], + IN UCHAR SsidLen, + IN UCHAR BssType, + IN USHORT BeaconPeriod, + IN PCF_PARM pCfParm, + IN USHORT AtimWin, + IN USHORT CapabilityInfo, + IN UCHAR SupRate[], + IN UCHAR SupRateLen, + IN UCHAR ExtRate[], + IN UCHAR ExtRateLen, + IN HT_CAPABILITY_IE *pHtCapability, + IN ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE + IN UCHAR HtCapabilityLen, + IN UCHAR AddHtInfoLen, + IN UCHAR NewExtChanOffset, + IN UCHAR Channel, + IN CHAR Rssi, + IN LARGE_INTEGER TimeStamp, + IN UCHAR CkipFlag, + IN PEDCA_PARM pEdcaParm, + IN PQOS_CAPABILITY_PARM pQosCapability, + IN PQBSS_LOAD_PARM pQbssLoad, + IN USHORT LengthVIE, + IN PNDIS_802_11_VARIABLE_IEs pVIE) +{ + COPY_MAC_ADDR(pBss->Bssid, pBssid); + // Default Hidden SSID to be TRUE, it will be turned to FALSE after coping SSID + pBss->Hidden = 1; + if (SsidLen > 0) + { + // For hidden SSID AP, it might send beacon with SSID len equal to 0 + // Or send beacon /probe response with SSID len matching real SSID length, + // but SSID is all zero. such as "00-00-00-00" with length 4. + // We have to prevent this case overwrite correct table + if (NdisEqualMemory(Ssid, ZeroSsid, SsidLen) == 0) + { + NdisZeroMemory(pBss->Ssid, MAX_LEN_OF_SSID); + NdisMoveMemory(pBss->Ssid, Ssid, SsidLen); + pBss->SsidLen = SsidLen; + pBss->Hidden = 0; + } + } + else + { + /* avoid Hidden SSID form beacon to overwirite correct SSID from probe response */ + if (NdisEqualMemory(pBss->Ssid, ZeroSsid, pBss->SsidLen)) + { + NdisZeroMemory(pBss->Ssid, MAX_LEN_OF_SSID); + pBss->SsidLen = 0; + } + } + + pBss->BssType = BssType; + pBss->BeaconPeriod = BeaconPeriod; + if (BssType == BSS_INFRA) + { + if (pCfParm->bValid) + { + pBss->CfpCount = pCfParm->CfpCount; + pBss->CfpPeriod = pCfParm->CfpPeriod; + pBss->CfpMaxDuration = pCfParm->CfpMaxDuration; + pBss->CfpDurRemaining = pCfParm->CfpDurRemaining; + } + } + else + { + pBss->AtimWin = AtimWin; + } + + pBss->CapabilityInfo = CapabilityInfo; + // The privacy bit indicate security is ON, it maight be WEP, TKIP or AES + // Combine with AuthMode, they will decide the connection methods. + pBss->Privacy = CAP_IS_PRIVACY_ON(pBss->CapabilityInfo); + ASSERT(SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES); + if (SupRateLen <= MAX_LEN_OF_SUPPORTED_RATES) + NdisMoveMemory(pBss->SupRate, SupRate, SupRateLen); + else + NdisMoveMemory(pBss->SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES); + pBss->SupRateLen = SupRateLen; + ASSERT(ExtRateLen <= MAX_LEN_OF_SUPPORTED_RATES); + NdisMoveMemory(pBss->ExtRate, ExtRate, ExtRateLen); + pBss->NewExtChanOffset = NewExtChanOffset; + pBss->ExtRateLen = ExtRateLen; + pBss->Channel = Channel; + pBss->CentralChannel = Channel; + pBss->Rssi = Rssi; + // Update CkipFlag. if not exists, the value is 0x0 + pBss->CkipFlag = CkipFlag; + + // New for microsoft Fixed IEs + NdisMoveMemory(pBss->FixIEs.Timestamp, &TimeStamp, 8); + pBss->FixIEs.BeaconInterval = BeaconPeriod; + pBss->FixIEs.Capabilities = CapabilityInfo; + + // New for microsoft Variable IEs + if (LengthVIE != 0) + { + pBss->VarIELen = LengthVIE; + NdisMoveMemory(pBss->VarIEs, pVIE, pBss->VarIELen); + } + else + { + pBss->VarIELen = 0; + } + + pBss->AddHtInfoLen = 0; + pBss->HtCapabilityLen = 0; +#ifdef DOT11_N_SUPPORT + if (HtCapabilityLen> 0) + { + pBss->HtCapabilityLen = HtCapabilityLen; + NdisMoveMemory(&pBss->HtCapability, pHtCapability, HtCapabilityLen); + if (AddHtInfoLen > 0) + { + pBss->AddHtInfoLen = AddHtInfoLen; + NdisMoveMemory(&pBss->AddHtInfo, pAddHtInfo, AddHtInfoLen); + + if ((pAddHtInfo->ControlChan > 2)&& (pAddHtInfo->AddHtInfo.ExtChanOffset == EXTCHA_BELOW) && (pHtCapability->HtCapInfo.ChannelWidth == BW_40)) + { + pBss->CentralChannel = pAddHtInfo->ControlChan - 2; + } + else if ((pAddHtInfo->AddHtInfo.ExtChanOffset == EXTCHA_ABOVE) && (pHtCapability->HtCapInfo.ChannelWidth == BW_40)) + { + pBss->CentralChannel = pAddHtInfo->ControlChan + 2; + } + } + } +#endif // DOT11_N_SUPPORT // + + BssCipherParse(pBss); + + // new for QOS + if (pEdcaParm) + NdisMoveMemory(&pBss->EdcaParm, pEdcaParm, sizeof(EDCA_PARM)); + else + pBss->EdcaParm.bValid = FALSE; + if (pQosCapability) + NdisMoveMemory(&pBss->QosCapability, pQosCapability, sizeof(QOS_CAPABILITY_PARM)); + else + pBss->QosCapability.bValid = FALSE; + if (pQbssLoad) + NdisMoveMemory(&pBss->QbssLoad, pQbssLoad, sizeof(QBSS_LOAD_PARM)); + else + pBss->QbssLoad.bValid = FALSE; + + { + PEID_STRUCT pEid; + USHORT Length = 0; + + +#ifdef CONFIG_STA_SUPPORT + NdisZeroMemory(&pBss->WpaIE.IE[0], MAX_CUSTOM_LEN); + NdisZeroMemory(&pBss->RsnIE.IE[0], MAX_CUSTOM_LEN); +#ifdef EXT_BUILD_CHANNEL_LIST + NdisZeroMemory(&pBss->CountryString[0], 3); + pBss->bHasCountryIE = FALSE; +#endif // EXT_BUILD_CHANNEL_LIST // +#endif // CONFIG_STA_SUPPORT // + pEid = (PEID_STRUCT) pVIE; + while ((Length + 2 + (USHORT)pEid->Len) <= LengthVIE) + { + switch(pEid->Eid) + { + case IE_WPA: + +#ifdef CONFIG_STA_SUPPORT + if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) + { + if ((pEid->Len + 2) > MAX_CUSTOM_LEN) + { + pBss->WpaIE.IELen = 0; + break; + } + pBss->WpaIE.IELen = pEid->Len + 2; + NdisMoveMemory(pBss->WpaIE.IE, pEid, pBss->WpaIE.IELen); + } + break; +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + case IE_RSN: + if (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3)) + { + if ((pEid->Len + 2) > MAX_CUSTOM_LEN) + { + pBss->RsnIE.IELen = 0; + break; + } + pBss->RsnIE.IELen = pEid->Len + 2; + NdisMoveMemory(pBss->RsnIE.IE, pEid, pBss->RsnIE.IELen); + } + break; +#ifdef EXT_BUILD_CHANNEL_LIST + case IE_COUNTRY: + NdisMoveMemory(&pBss->CountryString[0], pEid->Octet, 3); + pBss->bHasCountryIE = TRUE; + break; +#endif // EXT_BUILD_CHANNEL_LIST // +#endif // CONFIG_STA_SUPPORT // + } + Length = Length + 2 + (USHORT)pEid->Len; // Eid[1] + Len[1]+ content[Len] + pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); + } + } +} + +/*! + * \brief insert an entry into the bss table + * \param p_tab The BSS table + * \param Bssid BSSID + * \param ssid SSID + * \param ssid_len Length of SSID + * \param bss_type + * \param beacon_period + * \param timestamp + * \param p_cf + * \param atim_win + * \param cap + * \param rates + * \param rates_len + * \param channel_idx + * \return none + * \pre + * \post + * \note If SSID is identical, the old entry will be replaced by the new one + + IRQL = DISPATCH_LEVEL + + */ +ULONG BssTableSetEntry( + IN PRTMP_ADAPTER pAd, + OUT BSS_TABLE *Tab, + IN PUCHAR pBssid, + IN CHAR Ssid[], + IN UCHAR SsidLen, + IN UCHAR BssType, + IN USHORT BeaconPeriod, + IN CF_PARM *CfParm, + IN USHORT AtimWin, + IN USHORT CapabilityInfo, + IN UCHAR SupRate[], + IN UCHAR SupRateLen, + IN UCHAR ExtRate[], + IN UCHAR ExtRateLen, + IN HT_CAPABILITY_IE *pHtCapability, + IN ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE + IN UCHAR HtCapabilityLen, + IN UCHAR AddHtInfoLen, + IN UCHAR NewExtChanOffset, + IN UCHAR ChannelNo, + IN CHAR Rssi, + IN LARGE_INTEGER TimeStamp, + IN UCHAR CkipFlag, + IN PEDCA_PARM pEdcaParm, + IN PQOS_CAPABILITY_PARM pQosCapability, + IN PQBSS_LOAD_PARM pQbssLoad, + IN USHORT LengthVIE, + IN PNDIS_802_11_VARIABLE_IEs pVIE) +{ + ULONG Idx; + + //Idx = BssTableSearchWithSSID(Tab, pBssid, (UCHAR *)Ssid, SsidLen, ChannelNo); + Idx = BssTableSearch(Tab, pBssid, ChannelNo); + if (Idx == BSS_NOT_FOUND) + { + if (Tab->BssNr >= MAX_LEN_OF_BSS_TABLE) + { + // + // It may happen when BSS Table was full. + // The desired AP will not be added into BSS Table + // In this case, if we found the desired AP then overwrite BSS Table. + // + if(!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) + { + if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, pBssid) || + SSID_EQUAL(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, Ssid, SsidLen)) + { + Idx = Tab->BssOverlapNr; + BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid, SsidLen, BssType, BeaconPeriod, CfParm, AtimWin, + CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen,pHtCapability, pAddHtInfo,HtCapabilityLen, AddHtInfoLen, + NewExtChanOffset, ChannelNo, Rssi, TimeStamp, CkipFlag, pEdcaParm, pQosCapability, pQbssLoad, LengthVIE, pVIE); + Tab->BssOverlapNr = (Tab->BssOverlapNr++) % MAX_LEN_OF_BSS_TABLE; + } + return Idx; + } + else + { + return BSS_NOT_FOUND; + } + } + Idx = Tab->BssNr; + BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid, SsidLen, BssType, BeaconPeriod, CfParm, AtimWin, + CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen,pHtCapability, pAddHtInfo,HtCapabilityLen, AddHtInfoLen, + NewExtChanOffset, ChannelNo, Rssi, TimeStamp, CkipFlag, pEdcaParm, pQosCapability, pQbssLoad, LengthVIE, pVIE); + Tab->BssNr++; + } + else + { + BssEntrySet(pAd, &Tab->BssEntry[Idx], pBssid, Ssid, SsidLen, BssType, BeaconPeriod,CfParm, AtimWin, + CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen,pHtCapability, pAddHtInfo,HtCapabilityLen, AddHtInfoLen, + NewExtChanOffset, ChannelNo, Rssi, TimeStamp, CkipFlag, pEdcaParm, pQosCapability, pQbssLoad, LengthVIE, pVIE); + } + + return Idx; +} + +#ifdef CONFIG_STA_SUPPORT +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 +VOID TriEventInit( + IN PRTMP_ADAPTER pAd) +{ + UCHAR i; + + for (i = 0;i < MAX_TRIGGER_EVENT;i++) + pAd->CommonCfg.TriggerEventTab.EventA[i].bValid = FALSE; + + pAd->CommonCfg.TriggerEventTab.EventANo = 0; + pAd->CommonCfg.TriggerEventTab.EventBCountDown = 0; +} + +INT TriEventTableSetEntry( + IN PRTMP_ADAPTER pAd, + OUT TRIGGER_EVENT_TAB *Tab, + IN PUCHAR pBssid, + IN HT_CAPABILITY_IE *pHtCapability, + IN UCHAR HtCapabilityLen, + IN UCHAR RegClass, + IN UCHAR ChannelNo) +{ + // Event A, legacy AP exist. + if (HtCapabilityLen == 0) + { + UCHAR index; + + /* + Check if we already set this entry in the Event Table. + */ + for (index = 0; index<MAX_TRIGGER_EVENT; index++) + { + if ((Tab->EventA[index].bValid == TRUE) && + (Tab->EventA[index].Channel == ChannelNo) && + (Tab->EventA[index].RegClass == RegClass) + ) + { + DBGPRINT(RT_DEBUG_TRACE, ("ReturnDueToAlreadyInserted(EventIdx=%d,Ch=%d,Reg=%d)\n", + index, ChannelNo, RegClass)); + return 0; + } + } + + /* + If not set, add it to the Event table + */ + if (Tab->EventANo < MAX_TRIGGER_EVENT) + { + RTMPMoveMemory(Tab->EventA[Tab->EventANo].BSSID, pBssid, 6); + Tab->EventA[Tab->EventANo].bValid = TRUE; + Tab->EventA[Tab->EventANo].Channel = ChannelNo; + if (RegClass != 0) + { + // Beacon has Regulatory class IE. So use beacon's + Tab->EventA[Tab->EventANo].RegClass = RegClass; + } + else + { + // Use Station's Regulatory class instead. + // If no Reg Class in Beacon, set to "unknown" + // TODO: Need to check if this's valid + Tab->EventA[Tab->EventANo].RegClass = 0; // ????????????????? need to check + } + + DBGPRINT(RT_DEBUG_TRACE, ("Insert EventA Entry(EvtIdx=%d,Ch=%d,Reg=%d,Mac=%02x:%02x:%02x:%02x:%02x:%02x\n", + Tab->EventANo, ChannelNo, RegClass, PRINT_MAC(pBssid))); + Tab->EventANo ++; + } + } + else if (pHtCapability->HtCapInfo.Forty_Mhz_Intolerant) + { + // Event B. My BSS beacon has Intolerant40 bit set + DBGPRINT(RT_DEBUG_TRACE, ("Mac(%02x:%02x:%02x:%02x:%02x:%02x)set 40MHzIntolerant,Change EventBCD=%ld\n", + PRINT_MAC(pBssid), pAd->CommonCfg.Dot11BssWidthChanTranDelay)); + Tab->EventBCountDown = pAd->CommonCfg.Dot11BssWidthChanTranDelay; + } + + return 0; +} +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +// IRQL = DISPATCH_LEVEL +VOID BssTableSsidSort( + IN PRTMP_ADAPTER pAd, + OUT BSS_TABLE *OutTab, + IN CHAR Ssid[], + IN UCHAR SsidLen) +{ + INT i; + BssTableInit(OutTab); + + if ((SsidLen == 0) && + (pAd->StaCfg.bAutoConnectIfNoSSID == FALSE)) + return; + + for (i = 0; i < pAd->ScanTab.BssNr; i++) + { + BSS_ENTRY *pInBss = &pAd->ScanTab.BssEntry[i]; + BOOLEAN bIsHiddenApIncluded = FALSE; + + if (((pAd->CommonCfg.bIEEE80211H == 1) && + RadarChannelCheck(pAd, pInBss->Channel)) +#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier + || (pAd->CommonCfg.CarrierDetect.Enable == TRUE) +#endif // CARRIER_DETECTION_SUPPORT // + ) + { + if (pInBss->Hidden) + bIsHiddenApIncluded = TRUE; + } + + if ((pInBss->BssType == pAd->StaCfg.BssType) && + (SSID_EQUAL(Ssid, SsidLen, pInBss->Ssid, pInBss->SsidLen) || bIsHiddenApIncluded)) + { + BSS_ENTRY *pOutBss = &OutTab->BssEntry[OutTab->BssNr]; + +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP & 0x80) + { + // copy matching BSS from InTab to OutTab + NdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY)); + OutTab->BssNr++; + continue; + } +#endif // WPA_SUPPLICANT_SUPPORT // + + +#ifdef EXT_BUILD_CHANNEL_LIST + // If no Country IE exists no Connection will be established when IEEE80211dClientMode is strict. + if ((pAd->StaCfg.IEEE80211dClientMode == Rt802_11_D_Strict) && + (pInBss->bHasCountryIE == FALSE)) + { + DBGPRINT(RT_DEBUG_TRACE,("StaCfg.IEEE80211dClientMode == Rt802_11_D_Strict, but this AP doesn't have country IE.\n")); + continue; + } +#endif // EXT_BUILD_CHANNEL_LIST // + +#ifdef DOT11_N_SUPPORT + // 2.4G/5G N only mode + if ((pInBss->HtCapabilityLen == 0) && + ((pAd->CommonCfg.PhyMode == PHY_11N_2_4G) || (pAd->CommonCfg.PhyMode == PHY_11N_5G))) + { + DBGPRINT(RT_DEBUG_TRACE,("STA is in N-only Mode, this AP don't have Ht capability in Beacon.\n")); + continue; + } + + if ((pAd->CommonCfg.PhyMode == PHY_11GN_MIXED) && + ((pInBss->SupRateLen + pInBss->ExtRateLen) < 12)) + { + DBGPRINT(RT_DEBUG_TRACE,("STA is in GN-only Mode, this AP is in B mode.\n")); + continue; + } +#endif // DOT11_N_SUPPORT // + + // New for WPA2 + // Check the Authmode first + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + { + // Check AuthMode and AuthModeAux for matching, in case AP support dual-mode + if ((pAd->StaCfg.AuthMode != pInBss->AuthMode) && (pAd->StaCfg.AuthMode != pInBss->AuthModeAux)) + // None matched + continue; + + // Check cipher suite, AP must have more secured cipher than station setting + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) + { + // If it's not mixed mode, we should only let BSS pass with the same encryption + if (pInBss->WPA.bMixMode == FALSE) + if (pAd->StaCfg.WepStatus != pInBss->WPA.GroupCipher) + continue; + + // check group cipher + if ((pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) && + (pInBss->WPA.GroupCipher != Ndis802_11GroupWEP40Enabled) && + (pInBss->WPA.GroupCipher != Ndis802_11GroupWEP104Enabled)) + continue; + + // check pairwise cipher, skip if none matched + // If profile set to AES, let it pass without question. + // If profile set to TKIP, we must find one mateched + if ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) && + (pAd->StaCfg.WepStatus != pInBss->WPA.PairCipher) && + (pAd->StaCfg.WepStatus != pInBss->WPA.PairCipherAux)) + continue; + } + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + // If it's not mixed mode, we should only let BSS pass with the same encryption + if (pInBss->WPA2.bMixMode == FALSE) + if (pAd->StaCfg.WepStatus != pInBss->WPA2.GroupCipher) + continue; + + // check group cipher + if ((pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) && + (pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP40Enabled) && + (pInBss->WPA2.GroupCipher != Ndis802_11GroupWEP104Enabled)) + continue; + + // check pairwise cipher, skip if none matched + // If profile set to AES, let it pass without question. + // If profile set to TKIP, we must find one mateched + if ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) && + (pAd->StaCfg.WepStatus != pInBss->WPA2.PairCipher) && + (pAd->StaCfg.WepStatus != pInBss->WPA2.PairCipherAux)) + continue; + } + } + // Bss Type matched, SSID matched. + // We will check wepstatus for qualification Bss + else if (pAd->StaCfg.WepStatus != pInBss->WepStatus) + { + DBGPRINT(RT_DEBUG_TRACE,("StaCfg.WepStatus=%d, while pInBss->WepStatus=%d\n", pAd->StaCfg.WepStatus, pInBss->WepStatus)); + // + // For the SESv2 case, we will not qualify WepStatus. + // + if (!pInBss->bSES) + continue; + } + + // Since the AP is using hidden SSID, and we are trying to connect to ANY + // It definitely will fail. So, skip it. + // CCX also require not even try to connect it!! + if (SsidLen == 0) + continue; + + // copy matching BSS from InTab to OutTab + NdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY)); + + OutTab->BssNr++; + } + else if ((pInBss->BssType == pAd->StaCfg.BssType) && (SsidLen == 0)) + { + BSS_ENTRY *pOutBss = &OutTab->BssEntry[OutTab->BssNr]; + + +#ifdef DOT11_N_SUPPORT + // 2.4G/5G N only mode + if ((pInBss->HtCapabilityLen == 0) && + ((pAd->CommonCfg.PhyMode == PHY_11N_2_4G) || (pAd->CommonCfg.PhyMode == PHY_11N_5G))) + { + DBGPRINT(RT_DEBUG_TRACE,("STA is in N-only Mode, this AP don't have Ht capability in Beacon.\n")); + continue; + } + + if ((pAd->CommonCfg.PhyMode == PHY_11GN_MIXED) && + ((pInBss->SupRateLen + pInBss->ExtRateLen) < 12)) + { + DBGPRINT(RT_DEBUG_TRACE,("STA is in GN-only Mode, this AP is in B mode.\n")); + continue; + } +#endif // DOT11_N_SUPPORT // + + // New for WPA2 + // Check the Authmode first + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + { + // Check AuthMode and AuthModeAux for matching, in case AP support dual-mode + if ((pAd->StaCfg.AuthMode != pInBss->AuthMode) && (pAd->StaCfg.AuthMode != pInBss->AuthModeAux)) + // None matched + continue; + + // Check cipher suite, AP must have more secured cipher than station setting + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) + { + // If it's not mixed mode, we should only let BSS pass with the same encryption + if (pInBss->WPA.bMixMode == FALSE) + if (pAd->StaCfg.WepStatus != pInBss->WPA.GroupCipher) + continue; + + // check group cipher + if (pAd->StaCfg.WepStatus < pInBss->WPA.GroupCipher) + continue; + + // check pairwise cipher, skip if none matched + // If profile set to AES, let it pass without question. + // If profile set to TKIP, we must find one mateched + if ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) && + (pAd->StaCfg.WepStatus != pInBss->WPA.PairCipher) && + (pAd->StaCfg.WepStatus != pInBss->WPA.PairCipherAux)) + continue; + } + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + // If it's not mixed mode, we should only let BSS pass with the same encryption + if (pInBss->WPA2.bMixMode == FALSE) + if (pAd->StaCfg.WepStatus != pInBss->WPA2.GroupCipher) + continue; + + // check group cipher + if (pAd->StaCfg.WepStatus < pInBss->WPA2.GroupCipher) + continue; + + // check pairwise cipher, skip if none matched + // If profile set to AES, let it pass without question. + // If profile set to TKIP, we must find one mateched + if ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) && + (pAd->StaCfg.WepStatus != pInBss->WPA2.PairCipher) && + (pAd->StaCfg.WepStatus != pInBss->WPA2.PairCipherAux)) + continue; + } + } + // Bss Type matched, SSID matched. + // We will check wepstatus for qualification Bss + else if (pAd->StaCfg.WepStatus != pInBss->WepStatus) + continue; + + // copy matching BSS from InTab to OutTab + NdisMoveMemory(pOutBss, pInBss, sizeof(BSS_ENTRY)); + + OutTab->BssNr++; + } + + if (OutTab->BssNr >= MAX_LEN_OF_BSS_TABLE) + break; + } + + BssTableSortByRssi(OutTab); +} + + +// IRQL = DISPATCH_LEVEL +VOID BssTableSortByRssi( + IN OUT BSS_TABLE *OutTab) +{ + INT i, j; + BSS_ENTRY TmpBss; + + for (i = 0; i < OutTab->BssNr - 1; i++) + { + for (j = i+1; j < OutTab->BssNr; j++) + { + if (OutTab->BssEntry[j].Rssi > OutTab->BssEntry[i].Rssi) + { + NdisMoveMemory(&TmpBss, &OutTab->BssEntry[j], sizeof(BSS_ENTRY)); + NdisMoveMemory(&OutTab->BssEntry[j], &OutTab->BssEntry[i], sizeof(BSS_ENTRY)); + NdisMoveMemory(&OutTab->BssEntry[i], &TmpBss, sizeof(BSS_ENTRY)); + } + } + } +} +#endif // CONFIG_STA_SUPPORT // + + +VOID BssCipherParse( + IN OUT PBSS_ENTRY pBss) +{ + PEID_STRUCT pEid; + PUCHAR pTmp; + PRSN_IE_HEADER_STRUCT pRsnHeader; + PCIPHER_SUITE_STRUCT pCipher; + PAKM_SUITE_STRUCT pAKM; + USHORT Count; + INT Length; + NDIS_802_11_ENCRYPTION_STATUS TmpCipher; + + // + // WepStatus will be reset later, if AP announce TKIP or AES on the beacon frame. + // + if (pBss->Privacy) + { + pBss->WepStatus = Ndis802_11WEPEnabled; + } + else + { + pBss->WepStatus = Ndis802_11WEPDisabled; + } + // Set default to disable & open authentication before parsing variable IE + pBss->AuthMode = Ndis802_11AuthModeOpen; + pBss->AuthModeAux = Ndis802_11AuthModeOpen; + + // Init WPA setting + pBss->WPA.PairCipher = Ndis802_11WEPDisabled; + pBss->WPA.PairCipherAux = Ndis802_11WEPDisabled; + pBss->WPA.GroupCipher = Ndis802_11WEPDisabled; + pBss->WPA.RsnCapability = 0; + pBss->WPA.bMixMode = FALSE; + + // Init WPA2 setting + pBss->WPA2.PairCipher = Ndis802_11WEPDisabled; + pBss->WPA2.PairCipherAux = Ndis802_11WEPDisabled; + pBss->WPA2.GroupCipher = Ndis802_11WEPDisabled; + pBss->WPA2.RsnCapability = 0; + pBss->WPA2.bMixMode = FALSE; + + + Length = (INT) pBss->VarIELen; + + while (Length > 0) + { + // Parse cipher suite base on WPA1 & WPA2, they should be parsed differently + pTmp = ((PUCHAR) pBss->VarIEs) + pBss->VarIELen - Length; + pEid = (PEID_STRUCT) pTmp; + switch (pEid->Eid) + { + case IE_WPA: + if (NdisEqualMemory(pEid->Octet, SES_OUI, 3) && (pEid->Len == 7)) + { + pBss->bSES = TRUE; + break; + } + else if (NdisEqualMemory(pEid->Octet, WPA_OUI, 4) != 1) + { + // if unsupported vendor specific IE + break; + } + // Skip OUI, version, and multicast suite + // This part should be improved in the future when AP supported multiple cipher suite. + // For now, it's OK since almost all APs have fixed cipher suite supported. + // pTmp = (PUCHAR) pEid->Octet; + pTmp += 11; + + // Cipher Suite Selectors from Spec P802.11i/D3.2 P26. + // Value Meaning + // 0 None + // 1 WEP-40 + // 2 Tkip + // 3 WRAP + // 4 AES + // 5 WEP-104 + // Parse group cipher + switch (*pTmp) + { + case 1: + pBss->WPA.GroupCipher = Ndis802_11GroupWEP40Enabled; + break; + case 5: + pBss->WPA.GroupCipher = Ndis802_11GroupWEP104Enabled; + break; + case 2: + pBss->WPA.GroupCipher = Ndis802_11Encryption2Enabled; + break; + case 4: + pBss->WPA.GroupCipher = Ndis802_11Encryption3Enabled; + break; + default: + break; + } + // number of unicast suite + pTmp += 1; + + // skip all unicast cipher suites + //Count = *(PUSHORT) pTmp; + Count = (pTmp[1]<<8) + pTmp[0]; + pTmp += sizeof(USHORT); + + // Parsing all unicast cipher suite + while (Count > 0) + { + // Skip OUI + pTmp += 3; + TmpCipher = Ndis802_11WEPDisabled; + switch (*pTmp) + { + case 1: + case 5: // Although WEP is not allowed in WPA related auth mode, we parse it anyway + TmpCipher = Ndis802_11Encryption1Enabled; + break; + case 2: + TmpCipher = Ndis802_11Encryption2Enabled; + break; + case 4: + TmpCipher = Ndis802_11Encryption3Enabled; + break; + default: + break; + } + if (TmpCipher > pBss->WPA.PairCipher) + { + // Move the lower cipher suite to PairCipherAux + pBss->WPA.PairCipherAux = pBss->WPA.PairCipher; + pBss->WPA.PairCipher = TmpCipher; + } + else + { + pBss->WPA.PairCipherAux = TmpCipher; + } + pTmp++; + Count--; + } + + // 4. get AKM suite counts + //Count = *(PUSHORT) pTmp; + Count = (pTmp[1]<<8) + pTmp[0]; + pTmp += sizeof(USHORT); + pTmp += 3; + + switch (*pTmp) + { + case 1: + // Set AP support WPA-enterprise mode + if (pBss->AuthMode == Ndis802_11AuthModeOpen) + pBss->AuthMode = Ndis802_11AuthModeWPA; + else + pBss->AuthModeAux = Ndis802_11AuthModeWPA; + break; + case 2: + // Set AP support WPA-PSK mode + if (pBss->AuthMode == Ndis802_11AuthModeOpen) + pBss->AuthMode = Ndis802_11AuthModeWPAPSK; + else + pBss->AuthModeAux = Ndis802_11AuthModeWPAPSK; + break; + default: + break; + } + pTmp += 1; + + // Fixed for WPA-None + if (pBss->BssType == BSS_ADHOC) + { + pBss->AuthMode = Ndis802_11AuthModeWPANone; + pBss->AuthModeAux = Ndis802_11AuthModeWPANone; + pBss->WepStatus = pBss->WPA.GroupCipher; + // Patched bugs for old driver + if (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled) + pBss->WPA.PairCipherAux = pBss->WPA.GroupCipher; + } + else + pBss->WepStatus = pBss->WPA.PairCipher; + + // Check the Pair & Group, if different, turn on mixed mode flag + if (pBss->WPA.GroupCipher != pBss->WPA.PairCipher) + pBss->WPA.bMixMode = TRUE; + + break; + + case IE_RSN: + pRsnHeader = (PRSN_IE_HEADER_STRUCT) pTmp; + + // 0. Version must be 1 + if (le2cpu16(pRsnHeader->Version) != 1) + break; + pTmp += sizeof(RSN_IE_HEADER_STRUCT); + + // 1. Check group cipher + pCipher = (PCIPHER_SUITE_STRUCT) pTmp; + if (!RTMPEqualMemory(pTmp, RSN_OUI, 3)) + break; + + // Parse group cipher + switch (pCipher->Type) + { + case 1: + pBss->WPA2.GroupCipher = Ndis802_11GroupWEP40Enabled; + break; + case 5: + pBss->WPA2.GroupCipher = Ndis802_11GroupWEP104Enabled; + break; + case 2: + pBss->WPA2.GroupCipher = Ndis802_11Encryption2Enabled; + break; + case 4: + pBss->WPA2.GroupCipher = Ndis802_11Encryption3Enabled; + break; + default: + break; + } + // set to correct offset for next parsing + pTmp += sizeof(CIPHER_SUITE_STRUCT); + + // 2. Get pairwise cipher counts + //Count = *(PUSHORT) pTmp; + Count = (pTmp[1]<<8) + pTmp[0]; + pTmp += sizeof(USHORT); + + // 3. Get pairwise cipher + // Parsing all unicast cipher suite + while (Count > 0) + { + // Skip OUI + pCipher = (PCIPHER_SUITE_STRUCT) pTmp; + TmpCipher = Ndis802_11WEPDisabled; + switch (pCipher->Type) + { + case 1: + case 5: // Although WEP is not allowed in WPA related auth mode, we parse it anyway + TmpCipher = Ndis802_11Encryption1Enabled; + break; + case 2: + TmpCipher = Ndis802_11Encryption2Enabled; + break; + case 4: + TmpCipher = Ndis802_11Encryption3Enabled; + break; + default: + break; + } + if (TmpCipher > pBss->WPA2.PairCipher) + { + // Move the lower cipher suite to PairCipherAux + pBss->WPA2.PairCipherAux = pBss->WPA2.PairCipher; + pBss->WPA2.PairCipher = TmpCipher; + } + else + { + pBss->WPA2.PairCipherAux = TmpCipher; + } + pTmp += sizeof(CIPHER_SUITE_STRUCT); + Count--; + } + + // 4. get AKM suite counts + //Count = *(PUSHORT) pTmp; + Count = (pTmp[1]<<8) + pTmp[0]; + pTmp += sizeof(USHORT); + + // 5. Get AKM ciphers + // Parsing all AKM ciphers + while (Count > 0) + { + pAKM = (PAKM_SUITE_STRUCT) pTmp; + if (!RTMPEqualMemory(pTmp, RSN_OUI, 3)) + break; + + switch (pAKM->Type) + { + case 0: + if (pBss->AuthMode == Ndis802_11AuthModeOpen) + pBss->AuthMode = Ndis802_11AuthModeWPANone; + else + pBss->AuthModeAux = Ndis802_11AuthModeWPANone; + break; + case 1: + // Set AP support WPA-enterprise mode + if (pBss->AuthMode == Ndis802_11AuthModeOpen) + pBss->AuthMode = Ndis802_11AuthModeWPA2; + else + pBss->AuthModeAux = Ndis802_11AuthModeWPA2; + break; + case 2: + // Set AP support WPA-PSK mode + if (pBss->AuthMode == Ndis802_11AuthModeOpen) + pBss->AuthMode = Ndis802_11AuthModeWPA2PSK; + else + pBss->AuthModeAux = Ndis802_11AuthModeWPA2PSK; + break; + default: + if (pBss->AuthMode == Ndis802_11AuthModeOpen) + pBss->AuthMode = Ndis802_11AuthModeMax; + else + pBss->AuthModeAux = Ndis802_11AuthModeMax; + break; + } + pTmp += (Count * sizeof(AKM_SUITE_STRUCT)); + Count--; + } + + // Fixed for WPA-None + if (pBss->BssType == BSS_ADHOC) + { + pBss->WPA.PairCipherAux = pBss->WPA2.PairCipherAux; + pBss->WPA.GroupCipher = pBss->WPA2.GroupCipher; + pBss->WepStatus = pBss->WPA.GroupCipher; + // Patched bugs for old driver + if (pBss->WPA.PairCipherAux == Ndis802_11WEPDisabled) + pBss->WPA.PairCipherAux = pBss->WPA.GroupCipher; + } + pBss->WepStatus = pBss->WPA2.PairCipher; + + // 6. Get RSN capability + //pBss->WPA2.RsnCapability = *(PUSHORT) pTmp; + pBss->WPA2.RsnCapability = (pTmp[1]<<8) + pTmp[0]; + pTmp += sizeof(USHORT); + + // Check the Pair & Group, if different, turn on mixed mode flag + if (pBss->WPA2.GroupCipher != pBss->WPA2.PairCipher) + pBss->WPA2.bMixMode = TRUE; + + break; + default: + break; + } + Length -= (pEid->Len + 2); + } +} + +// =========================================================================================== +// mac_table.c +// =========================================================================================== + +/*! \brief generates a random mac address value for IBSS BSSID + * \param Addr the bssid location + * \return none + * \pre + * \post + */ +VOID MacAddrRandomBssid( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pAddr) +{ + INT i; + + for (i = 0; i < MAC_ADDR_LEN; i++) + { + pAddr[i] = RandomByte(pAd); + } + + pAddr[0] = (pAddr[0] & 0xfe) | 0x02; // the first 2 bits must be 01xxxxxxxx +} + +/*! \brief init the management mac frame header + * \param p_hdr mac header + * \param subtype subtype of the frame + * \param p_ds destination address, don't care if it is a broadcast address + * \return none + * \pre the station has the following information in the pAd->StaCfg + * - bssid + * - station address + * \post + * \note this function initializes the following field + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + */ +VOID MgtMacHeaderInit( + IN PRTMP_ADAPTER pAd, + IN OUT PHEADER_802_11 pHdr80211, + IN UCHAR SubType, + IN UCHAR ToDs, + IN PUCHAR pDA, + IN PUCHAR pBssid) +{ + NdisZeroMemory(pHdr80211, sizeof(HEADER_802_11)); + + pHdr80211->FC.Type = BTYPE_MGMT; + pHdr80211->FC.SubType = SubType; +// if (SubType == SUBTYPE_ACK) // sample, no use, it will conflict with ACTION frame sub type +// pHdr80211->FC.Type = BTYPE_CNTL; + pHdr80211->FC.ToDs = ToDs; + COPY_MAC_ADDR(pHdr80211->Addr1, pDA); +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + COPY_MAC_ADDR(pHdr80211->Addr2, pAd->CurrentAddress); +#endif // CONFIG_STA_SUPPORT // + COPY_MAC_ADDR(pHdr80211->Addr3, pBssid); +} + +// =========================================================================================== +// mem_mgmt.c +// =========================================================================================== + +/*!*************************************************************************** + * This routine build an outgoing frame, and fill all information specified + * in argument list to the frame body. The actual frame size is the summation + * of all arguments. + * input params: + * Buffer - pointer to a pre-allocated memory segment + * args - a list of <int arg_size, arg> pairs. + * NOTE NOTE NOTE!!!! the last argument must be NULL, otherwise this + * function will FAIL!!! + * return: + * Size of the buffer + * usage: + * MakeOutgoingFrame(Buffer, output_length, 2, &fc, 2, &dur, 6, p_addr1, 6,p_addr2, END_OF_ARGS); + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ****************************************************************************/ +ULONG MakeOutgoingFrame( + OUT UCHAR *Buffer, + OUT ULONG *FrameLen, ...) +{ + UCHAR *p; + int leng; + ULONG TotLeng; + va_list Args; + + // calculates the total length + TotLeng = 0; + va_start(Args, FrameLen); + do + { + leng = va_arg(Args, int); + if (leng == END_OF_ARGS) + { + break; + } + p = va_arg(Args, PVOID); + NdisMoveMemory(&Buffer[TotLeng], p, leng); + TotLeng = TotLeng + leng; + } while(TRUE); + + va_end(Args); /* clean up */ + *FrameLen = TotLeng; + return TotLeng; +} + +// =========================================================================================== +// mlme_queue.c +// =========================================================================================== + +/*! \brief Initialize The MLME Queue, used by MLME Functions + * \param *Queue The MLME Queue + * \return Always Return NDIS_STATE_SUCCESS in this implementation + * \pre + * \post + * \note Because this is done only once (at the init stage), no need to be locked + + IRQL = PASSIVE_LEVEL + + */ +NDIS_STATUS MlmeQueueInit( + IN MLME_QUEUE *Queue) +{ + INT i; + + NdisAllocateSpinLock(&Queue->Lock); + + Queue->Num = 0; + Queue->Head = 0; + Queue->Tail = 0; + + for (i = 0; i < MAX_LEN_OF_MLME_QUEUE; i++) + { + Queue->Entry[i].Occupied = FALSE; + Queue->Entry[i].MsgLen = 0; + NdisZeroMemory(Queue->Entry[i].Msg, MGMT_DMA_BUFFER_SIZE); + } + + return NDIS_STATUS_SUCCESS; +} + +/*! \brief Enqueue a message for other threads, if they want to send messages to MLME thread + * \param *Queue The MLME Queue + * \param Machine The State Machine Id + * \param MsgType The Message Type + * \param MsgLen The Message length + * \param *Msg The message pointer + * \return TRUE if enqueue is successful, FALSE if the queue is full + * \pre + * \post + * \note The message has to be initialized + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + */ +BOOLEAN MlmeEnqueue( + IN PRTMP_ADAPTER pAd, + IN ULONG Machine, + IN ULONG MsgType, + IN ULONG MsgLen, + IN VOID *Msg, + IN ULONG Priv) +{ + INT Tail; + MLME_QUEUE *Queue = (MLME_QUEUE *)&pAd->Mlme.Queue; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return FALSE; + + // First check the size, it MUST not exceed the mlme queue size + if (MsgLen > MGMT_DMA_BUFFER_SIZE) + { + DBGPRINT_ERR(("MlmeEnqueue: msg too large, size = %ld \n", MsgLen)); + return FALSE; + } + + if (MlmeQueueFull(Queue)) + { + return FALSE; + } + + NdisAcquireSpinLock(&(Queue->Lock)); + Tail = Queue->Tail; + Queue->Tail++; + Queue->Num++; + if (Queue->Tail == MAX_LEN_OF_MLME_QUEUE) + { + Queue->Tail = 0; + } + + Queue->Entry[Tail].Wcid = RESERVED_WCID; + Queue->Entry[Tail].Occupied = TRUE; + Queue->Entry[Tail].Machine = Machine; + Queue->Entry[Tail].MsgType = MsgType; + Queue->Entry[Tail].MsgLen = MsgLen; + Queue->Entry[Tail].Priv = Priv; + + if (Msg != NULL) + { + NdisMoveMemory(Queue->Entry[Tail].Msg, Msg, MsgLen); + } + + NdisReleaseSpinLock(&(Queue->Lock)); + return TRUE; +} + +/*! \brief This function is used when Recv gets a MLME message + * \param *Queue The MLME Queue + * \param TimeStampHigh The upper 32 bit of timestamp + * \param TimeStampLow The lower 32 bit of timestamp + * \param Rssi The receiving RSSI strength + * \param MsgLen The length of the message + * \param *Msg The message pointer + * \return TRUE if everything ok, FALSE otherwise (like Queue Full) + * \pre + * \post + + IRQL = DISPATCH_LEVEL + + */ +BOOLEAN MlmeEnqueueForRecv( + IN PRTMP_ADAPTER pAd, + IN ULONG Wcid, + IN ULONG TimeStampHigh, + IN ULONG TimeStampLow, + IN UCHAR Rssi0, + IN UCHAR Rssi1, + IN UCHAR Rssi2, + IN ULONG MsgLen, + IN VOID *Msg, + IN UCHAR Signal) +{ + INT Tail, Machine; + PFRAME_802_11 pFrame = (PFRAME_802_11)Msg; + INT MsgType; + MLME_QUEUE *Queue = (MLME_QUEUE *)&pAd->Mlme.Queue; + +#ifdef RALINK_ATE + /* Nothing to do in ATE mode */ + if(ATE_ON(pAd)) + return FALSE; +#endif // RALINK_ATE // + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + { + DBGPRINT_ERR(("MlmeEnqueueForRecv: fRTMP_ADAPTER_HALT_IN_PROGRESS\n")); + return FALSE; + } + + // First check the size, it MUST not exceed the mlme queue size + if (MsgLen > MGMT_DMA_BUFFER_SIZE) + { + DBGPRINT_ERR(("MlmeEnqueueForRecv: frame too large, size = %ld \n", MsgLen)); + return FALSE; + } + + if (MlmeQueueFull(Queue)) + { + return FALSE; + } + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (!MsgTypeSubst(pAd, pFrame, &Machine, &MsgType)) + { + DBGPRINT_ERR(("MlmeEnqueueForRecv: un-recongnized mgmt->subtype=%d\n",pFrame->Hdr.FC.SubType)); + return FALSE; + } + } +#endif // CONFIG_STA_SUPPORT // + + // OK, we got all the informations, it is time to put things into queue + NdisAcquireSpinLock(&(Queue->Lock)); + Tail = Queue->Tail; + Queue->Tail++; + Queue->Num++; + if (Queue->Tail == MAX_LEN_OF_MLME_QUEUE) + { + Queue->Tail = 0; + } + Queue->Entry[Tail].Occupied = TRUE; + Queue->Entry[Tail].Machine = Machine; + Queue->Entry[Tail].MsgType = MsgType; + Queue->Entry[Tail].MsgLen = MsgLen; + Queue->Entry[Tail].TimeStamp.u.LowPart = TimeStampLow; + Queue->Entry[Tail].TimeStamp.u.HighPart = TimeStampHigh; + Queue->Entry[Tail].Rssi0 = Rssi0; + Queue->Entry[Tail].Rssi1 = Rssi1; + Queue->Entry[Tail].Rssi2 = Rssi2; + Queue->Entry[Tail].Signal = Signal; + Queue->Entry[Tail].Wcid = (UCHAR)Wcid; + + Queue->Entry[Tail].Channel = pAd->LatchRfRegs.Channel; + + if (Msg != NULL) + { + NdisMoveMemory(Queue->Entry[Tail].Msg, Msg, MsgLen); + } + + NdisReleaseSpinLock(&(Queue->Lock)); + + RTMP_MLME_HANDLER(pAd); + + return TRUE; +} + + +/*! \brief Dequeue a message from the MLME Queue + * \param *Queue The MLME Queue + * \param *Elem The message dequeued from MLME Queue + * \return TRUE if the Elem contains something, FALSE otherwise + * \pre + * \post + + IRQL = DISPATCH_LEVEL + + */ +BOOLEAN MlmeDequeue( + IN MLME_QUEUE *Queue, + OUT MLME_QUEUE_ELEM **Elem) +{ + NdisAcquireSpinLock(&(Queue->Lock)); + *Elem = &(Queue->Entry[Queue->Head]); + Queue->Num--; + Queue->Head++; + if (Queue->Head == MAX_LEN_OF_MLME_QUEUE) + { + Queue->Head = 0; + } + NdisReleaseSpinLock(&(Queue->Lock)); + return TRUE; +} + +// IRQL = DISPATCH_LEVEL +VOID MlmeRestartStateMachine( + IN PRTMP_ADAPTER pAd) +{ +#ifdef RTMP_MAC_PCI + MLME_QUEUE_ELEM *Elem = NULL; +#endif // RTMP_MAC_PCI // +#ifdef CONFIG_STA_SUPPORT + BOOLEAN Cancelled; +#endif // CONFIG_STA_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("MlmeRestartStateMachine \n")); + +#ifdef RTMP_MAC_PCI + NdisAcquireSpinLock(&pAd->Mlme.TaskLock); + if(pAd->Mlme.bRunning) + { + NdisReleaseSpinLock(&pAd->Mlme.TaskLock); + return; + } + else + { + pAd->Mlme.bRunning = TRUE; + } + NdisReleaseSpinLock(&pAd->Mlme.TaskLock); + + // Remove all Mlme queues elements + while (!MlmeQueueEmpty(&pAd->Mlme.Queue)) + { + //From message type, determine which state machine I should drive + if (MlmeDequeue(&pAd->Mlme.Queue, &Elem)) + { + // free MLME element + Elem->Occupied = FALSE; + Elem->MsgLen = 0; + + } + else { + DBGPRINT_ERR(("MlmeRestartStateMachine: MlmeQueue empty\n")); + } + } +#endif // RTMP_MAC_PCI // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef QOS_DLS_SUPPORT + UCHAR i; +#endif // QOS_DLS_SUPPORT // + // Cancel all timer events + // Be careful to cancel new added timer + RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &Cancelled); + RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &Cancelled); + +#ifdef QOS_DLS_SUPPORT + for (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &Cancelled); + } +#endif // QOS_DLS_SUPPORT // + } +#endif // CONFIG_STA_SUPPORT // + + // Change back to original channel in case of doing scan + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + + // Resume MSDU which is turned off durning scan + RTMPResumeMsduTransmission(pAd); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Set all state machines back IDLE + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + pAd->Mlme.AuthRspMachine.CurrState = AUTH_RSP_IDLE; + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + pAd->Mlme.ActMachine.CurrState = ACT_IDLE; +#ifdef QOS_DLS_SUPPORT + pAd->Mlme.DlsMachine.CurrState = DLS_IDLE; +#endif // QOS_DLS_SUPPORT // + + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef RTMP_MAC_PCI + // Remove running state + NdisAcquireSpinLock(&pAd->Mlme.TaskLock); + pAd->Mlme.bRunning = FALSE; + NdisReleaseSpinLock(&pAd->Mlme.TaskLock); +#endif // RTMP_MAC_PCI // +} + +/*! \brief test if the MLME Queue is empty + * \param *Queue The MLME Queue + * \return TRUE if the Queue is empty, FALSE otherwise + * \pre + * \post + + IRQL = DISPATCH_LEVEL + + */ +BOOLEAN MlmeQueueEmpty( + IN MLME_QUEUE *Queue) +{ + BOOLEAN Ans; + + NdisAcquireSpinLock(&(Queue->Lock)); + Ans = (Queue->Num == 0); + NdisReleaseSpinLock(&(Queue->Lock)); + + return Ans; +} + +/*! \brief test if the MLME Queue is full + * \param *Queue The MLME Queue + * \return TRUE if the Queue is empty, FALSE otherwise + * \pre + * \post + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + */ +BOOLEAN MlmeQueueFull( + IN MLME_QUEUE *Queue) +{ + BOOLEAN Ans; + + NdisAcquireSpinLock(&(Queue->Lock)); + Ans = (Queue->Num == MAX_LEN_OF_MLME_QUEUE || Queue->Entry[Queue->Tail].Occupied); + NdisReleaseSpinLock(&(Queue->Lock)); + + return Ans; +} + +/*! \brief The destructor of MLME Queue + * \param + * \return + * \pre + * \post + * \note Clear Mlme Queue, Set Queue->Num to Zero. + + IRQL = PASSIVE_LEVEL + + */ +VOID MlmeQueueDestroy( + IN MLME_QUEUE *pQueue) +{ + NdisAcquireSpinLock(&(pQueue->Lock)); + pQueue->Num = 0; + pQueue->Head = 0; + pQueue->Tail = 0; + NdisReleaseSpinLock(&(pQueue->Lock)); + NdisFreeSpinLock(&(pQueue->Lock)); +} + + +/*! \brief To substitute the message type if the message is coming from external + * \param pFrame The frame received + * \param *Machine The state machine + * \param *MsgType the message type for the state machine + * \return TRUE if the substitution is successful, FALSE otherwise + * \pre + * \post + + IRQL = DISPATCH_LEVEL + + */ +#ifdef CONFIG_STA_SUPPORT +BOOLEAN MsgTypeSubst( + IN PRTMP_ADAPTER pAd, + IN PFRAME_802_11 pFrame, + OUT INT *Machine, + OUT INT *MsgType) +{ + USHORT Seq, Alg; + UCHAR EAPType; + PUCHAR pData; + + // Pointer to start of data frames including SNAP header + pData = (PUCHAR) pFrame + LENGTH_802_11; + + // The only data type will pass to this function is EAPOL frame + if (pFrame->Hdr.FC.Type == BTYPE_DATA) + { + { + *Machine = WPA_STATE_MACHINE; + EAPType = *((UCHAR*)pFrame + LENGTH_802_11 + LENGTH_802_1_H + 1); + return (WpaMsgTypeSubst(EAPType, (INT *) MsgType)); + } + } + + switch (pFrame->Hdr.FC.SubType) + { + case SUBTYPE_ASSOC_REQ: + *Machine = ASSOC_STATE_MACHINE; + *MsgType = MT2_PEER_ASSOC_REQ; + break; + case SUBTYPE_ASSOC_RSP: + *Machine = ASSOC_STATE_MACHINE; + *MsgType = MT2_PEER_ASSOC_RSP; + break; + case SUBTYPE_REASSOC_REQ: + *Machine = ASSOC_STATE_MACHINE; + *MsgType = MT2_PEER_REASSOC_REQ; + break; + case SUBTYPE_REASSOC_RSP: + *Machine = ASSOC_STATE_MACHINE; + *MsgType = MT2_PEER_REASSOC_RSP; + break; + case SUBTYPE_PROBE_REQ: + *Machine = SYNC_STATE_MACHINE; + *MsgType = MT2_PEER_PROBE_REQ; + break; + case SUBTYPE_PROBE_RSP: + *Machine = SYNC_STATE_MACHINE; + *MsgType = MT2_PEER_PROBE_RSP; + break; + case SUBTYPE_BEACON: + *Machine = SYNC_STATE_MACHINE; + *MsgType = MT2_PEER_BEACON; + break; + case SUBTYPE_ATIM: + *Machine = SYNC_STATE_MACHINE; + *MsgType = MT2_PEER_ATIM; + break; + case SUBTYPE_DISASSOC: + *Machine = ASSOC_STATE_MACHINE; + *MsgType = MT2_PEER_DISASSOC_REQ; + break; + case SUBTYPE_AUTH: + // get the sequence number from payload 24 Mac Header + 2 bytes algorithm + NdisMoveMemory(&Seq, &pFrame->Octet[2], sizeof(USHORT)); + NdisMoveMemory(&Alg, &pFrame->Octet[0], sizeof(USHORT)); + if (Seq == 1 || Seq == 3) + { + *Machine = AUTH_RSP_STATE_MACHINE; + *MsgType = MT2_PEER_AUTH_ODD; + } + else if (Seq == 2 || Seq == 4) + { + if (Alg == AUTH_MODE_OPEN || Alg == AUTH_MODE_KEY) + { + *Machine = AUTH_STATE_MACHINE; + *MsgType = MT2_PEER_AUTH_EVEN; + } + } + else + { + return FALSE; + } + break; + case SUBTYPE_DEAUTH: + *Machine = AUTH_RSP_STATE_MACHINE; + *MsgType = MT2_PEER_DEAUTH; + break; + case SUBTYPE_ACTION: + *Machine = ACTION_STATE_MACHINE; + // Sometimes Sta will return with category bytes with MSB = 1, if they receive catogory out of their support + if ((pFrame->Octet[0]&0x7F) > MAX_PEER_CATE_MSG) + { + *MsgType = MT2_ACT_INVALID; + } + else + { + *MsgType = (pFrame->Octet[0]&0x7F); + } + break; + default: + return FALSE; + break; + } + + return TRUE; +} +#endif // CONFIG_STA_SUPPORT // + +// =========================================================================================== +// state_machine.c +// =========================================================================================== + +/*! \brief Initialize the state machine. + * \param *S pointer to the state machine + * \param Trans State machine transition function + * \param StNr number of states + * \param MsgNr number of messages + * \param DefFunc default function, when there is invalid state/message combination + * \param InitState initial state of the state machine + * \param Base StateMachine base, internal use only + * \pre p_sm should be a legal pointer + * \post + + IRQL = PASSIVE_LEVEL + + */ +VOID StateMachineInit( + IN STATE_MACHINE *S, + IN STATE_MACHINE_FUNC Trans[], + IN ULONG StNr, + IN ULONG MsgNr, + IN STATE_MACHINE_FUNC DefFunc, + IN ULONG InitState, + IN ULONG Base) +{ + ULONG i, j; + + // set number of states and messages + S->NrState = StNr; + S->NrMsg = MsgNr; + S->Base = Base; + + S->TransFunc = Trans; + + // init all state transition to default function + for (i = 0; i < StNr; i++) + { + for (j = 0; j < MsgNr; j++) + { + S->TransFunc[i * MsgNr + j] = DefFunc; + } + } + + // set the starting state + S->CurrState = InitState; +} + +/*! \brief This function fills in the function pointer into the cell in the state machine + * \param *S pointer to the state machine + * \param St state + * \param Msg incoming message + * \param f the function to be executed when (state, message) combination occurs at the state machine + * \pre *S should be a legal pointer to the state machine, st, msg, should be all within the range, Base should be set in the initial state + * \post + + IRQL = PASSIVE_LEVEL + + */ +VOID StateMachineSetAction( + IN STATE_MACHINE *S, + IN ULONG St, + IN ULONG Msg, + IN STATE_MACHINE_FUNC Func) +{ + ULONG MsgIdx; + + MsgIdx = Msg - S->Base; + + if (St < S->NrState && MsgIdx < S->NrMsg) + { + // boundary checking before setting the action + S->TransFunc[St * S->NrMsg + MsgIdx] = Func; + } +} + +/*! \brief This function does the state transition + * \param *Adapter the NIC adapter pointer + * \param *S the state machine + * \param *Elem the message to be executed + * \return None + + IRQL = DISPATCH_LEVEL + + */ +VOID StateMachinePerformAction( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + IN MLME_QUEUE_ELEM *Elem, + IN ULONG CurrState) +{ + if (S->TransFunc[(CurrState) * S->NrMsg + Elem->MsgType - S->Base]) + (*(S->TransFunc[(CurrState) * S->NrMsg + Elem->MsgType - S->Base]))(pAd, Elem); +} + +/* + ========================================================================== + Description: + The drop function, when machine executes this, the message is simply + ignored. This function does nothing, the message is freed in + StateMachinePerformAction() + ========================================================================== + */ +VOID Drop( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ +} + +// =========================================================================================== +// lfsr.c +// =========================================================================================== + +/* + ========================================================================== + Description: + + IRQL = PASSIVE_LEVEL + + ========================================================================== + */ +VOID LfsrInit( + IN PRTMP_ADAPTER pAd, + IN ULONG Seed) +{ + if (Seed == 0) + pAd->Mlme.ShiftReg = 1; + else + pAd->Mlme.ShiftReg = Seed; +} + +/* + ========================================================================== + Description: + ========================================================================== + */ +UCHAR RandomByte( + IN PRTMP_ADAPTER pAd) +{ + ULONG i; + UCHAR R, Result; + + R = 0; + + if (pAd->Mlme.ShiftReg == 0) + NdisGetSystemUpTime((ULONG *)&pAd->Mlme.ShiftReg); + + for (i = 0; i < 8; i++) + { + if (pAd->Mlme.ShiftReg & 0x00000001) + { + pAd->Mlme.ShiftReg = ((pAd->Mlme.ShiftReg ^ LFSR_MASK) >> 1) | 0x80000000; + Result = 1; + } + else + { + pAd->Mlme.ShiftReg = pAd->Mlme.ShiftReg >> 1; + Result = 0; + } + R = (R << 1) | Result; + } + + return R; +} + + +/* + ======================================================================== + + Routine Description: + Verify the support rate for different PHY type + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + ======================================================================== +*/ +VOID RTMPCheckRates( + IN PRTMP_ADAPTER pAd, + IN OUT UCHAR SupRate[], + IN OUT UCHAR *SupRateLen) +{ + UCHAR RateIdx, i, j; + UCHAR NewRate[12], NewRateLen; + + NewRateLen = 0; + + if (pAd->CommonCfg.PhyMode == PHY_11B) + RateIdx = 4; + else + RateIdx = 12; + + // Check for support rates exclude basic rate bit + for (i = 0; i < *SupRateLen; i++) + for (j = 0; j < RateIdx; j++) + if ((SupRate[i] & 0x7f) == RateIdTo500Kbps[j]) + NewRate[NewRateLen++] = SupRate[i]; + + *SupRateLen = NewRateLen; + NdisMoveMemory(SupRate, NewRate, NewRateLen); +} + +#ifdef CONFIG_STA_SUPPORT +#ifdef DOT11_N_SUPPORT +BOOLEAN RTMPCheckChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR CentralChannel, + IN UCHAR Channel) +{ + UCHAR k; + UCHAR UpperChannel = 0, LowerChannel = 0; + UCHAR NoEffectChannelinList = 0; + + // Find upper and lower channel according to 40MHz current operation. + if (CentralChannel < Channel) + { + UpperChannel = Channel; + if (CentralChannel > 2) + LowerChannel = CentralChannel - 2; + else + return FALSE; + } + else if (CentralChannel > Channel) + { + UpperChannel = CentralChannel + 2; + LowerChannel = Channel; + } + + for (k = 0;k < pAd->ChannelListNum;k++) + { + if (pAd->ChannelList[k].Channel == UpperChannel) + { + NoEffectChannelinList ++; + } + if (pAd->ChannelList[k].Channel == LowerChannel) + { + NoEffectChannelinList ++; + } + } + + DBGPRINT(RT_DEBUG_TRACE,("Total Channel in Channel List = [%d]\n", NoEffectChannelinList)); + if (NoEffectChannelinList == 2) + return TRUE; + else + return FALSE; +} + +/* + ======================================================================== + + Routine Description: + Verify the support rate for HT phy type + + Arguments: + pAd Pointer to our adapter + + Return Value: + FALSE if pAd->CommonCfg.SupportedHtPhy doesn't accept the pHtCapability. (AP Mode) + + IRQL = PASSIVE_LEVEL + + ======================================================================== +*/ +BOOLEAN RTMPCheckHt( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN HT_CAPABILITY_IE *pHtCapability, + IN ADD_HT_INFO_IE *pAddHtInfo) +{ + if (Wcid >= MAX_LEN_OF_MAC_TABLE) + return FALSE; + + // If use AMSDU, set flag. + if (pAd->CommonCfg.DesiredHtPhy.AmsduEnable) + CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_AMSDU_INUSED); + // Save Peer Capability + if (pHtCapability->HtCapInfo.ShortGIfor20) + CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_SGI20_CAPABLE); + if (pHtCapability->HtCapInfo.ShortGIfor40) + CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_SGI40_CAPABLE); + if (pHtCapability->HtCapInfo.TxSTBC) + CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_TxSTBC_CAPABLE); + if (pHtCapability->HtCapInfo.RxSTBC) + CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_RxSTBC_CAPABLE); + if (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport) + { + CLIENT_STATUS_SET_FLAG(&pAd->MacTab.Content[Wcid], fCLIENT_STATUS_RDG_CAPABLE); + } + + if (Wcid < MAX_LEN_OF_MAC_TABLE) + { + pAd->MacTab.Content[Wcid].MpduDensity = pHtCapability->HtCapParm.MpduDensity; + } + + // Will check ChannelWidth for MCSSet[4] below + pAd->MlmeAux.HtCapability.MCSSet[4] = 0x1; + switch (pAd->CommonCfg.RxStream) + { + case 1: + pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff; + pAd->MlmeAux.HtCapability.MCSSet[1] = 0x00; + pAd->MlmeAux.HtCapability.MCSSet[2] = 0x00; + pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00; + break; + case 2: + pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff; + pAd->MlmeAux.HtCapability.MCSSet[1] = 0xff; + pAd->MlmeAux.HtCapability.MCSSet[2] = 0x00; + pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00; + break; + case 3: + pAd->MlmeAux.HtCapability.MCSSet[0] = 0xff; + pAd->MlmeAux.HtCapability.MCSSet[1] = 0xff; + pAd->MlmeAux.HtCapability.MCSSet[2] = 0xff; + pAd->MlmeAux.HtCapability.MCSSet[3] = 0x00; + break; + } + + pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth = pAddHtInfo->AddHtInfo.RecomWidth & pAd->CommonCfg.DesiredHtPhy.ChannelWidth; + + /* + If both station and AP use 40MHz, still need to check if the 40MHZ band's legality in my country region + If this 40MHz wideband is not allowed in my country list, use bandwidth 20MHZ instead, + */ + if (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40) + { + if (RTMPCheckChannel(pAd, pAd->MlmeAux.CentralChannel, pAd->MlmeAux.Channel) == FALSE) + { + pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth = BW_20; + } + } + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPCheckHt:: HtCapInfo.ChannelWidth=%d, RecomWidth=%d, DesiredHtPhy.ChannelWidth=%d, BW40MAvailForA/G=%d/%d, PhyMode=%d \n", + pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth, pAddHtInfo->AddHtInfo.RecomWidth, pAd->CommonCfg.DesiredHtPhy.ChannelWidth, + pAd->NicConfig2.field.BW40MAvailForA, pAd->NicConfig2.field.BW40MAvailForG, pAd->CommonCfg.PhyMode)); + + pAd->MlmeAux.HtCapability.HtCapInfo.GF = pHtCapability->HtCapInfo.GF & pAd->CommonCfg.DesiredHtPhy.GF; + + // Send Assoc Req with my HT capability. + pAd->MlmeAux.HtCapability.HtCapInfo.AMsduSize = pAd->CommonCfg.DesiredHtPhy.AmsduSize; + pAd->MlmeAux.HtCapability.HtCapInfo.MimoPs = pAd->CommonCfg.DesiredHtPhy.MimoPs; + pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20 = (pAd->CommonCfg.DesiredHtPhy.ShortGIfor20) & (pHtCapability->HtCapInfo.ShortGIfor20); + pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40 = (pAd->CommonCfg.DesiredHtPhy.ShortGIfor40) & (pHtCapability->HtCapInfo.ShortGIfor40); + pAd->MlmeAux.HtCapability.HtCapInfo.TxSTBC = (pAd->CommonCfg.DesiredHtPhy.TxSTBC)&(pHtCapability->HtCapInfo.RxSTBC); + pAd->MlmeAux.HtCapability.HtCapInfo.RxSTBC = (pAd->CommonCfg.DesiredHtPhy.RxSTBC)&(pHtCapability->HtCapInfo.TxSTBC); + pAd->MlmeAux.HtCapability.HtCapParm.MaxRAmpduFactor = pAd->CommonCfg.DesiredHtPhy.MaxRAmpduFactor; + pAd->MlmeAux.HtCapability.HtCapParm.MpduDensity = pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity; + pAd->MlmeAux.HtCapability.ExtHtCapInfo.PlusHTC = pHtCapability->ExtHtCapInfo.PlusHTC; + pAd->MacTab.Content[Wcid].HTCapability.ExtHtCapInfo.PlusHTC = pHtCapability->ExtHtCapInfo.PlusHTC; + if (pAd->CommonCfg.bRdg) + { + pAd->MlmeAux.HtCapability.ExtHtCapInfo.RDGSupport = pHtCapability->ExtHtCapInfo.RDGSupport; + pAd->MlmeAux.HtCapability.ExtHtCapInfo.PlusHTC = 1; + } + + if (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_20) + pAd->MlmeAux.HtCapability.MCSSet[4] = 0x0; // BW20 can't transmit MCS32 + + COPY_AP_HTSETTINGS_FROM_BEACON(pAd, pHtCapability); + return TRUE; +} +#endif // DOT11_N_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +/* + ======================================================================== + + Routine Description: + Verify the support rate for different PHY type + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + ======================================================================== +*/ +VOID RTMPUpdateMlmeRate( + IN PRTMP_ADAPTER pAd) +{ + UCHAR MinimumRate; + UCHAR ProperMlmeRate; //= RATE_54; + UCHAR i, j, RateIdx = 12; //1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 + BOOLEAN bMatch = FALSE; + + switch (pAd->CommonCfg.PhyMode) + { + case PHY_11B: + ProperMlmeRate = RATE_11; + MinimumRate = RATE_1; + break; + case PHY_11BG_MIXED: +#ifdef DOT11_N_SUPPORT + case PHY_11ABGN_MIXED: + case PHY_11BGN_MIXED: +#endif // DOT11_N_SUPPORT // + if ((pAd->MlmeAux.SupRateLen == 4) && + (pAd->MlmeAux.ExtRateLen == 0)) + // B only AP + ProperMlmeRate = RATE_11; + else + ProperMlmeRate = RATE_24; + + if (pAd->MlmeAux.Channel <= 14) + MinimumRate = RATE_1; + else + MinimumRate = RATE_6; + break; + case PHY_11A: +#ifdef DOT11_N_SUPPORT + case PHY_11N_2_4G: // rt2860 need to check mlmerate for 802.11n + case PHY_11GN_MIXED: + case PHY_11AGN_MIXED: + case PHY_11AN_MIXED: + case PHY_11N_5G: +#endif // DOT11_N_SUPPORT // + ProperMlmeRate = RATE_24; + MinimumRate = RATE_6; + break; + case PHY_11ABG_MIXED: + ProperMlmeRate = RATE_24; + if (pAd->MlmeAux.Channel <= 14) + MinimumRate = RATE_1; + else + MinimumRate = RATE_6; + break; + default: // error + ProperMlmeRate = RATE_1; + MinimumRate = RATE_1; + break; + } + + for (i = 0; i < pAd->MlmeAux.SupRateLen; i++) + { + for (j = 0; j < RateIdx; j++) + { + if ((pAd->MlmeAux.SupRate[i] & 0x7f) == RateIdTo500Kbps[j]) + { + if (j == ProperMlmeRate) + { + bMatch = TRUE; + break; + } + } + } + + if (bMatch) + break; + } + + if (bMatch == FALSE) + { + for (i = 0; i < pAd->MlmeAux.ExtRateLen; i++) + { + for (j = 0; j < RateIdx; j++) + { + if ((pAd->MlmeAux.ExtRate[i] & 0x7f) == RateIdTo500Kbps[j]) + { + if (j == ProperMlmeRate) + { + bMatch = TRUE; + break; + } + } + } + + if (bMatch) + break; + } + } + + if (bMatch == FALSE) + { + ProperMlmeRate = MinimumRate; + } + + pAd->CommonCfg.MlmeRate = MinimumRate; + pAd->CommonCfg.RtsRate = ProperMlmeRate; + if (pAd->CommonCfg.MlmeRate >= RATE_6) + { + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM; + pAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; + pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_OFDM; + pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; + } + else + { + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_CCK; + pAd->CommonCfg.MlmeTransmit.field.MCS = pAd->CommonCfg.MlmeRate; + pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_CCK; + pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = pAd->CommonCfg.MlmeRate; + } + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPUpdateMlmeRate ==> MlmeTransmit = 0x%x \n" , pAd->CommonCfg.MlmeTransmit.word)); +} + +CHAR RTMPMaxRssi( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi0, + IN CHAR Rssi1, + IN CHAR Rssi2) +{ + CHAR larger = -127; + + if ((pAd->Antenna.field.RxPath == 1) && (Rssi0 != 0)) + { + larger = Rssi0; + } + + if ((pAd->Antenna.field.RxPath >= 2) && (Rssi1 != 0)) + { + larger = max(Rssi0, Rssi1); + } + + if ((pAd->Antenna.field.RxPath == 3) && (Rssi2 != 0)) + { + larger = max(larger, Rssi2); + } + + if (larger == -127) + larger = 0; + + return larger; +} + + +/* + ======================================================================== + Routine Description: + Periodic evaluate antenna link status + + Arguments: + pAd - Adapter pointer + + Return Value: + None + + ======================================================================== +*/ +VOID AsicEvaluateRxAnt( + IN PRTMP_ADAPTER pAd) +{ +#ifdef CONFIG_STA_SUPPORT + UCHAR BBPR3 = 0; +#endif // CONFIG_STA_SUPPORT // + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS | + fRTMP_ADAPTER_HALT_IN_PROGRESS | + fRTMP_ADAPTER_RADIO_OFF | + fRTMP_ADAPTER_NIC_NOT_EXIST | + fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS) || + OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) + ) + return; + + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + + if (pAd->StaCfg.Psm == PWR_SAVE) + return; + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3); + BBPR3 &= (~0x18); + if(pAd->Antenna.field.RxPath == 3) + { + BBPR3 |= (0x10); + } + else if(pAd->Antenna.field.RxPath == 2) + { + BBPR3 |= (0x8); + } + else if(pAd->Antenna.field.RxPath == 1) + { + BBPR3 |= (0x0); + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3); +#ifdef RTMP_MAC_PCI + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + pAd->StaCfg.BBPR3 = BBPR3; +#endif // RTMP_MAC_PCI // + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) + ) + { + ULONG TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + + pAd->RalinkCounters.OneSecTxRetryOkCount + + pAd->RalinkCounters.OneSecTxFailCount; + + // dynamic adjust antenna evaluation period according to the traffic + if (TxTotalCnt > 50) + { + RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 20); + pAd->Mlme.bLowThroughput = FALSE; + } + else + { + RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300); + pAd->Mlme.bLowThroughput = TRUE; + } + } + } +#endif // CONFIG_STA_SUPPORT // + } +} + +/* + ======================================================================== + Routine Description: + After evaluation, check antenna link status + + Arguments: + pAd - Adapter pointer + + Return Value: + None + + ======================================================================== +*/ +VOID AsicRxAntEvalTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; +#ifdef CONFIG_STA_SUPPORT + UCHAR BBPR3 = 0; + CHAR larger = -127, rssi0, rssi1, rssi2; +#endif // CONFIG_STA_SUPPORT // + + + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS | + fRTMP_ADAPTER_HALT_IN_PROGRESS | + fRTMP_ADAPTER_RADIO_OFF | + fRTMP_ADAPTER_NIC_NOT_EXIST) || + OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) + ) + return; + + { +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (pAd->StaCfg.Psm == PWR_SAVE) + return; + + + // if the traffic is low, use average rssi as the criteria + if (pAd->Mlme.bLowThroughput == TRUE) + { + rssi0 = pAd->StaCfg.RssiSample.LastRssi0; + rssi1 = pAd->StaCfg.RssiSample.LastRssi1; + rssi2 = pAd->StaCfg.RssiSample.LastRssi2; + } + else + { + rssi0 = pAd->StaCfg.RssiSample.AvgRssi0; + rssi1 = pAd->StaCfg.RssiSample.AvgRssi1; + rssi2 = pAd->StaCfg.RssiSample.AvgRssi2; + } + + if(pAd->Antenna.field.RxPath == 3) + { + larger = max(rssi0, rssi1); + if (larger > (rssi2 + 20)) + pAd->Mlme.RealRxPath = 2; + else + pAd->Mlme.RealRxPath = 3; + } + else if(pAd->Antenna.field.RxPath == 2) + { + if (rssi0 > (rssi1 + 20)) + pAd->Mlme.RealRxPath = 1; + else + pAd->Mlme.RealRxPath = 2; + } + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3); + BBPR3 &= (~0x18); + if(pAd->Mlme.RealRxPath == 3) + { + BBPR3 |= (0x10); + } + else if(pAd->Mlme.RealRxPath == 2) + { + BBPR3 |= (0x8); + } + else if(pAd->Mlme.RealRxPath == 1) + { + BBPR3 |= (0x0); + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3); +#ifdef RTMP_MAC_PCI + pAd->StaCfg.BBPR3 = BBPR3; +#endif // RTMP_MAC_PCI // + } +#endif // CONFIG_STA_SUPPORT // + } +} + + +VOID APSDPeriodicExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) + return; + + pAd->CommonCfg.TriggerTimerCount++; + +// Driver should not send trigger frame, it should be send by application layer +/* + if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable + && (pAd->CommonCfg.bNeedSendTriggerFrame || + (((pAd->CommonCfg.TriggerTimerCount%20) == 19) && (!pAd->CommonCfg.bAPSDAC_BE || !pAd->CommonCfg.bAPSDAC_BK || !pAd->CommonCfg.bAPSDAC_VI || !pAd->CommonCfg.bAPSDAC_VO)))) + { + DBGPRINT(RT_DEBUG_TRACE,("Sending trigger frame and enter service period when support APSD\n")); + RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE); + pAd->CommonCfg.bNeedSendTriggerFrame = FALSE; + pAd->CommonCfg.TriggerTimerCount = 0; + pAd->CommonCfg.bInServicePeriod = TRUE; + }*/ +} + +/* + ======================================================================== + Routine Description: + Set/reset MAC registers according to bPiggyBack parameter + + Arguments: + pAd - Adapter pointer + bPiggyBack - Enable / Disable Piggy-Back + + Return Value: + None + + ======================================================================== +*/ +VOID RTMPSetPiggyBack( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bPiggyBack) +{ + TX_LINK_CFG_STRUC TxLinkCfg; + + RTMP_IO_READ32(pAd, TX_LINK_CFG, &TxLinkCfg.word); + + TxLinkCfg.field.TxCFAckEn = bPiggyBack; + RTMP_IO_WRITE32(pAd, TX_LINK_CFG, TxLinkCfg.word); +} + +/* + ======================================================================== + Routine Description: + check if this entry need to switch rate automatically + + Arguments: + pAd + pEntry + + Return Value: + TURE + FALSE + + ======================================================================== +*/ +BOOLEAN RTMPCheckEntryEnableAutoRateSwitch( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry) +{ + BOOLEAN result = TRUE; + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // only associated STA counts + if ((pEntry && IS_ENTRY_CLIENT(pEntry) && (pEntry->Sst == SST_ASSOC)) +#ifdef QOS_DLS_SUPPORT + || (pEntry && IS_ENTRY_DLS(pEntry)) +#endif // QOS_DLS_SUPPORT // + ) + { + result = pAd->StaCfg.bAutoTxRateSwitch; + } + else + result = FALSE; + } +#endif // CONFIG_STA_SUPPORT // + + + + return result; +} + + +BOOLEAN RTMPAutoRateSwitchCheck( + IN PRTMP_ADAPTER pAd) +{ + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (pAd->StaCfg.bAutoTxRateSwitch) + return TRUE; + } +#endif // CONFIG_STA_SUPPORT // + return FALSE; +} + + +/* + ======================================================================== + Routine Description: + check if this entry need to fix tx legacy rate + + Arguments: + pAd + pEntry + + Return Value: + TURE + FALSE + + ======================================================================== +*/ +UCHAR RTMPStaFixedTxMode( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry) +{ + UCHAR tx_mode = FIXED_TXMODE_HT; + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + tx_mode = (UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode; + } +#endif // CONFIG_STA_SUPPORT // + + return tx_mode; +} + +/* + ======================================================================== + Routine Description: + Overwrite HT Tx Mode by Fixed Legency Tx Mode, if specified. + + Arguments: + pAd + pEntry + + Return Value: + TURE + FALSE + + ======================================================================== +*/ +VOID RTMPUpdateLegacyTxSetting( + UCHAR fixed_tx_mode, + PMAC_TABLE_ENTRY pEntry) +{ + HTTRANSMIT_SETTING TransmitSetting; + + if (fixed_tx_mode == FIXED_TXMODE_HT) + return; + + TransmitSetting.word = 0; + + TransmitSetting.field.MODE = pEntry->HTPhyMode.field.MODE; + TransmitSetting.field.MCS = pEntry->HTPhyMode.field.MCS; + + if (fixed_tx_mode == FIXED_TXMODE_CCK) + { + TransmitSetting.field.MODE = MODE_CCK; + // CCK mode allow MCS 0~3 + if (TransmitSetting.field.MCS > MCS_3) + TransmitSetting.field.MCS = MCS_3; + } + else + { + TransmitSetting.field.MODE = MODE_OFDM; + // OFDM mode allow MCS 0~7 + if (TransmitSetting.field.MCS > MCS_7) + TransmitSetting.field.MCS = MCS_7; + } + + if (pEntry->HTPhyMode.field.MODE >= TransmitSetting.field.MODE) + { + pEntry->HTPhyMode.word = TransmitSetting.word; + DBGPRINT(RT_DEBUG_TRACE, ("RTMPUpdateLegacyTxSetting : wcid-%d, MODE=%s, MCS=%d \n", + pEntry->Aid, GetPhyMode(pEntry->HTPhyMode.field.MODE), pEntry->HTPhyMode.field.MCS)); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : the fixed TxMode is invalid \n", __FUNCTION__)); + } +} + +#ifdef CONFIG_STA_SUPPORT +/* + ========================================================================== + Description: + dynamic tune BBP R66 to find a balance between sensibility and + noise isolation + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AsicStaBbpTuning( + IN PRTMP_ADAPTER pAd) +{ + UCHAR OrigR66Value = 0, R66;//, R66UpperBound = 0x30, R66LowerBound = 0x30; + CHAR Rssi; + + // 2860C did not support Fase CCA, therefore can't tune + if (pAd->MACVersion == 0x28600100) + return; + + // + // work as a STA + // + if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) // no R66 tuning when SCANNING + return; + + if ((pAd->OpMode == OPMODE_STA) + && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) + ) + && !(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) +#ifdef RTMP_MAC_PCI + && (pAd->bPCIclkOff == FALSE) +#endif // RTMP_MAC_PCI // + ) + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &OrigR66Value); + R66 = OrigR66Value; + + if (pAd->Antenna.field.RxPath > 1) + Rssi = (pAd->StaCfg.RssiSample.AvgRssi0 + pAd->StaCfg.RssiSample.AvgRssi1) >> 1; + else + Rssi = pAd->StaCfg.RssiSample.AvgRssi0; + + if (pAd->LatchRfRegs.Channel <= 14) + { //BG band +#ifdef RT30xx + // RT3070 is a no LNA solution, it should have different control regarding to AGC gain control + // Otherwise, it will have some throughput side effect when low RSSI + + if (IS_RT3070(pAd)||IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) + { + if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY) + { + R66 = 0x1C + 2*GET_LNA_GAIN(pAd) + 0x20; + if (OrigR66Value != R66) + { +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, R66); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + else + { + R66 = 0x1C + 2*GET_LNA_GAIN(pAd); + if (OrigR66Value != R66) + { +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, R66); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + } + else +#endif // RT30xx // + { + if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY) + { + R66 = (0x2E + GET_LNA_GAIN(pAd)) + 0x10; + if (OrigR66Value != R66) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + else + { + R66 = 0x2E + GET_LNA_GAIN(pAd); + if (OrigR66Value != R66) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + } + } + else + { //A band + if (pAd->CommonCfg.BBPCurrentBW == BW_20) + { + if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY) + { + R66 = 0x32 + (GET_LNA_GAIN(pAd)*5)/3 + 0x10; + if (OrigR66Value != R66) + { +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, R66); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + else + { + R66 = 0x32 + (GET_LNA_GAIN(pAd)*5)/3; + if (OrigR66Value != R66) + { +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, R66); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + } + else + { + if (Rssi > RSSI_FOR_MID_LOW_SENSIBILITY) + { + R66 = 0x3A + (GET_LNA_GAIN(pAd)*5)/3 + 0x10; + if (OrigR66Value != R66) + { +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, R66); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + else + { + R66 = 0x3A + (GET_LNA_GAIN(pAd)*5)/3; + if (OrigR66Value != R66) + { +#ifdef RT35xx + if (IS_RT3572(pAd)) + RT3572WriteBBPR66(pAd, R66); + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + } + } + + +#ifdef RT30xx + if (IS_RT3390(pAd)) + { + UCHAR BbpData = 0; + + // Reduce the RX I/Q target level to improve maximum high power input + if (pAd->StaCfg.RssiSample.AvgRssi0 > -30) + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R67, &BbpData); + BbpData = ((BbpData & 0x80) | 0x18); // The desired signal level after AGC + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R67, BbpData); + } + else + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R67, &BbpData); + BbpData = ((BbpData & 0x80) | 0x20); // The desired signal level after AGC + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R67, BbpData); + } + } +#endif // RT30xx // + } +} +#endif // CONFIG_STA_SUPPORT // + +VOID RTMPSetAGCInitValue( + IN PRTMP_ADAPTER pAd, + IN UCHAR BandWidth) +{ + UCHAR R66 = 0x30; + + if (pAd->LatchRfRegs.Channel <= 14) + { // BG band +#ifdef RT30xx + /* Gary was verified Amazon AP and find that RT307x has BBP_R66 invalid default value */ + if (IS_RT3070(pAd)||IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) + { + R66 = 0x1C + 2*GET_LNA_GAIN(pAd); +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + RT3572WriteBBPR66(pAd, R66); + } + else +#endif // RT35xx // + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + else +#endif // RT30xx // + { + R66 = 0x2E + GET_LNA_GAIN(pAd); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } + else + { //A band +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + R66 = (UCHAR)(0x22 + (GET_LNA_GAIN(pAd)*5)/3); + RT3572WriteBBPR66(pAd, R66); + } + else +#endif // RT35xx // + { + if (BandWidth == BW_20) + { + R66 = (UCHAR)(0x32 + (GET_LNA_GAIN(pAd)*5)/3); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } +#ifdef DOT11_N_SUPPORT + else + { + R66 = (UCHAR)(0x3A + (GET_LNA_GAIN(pAd)*5)/3); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } +#endif // DOT11_N_SUPPORT // + } + } + +} + + +/* +======================================================================== +Routine Description: + Check if the channel has the property. + +Arguments: + pAd - WLAN control block pointer + ChanNum - channel number + Property - channel property, CHANNEL_PASSIVE_SCAN, etc. + +Return Value: + TRUE - YES + FALSE - NO + +Note: +======================================================================== +*/ +BOOLEAN CHAN_PropertyCheck( + IN PRTMP_ADAPTER pAd, + IN UINT32 ChanNum, + IN UCHAR Property) +{ + UINT32 IdChan; + + + /* look for all registered channels */ + for(IdChan=0; IdChan<pAd->ChannelListNum; IdChan++) + { + if (pAd->ChannelList[IdChan].Channel == ChanNum) + { + if ((pAd->ChannelList[IdChan].Flags & Property) == Property) + return TRUE; /* same property */ + /* End of if */ + + break; + } /* End of if */ + } /* End of for */ + + return FALSE; +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/netif_block.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/netif_block.c new file mode 100644 index 000000000..c2f031b06 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/netif_block.c @@ -0,0 +1,146 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ +#ifdef BLOCK_NET_IF + +#include "rt_config.h" +#include "netif_block.h" + +static NETIF_ENTRY freeNetIfEntryPool[FREE_NETIF_POOL_SIZE]; +static LIST_HEADER freeNetIfEntryList; + +void initblockQueueTab( + IN PRTMP_ADAPTER pAd) +{ + int i; + + initList(&freeNetIfEntryList); + for (i = 0; i < FREE_NETIF_POOL_SIZE; i++) + insertTailList(&freeNetIfEntryList, (PLIST_ENTRY)&freeNetIfEntryPool[i]); + + for (i=0; i < NUM_OF_TX_RING; i++) + initList(&pAd->blockQueueTab[i].NetIfList); + + return; +} + +BOOLEAN blockNetIf( + IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry, + IN PNET_DEV pNetDev) +{ + PNETIF_ENTRY pNetIfEntry = NULL; + + if ((pNetIfEntry = (PNETIF_ENTRY)removeHeadList(&freeNetIfEntryList)) != NULL) + { + RTMP_OS_NETDEV_STOP_QUEUE(pNetDev); + pNetIfEntry->pNetDev = pNetDev; + insertTailList(&pBlockQueueEntry->NetIfList, (PLIST_ENTRY)pNetIfEntry); + + pBlockQueueEntry->SwTxQueueBlockFlag = TRUE; + DBGPRINT(RT_DEBUG_TRACE, ("RTMP_OS_NETDEV_STOP_QUEUE(%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev))); + } + else + return FALSE; + + return TRUE; +} + +VOID releaseNetIf( + IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry) +{ + PNETIF_ENTRY pNetIfEntry = NULL; + PLIST_HEADER pNetIfList = &pBlockQueueEntry->NetIfList; + + while((pNetIfEntry = (PNETIF_ENTRY)removeHeadList(pNetIfList)) != NULL) + { + PNET_DEV pNetDev = pNetIfEntry->pNetDev; + RTMP_OS_NETDEV_WAKE_QUEUE(pNetDev); + insertTailList(&freeNetIfEntryList, (PLIST_ENTRY)pNetIfEntry); + + DBGPRINT(RT_DEBUG_TRACE, ("RTMP_OS_NETDEV_WAKE_QUEUE(%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev))); + } + pBlockQueueEntry->SwTxQueueBlockFlag = FALSE; + return; +} + + +VOID StopNetIfQueue( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket) +{ + PNET_DEV NetDev = NULL; + UCHAR IfIdx = 0; + BOOLEAN valid = FALSE; + +#ifdef APCLI_SUPPORT + if (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_APCLI) + { + IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_APCLI) % MAX_APCLI_NUM; + NetDev = pAd->ApCfg.ApCliTab[IfIdx].dev; + } + else +#endif // APCLI_SUPPORT // +#ifdef WDS_SUPPORT + if (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_WDS) + { + IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_WDS) % MAX_WDS_ENTRY; + NetDev = pAd->WdsTab.WdsEntry[IfIdx].dev; + } + else +#endif // WDS_SUPPORT // + { +#ifdef MBSS_SUPPORT + if (pAd->OpMode == OPMODE_AP) + { + IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_MBSSID) % MAX_MBSSID_NUM; + NetDev = pAd->ApCfg.MBSSID[IfIdx].MSSIDDev; + } + else + { + IfIdx = MAIN_MBSSID; + NetDev = pAd->net_dev; + } +#else + IfIdx = MAIN_MBSSID; + NetDev = pAd->net_dev; +#endif + } + + // WMM support 4 software queues. + // One software queue full doesn't mean device have no capbility to transmit packet. + // So disable block Net-If queue function while WMM enable. +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + valid = (pAd->CommonCfg.bWmmCapable == TRUE) ? FALSE : TRUE; +#endif // CONFIG_STA_SUPPORT // + + if (valid) + blockNetIf(&pAd->blockQueueTab[QueIdx], NetDev); + return; +} + +#endif // BLOCK_NET_IF // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt2860.bin b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt2860.bin new file mode 100644 index 0000000000000000000000000000000000000000..7d745ac588b086a4bf9ed4a3e26591e127c89dfa GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt_channel.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt_channel.c new file mode 100644 index 000000000..ac583b221 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt_channel.c @@ -0,0 +1,1353 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* +*/ +#include "rt_config.h" + + +CH_FREQ_MAP CH_HZ_ID_MAP[]= + { + {1, 2412}, + {2, 2417}, + {3, 2422}, + {4, 2427}, + {5, 2432}, + {6, 2437}, + {7, 2442}, + {8, 2447}, + {9, 2452}, + {10, 2457}, + {11, 2462}, + {12, 2467}, + {13, 2472}, + {14, 2484}, + + /* UNII */ + {36, 5180}, + {40, 5200}, + {44, 5220}, + {48, 5240}, + {52, 5260}, + {56, 5280}, + {60, 5300}, + {64, 5320}, + {149, 5745}, + {153, 5765}, + {157, 5785}, + {161, 5805}, + {165, 5825}, + {167, 5835}, + {169, 5845}, + {171, 5855}, + {173, 5865}, + + /* HiperLAN2 */ + {100, 5500}, + {104, 5520}, + {108, 5540}, + {112, 5560}, + {116, 5580}, + {120, 5600}, + {124, 5620}, + {128, 5640}, + {132, 5660}, + {136, 5680}, + {140, 5700}, + + /* Japan MMAC */ + {34, 5170}, + {38, 5190}, + {42, 5210}, + {46, 5230}, + + /* Japan */ + {184, 4920}, + {188, 4940}, + {192, 4960}, + {196, 4980}, + + {208, 5040}, /* Japan, means J08 */ + {212, 5060}, /* Japan, means J12 */ + {216, 5080}, /* Japan, means J16 */ +}; + +INT CH_HZ_ID_MAP_NUM = (sizeof(CH_HZ_ID_MAP)/sizeof(CH_FREQ_MAP)); + +#ifdef EXT_BUILD_CHANNEL_LIST +CH_REGION ChRegion[] = +{ + { // Antigua and Berbuda + "AG", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Argentina + "AR", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Aruba + "AW", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Australia + "AU", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Austria + "AT", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, TRUE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Bahamas + "BS", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Barbados + "BB", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Bermuda + "BM", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Brazil + "BR", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 24, BOTH, FALSE}, // 5G, ch 100~140 + { 149, 5, 30, BOTH, FALSE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Belgium + "BE", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 18, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 18, IDOR, FALSE}, // 5G, ch 52~64 + { 0}, // end + } + }, + + { // Bulgaria + "BG", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, ODOR, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Canada + "CA", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Cayman IsLands + "KY", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Chile + "CL", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 20, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 20, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 5, 20, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // China + "CN", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Colombia + "CO", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 + { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Costa Rica + "CR", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Cyprus + "CY", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Czech_Republic + "CZ", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 0}, // end + } + }, + + { // Denmark + "DK", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Dominican Republic + "DO", + CE, + { + { 1, 0, 20, BOTH, FALSE}, // 2.4 G, ch 0 + { 149, 4, 20, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Equador + "EC", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 100, 11, 27, BOTH, FALSE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // El Salvador + "SV", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 30, BOTH, TRUE}, // 5G, ch 52~64 + { 149, 4, 36, BOTH, TRUE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Finland + "FI", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // France + "FR", + CE, + { + { 1, 13, 10, IDOR, FALSE}, // 2.4 G, ch 1~13 + { 1, 13, 20, ODOR, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 0}, // end + } + }, + + { // Germany + "DE", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Greece + "GR", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, ODOR, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Guam + "GU", + CE, + { + { 1, 11, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 + { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, FALSE}, // 5G, ch 100~140 + { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Guatemala + "GT", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Haiti + "HT", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 17, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Honduras + "HN", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Hong Kong + "HK", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, FALSE}, // 5G, ch 52~64 + { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Hungary + "HU", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 0}, // end + } + }, + + { // Iceland + "IS", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // India + "IN", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 149, 4, 24, IDOR, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Indonesia + "ID", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Ireland + "IE", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, ODOR, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Israel + "IL", + CE, + { + { 1, 3, 20, IDOR, FALSE}, // 2.4 G, ch 1~3 + { 4, 6, 20, BOTH, FALSE}, // 2.4 G, ch 4~9 + { 10, 4, 20, IDOR, FALSE}, // 2.4 G, ch 10~13 + { 0}, // end + } + }, + + { // Italy + "IT", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, ODOR, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Japan + "JP", + JAP, + { + { 1, 14, 20, BOTH, FALSE}, // 2.4 G, ch 1~14 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 0}, // end + } + }, + + { // Jordan + "JO", + CE, + { + { 1, 13, 20, IDOR, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 149, 4, 23, IDOR, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Latvia + "LV", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Liechtenstein + "LI", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Lithuania + "LT", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Luxemburg + "LU", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Malaysia + "MY", + CE, + { + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 5, 20, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Malta + "MT", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Marocco + "MA", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 24, IDOR, FALSE}, // 5G, ch 36~48 + { 0}, // end + } + }, + + { // Mexico + "MX", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 5, 30, IDOR, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Netherlands + "NL", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // New Zealand + "NZ", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 24, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Norway + "NO", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 24, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Peru + "PE", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Portugal + "PT", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Poland + "PL", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Romania + "RO", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Russia + "RU", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 149, 4, 20, IDOR, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Saudi Arabia + "SA", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 4, 23, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Serbia_and_Montenegro + "CS", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 0}, // end + } + }, + + { // Singapore + "SG", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 + { 149, 4, 20, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Slovakia + "SK", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Slovenia + "SI", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 0}, // end + } + }, + + { // South Africa + "ZA", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, FALSE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 149, 4, 30, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // South Korea + "KR", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 20, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 20, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 8, 20, BOTH, FALSE}, // 5G, ch 100~128 + { 149, 4, 20, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Spain + "ES", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 17, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Sweden + "SE", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Switzerland + "CH", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~13 + { 36, 4, 23, IDOR, TRUE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 0}, // end + } + }, + + { // Taiwan + "TW", + CE, + { + { 1, 11, 30, BOTH, FALSE}, // 2.4 G, ch 1~11 + { 52, 4, 23, IDOR, FALSE}, // 5G, ch 52~64 + { 0}, // end + } + }, + + { // Turkey + "TR", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 + { 36, 4, 23, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, BOTH, FALSE}, // 5G, ch 52~64 + { 0}, // end + } + }, + + { // UK + "GB", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 + { 36, 4, 23, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 23, IDOR, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 0}, // end + } + }, + + { // Ukraine + "UA", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 + { 0}, // end + } + }, + + { // United_Arab_Emirates + "AE", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 + { 0}, // end + } + }, + + { // United_States + "US", + FCC, + { + { 1, 11, 30, BOTH, FALSE}, // 2.4 G, ch 1~11 + { 36, 4, 17, IDOR, FALSE}, // 5G, ch 36~48 + { 52, 4, 24, BOTH, TRUE}, // 5G, ch 52~64 + { 100, 11, 30, BOTH, TRUE}, // 5G, ch 100~140 + { 149, 5, 30, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, + + { // Venezuela + "VE", + CE, + { + { 1, 13, 20, BOTH, FALSE}, // 2.4 G, ch 1~11 + { 149, 4, 27, BOTH, FALSE}, // 5G, ch 149~161 + { 0}, // end + } + }, + + { // Default + "", + CE, + { + { 1, 14, 255, BOTH, FALSE}, // 2.4 G, ch 1~14 + { 36, 4, 255, BOTH, FALSE}, // 5G, ch 36~48 + { 52, 4, 255, BOTH, FALSE}, // 5G, ch 52~64 + { 100, 11, 255, BOTH, FALSE}, // 5G, ch 100~140 + { 149, 5, 255, BOTH, FALSE}, // 5G, ch 149~165 + { 0}, // end + } + }, +}; + + +static PCH_REGION GetChRegion( + IN PUCHAR CntryCode) +{ + INT loop = 0; + PCH_REGION pChRegion = NULL; + + while (strcmp((PSTRING) ChRegion[loop].CountReg, "") != 0) + { + if (strncmp((PSTRING) ChRegion[loop].CountReg, (PSTRING) CntryCode, 2) == 0) + { + pChRegion = &ChRegion[loop]; + break; + } + loop++; + } + + if (pChRegion == NULL) + pChRegion = &ChRegion[loop]; + return pChRegion; +} + +static VOID ChBandCheck( + IN UCHAR PhyMode, + OUT PUCHAR pChType) +{ + switch(PhyMode) + { + case PHY_11A: +#ifdef DOT11_N_SUPPORT + case PHY_11AN_MIXED: +#endif // DOT11_N_SUPPORT // + *pChType = BAND_5G; + break; + case PHY_11ABG_MIXED: +#ifdef DOT11_N_SUPPORT + case PHY_11AGN_MIXED: + case PHY_11ABGN_MIXED: +#endif // DOT11_N_SUPPORT // + *pChType = BAND_BOTH; + break; + + default: + *pChType = BAND_24G; + break; + } +} + +static UCHAR FillChList( + IN PRTMP_ADAPTER pAd, + IN PCH_DESP pChDesp, + IN UCHAR Offset, + IN UCHAR increment, + IN UCHAR regulatoryDomain) +{ + INT i, j, l; + UCHAR channel; + + j = Offset; + for (i = 0; i < pChDesp->NumOfCh; i++) + { + channel = pChDesp->FirstChannel + i * increment; + for (l=0; l<MAX_NUM_OF_CHANNELS; l++) + { + if (channel == pAd->TxPower[l].Channel) + { + pAd->ChannelList[j].Power = pAd->TxPower[l].Power; + pAd->ChannelList[j].Power2 = pAd->TxPower[l].Power2; + break; + } + } + if (l == MAX_NUM_OF_CHANNELS) + continue; + + pAd->ChannelList[j].Channel = pChDesp->FirstChannel + i * increment; + pAd->ChannelList[j].MaxTxPwr = pChDesp->MaxTxPwr; + pAd->ChannelList[j].DfsReq = pChDesp->DfsReq; + pAd->ChannelList[j].RegulatoryDomain = regulatoryDomain; + j++; + } + pAd->ChannelListNum = j; + + return j; +} + + +static inline VOID CreateChList( + IN PRTMP_ADAPTER pAd, + IN PCH_REGION pChRegion, + IN UCHAR Geography) +{ + INT i; + UCHAR offset = 0; + PCH_DESP pChDesp; + UCHAR ChType; + UCHAR increment; + UCHAR regulatoryDomain; + + if (pChRegion == NULL) + return; + + ChBandCheck(pAd->CommonCfg.PhyMode, &ChType); + + for (i=0; i<10; i++) + { + pChDesp = &pChRegion->ChDesp[i]; + if (pChDesp->FirstChannel == 0) + break; + + if (ChType == BAND_5G) + { + if (pChDesp->FirstChannel <= 14) + continue; + } + else if (ChType == BAND_24G) + { + if (pChDesp->FirstChannel > 14) + continue; + } + + if ((pChDesp->Geography == BOTH) + || (pChDesp->Geography == Geography)) + { + if (pChDesp->FirstChannel > 14) + increment = 4; + else + increment = 1; + regulatoryDomain = pChRegion->DfsType; + offset = FillChList(pAd, pChDesp, offset, increment, regulatoryDomain); + } + } +} + + +VOID BuildChannelListEx( + IN PRTMP_ADAPTER pAd) +{ + PCH_REGION pChReg; + + pChReg = GetChRegion(pAd->CommonCfg.CountryCode); + CreateChList(pAd, pChReg, pAd->CommonCfg.Geography); +} + +VOID BuildBeaconChList( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pBuf, + OUT PULONG pBufLen) +{ + INT i; + ULONG TmpLen; + PCH_REGION pChRegion; + PCH_DESP pChDesp; + UCHAR ChType; + + pChRegion = GetChRegion(pAd->CommonCfg.CountryCode); + + if (pChRegion == NULL) + return; + + ChBandCheck(pAd->CommonCfg.PhyMode, &ChType); + *pBufLen = 0; + + for (i=0; i<10; i++) + { + pChDesp = &pChRegion->ChDesp[i]; + if (pChDesp->FirstChannel == 0) + break; + + if (ChType == BAND_5G) + { + if (pChDesp->FirstChannel <= 14) + continue; + } + else if (ChType == BAND_24G) + { + if (pChDesp->FirstChannel > 14) + continue; + } + + if ((pChDesp->Geography == BOTH) + || (pChDesp->Geography == pAd->CommonCfg.Geography)) + { + MakeOutgoingFrame(pBuf + *pBufLen, &TmpLen, + 1, &pChDesp->FirstChannel, + 1, &pChDesp->NumOfCh, + 1, &pChDesp->MaxTxPwr, + END_OF_ARGS); + *pBufLen += TmpLen; + } + } +} +#endif // EXT_BUILD_CHANNEL_LIST // + +#ifdef DOT11_N_SUPPORT +static BOOLEAN IsValidChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR channel) + +{ + INT i; + + for (i = 0; i < pAd->ChannelListNum; i++) + { + if (pAd->ChannelList[i].Channel == channel) + break; + } + + if (i == pAd->ChannelListNum) + return FALSE; + else + return TRUE; +} + + +static UCHAR GetExtCh( + IN UCHAR Channel, + IN UCHAR Direction) +{ + CHAR ExtCh; + + if (Direction == EXTCHA_ABOVE) + ExtCh = Channel + 4; + else + ExtCh = (Channel - 4) > 0 ? (Channel - 4) : 0; + + return ExtCh; +} + + +VOID N_ChannelCheck( + IN PRTMP_ADAPTER pAd) +{ + //UCHAR ChannelNum = pAd->ChannelListNum; + UCHAR Channel = pAd->CommonCfg.Channel; + + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)) + { + if (Channel > 14) + { + if ((Channel == 36) || (Channel == 44) || (Channel == 52) || (Channel == 60) || (Channel == 100) || (Channel == 108) || + (Channel == 116) || (Channel == 124) || (Channel == 132) || (Channel == 149) || (Channel == 157)) + { + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_ABOVE; + } + else if ((Channel == 40) || (Channel == 48) || (Channel == 56) || (Channel == 64) || (Channel == 104) || (Channel == 112) || + (Channel == 120) || (Channel == 128) || (Channel == 136) || (Channel == 153) || (Channel == 161)) + { + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_BELOW; + } + else + { + pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; + } + } + else + { + do + { + UCHAR ExtCh; + UCHAR Dir = pAd->CommonCfg.RegTransmitSetting.field.EXTCHA; + ExtCh = GetExtCh(Channel, Dir); + if (IsValidChannel(pAd, ExtCh)) + break; + + Dir = (Dir == EXTCHA_ABOVE) ? EXTCHA_BELOW : EXTCHA_ABOVE; + ExtCh = GetExtCh(Channel, Dir); + if (IsValidChannel(pAd, ExtCh)) + { + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = Dir; + break; + } + pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; + } while(FALSE); + + if (Channel == 14) + { + pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; + //pAd->CommonCfg.RegTransmitSetting.field.EXTCHA = EXTCHA_NONE; // We didn't set the ExtCh as NONE due to it'll set in RTMPSetHT() + } + } + } + + +} + + +VOID N_SetCenCh( + IN PRTMP_ADAPTER pAd) +{ + if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) + { + if (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE) + { + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2; + } + else + { + if (pAd->CommonCfg.Channel == 14) + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 1; + else + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2; + } + } + else + { + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; + } +} +#endif // DOT11_N_SUPPORT // + + +UINT8 GetCuntryMaxTxPwr( + IN PRTMP_ADAPTER pAd, + IN UINT8 channel) +{ + int i; + for (i = 0; i < pAd->ChannelListNum; i++) + { + if (pAd->ChannelList[i].Channel == channel) + break; + } + + if (i == pAd->ChannelListNum) + return 0xff; +#ifdef SINGLE_SKU + if (pAd->CommonCfg.bSKUMode == TRUE) + { + if (pAd->ChannelList[i].RegulatoryDomain == FCC) + { + /* FCC should maintain 20/40 Bandwidth, and without antenna gain */ + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && + (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)) + return (pAd->ChannelList[i].MaxTxPwr - pAd->CommonCfg.BandedgeDelta); + else + return pAd->ChannelList[i].MaxTxPwr; + } + else if (pAd->ChannelList[i].RegulatoryDomain == CE) + { +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && + (pAd->CommonCfg.TxStream == 2)) +#endif // DOT11_N_SUPPORT // + return (pAd->ChannelList[i].MaxTxPwr - pAd->CommonCfg.AntGain - 3); // If 2Tx case, antenna gain will increase 3dBm + else + return (pAd->ChannelList[i].MaxTxPwr - pAd->CommonCfg.AntGain); + } + else ; + } + else +#endif // SINGLE_SKU // + return pAd->ChannelList[i].MaxTxPwr; +} + + +/* for OS_ABL */ +VOID RTMP_MapChannelID2KHZ( + IN UCHAR Ch, + OUT UINT32 *pFreq) +{ + int chIdx; + for (chIdx = 0; chIdx < CH_HZ_ID_MAP_NUM; chIdx++) + { + if ((Ch) == CH_HZ_ID_MAP[chIdx].channel) + { + (*pFreq) = CH_HZ_ID_MAP[chIdx].freqKHz * 1000; + break; + } + } + if (chIdx == CH_HZ_ID_MAP_NUM) + (*pFreq) = 2412000; +} + +/* for OS_ABL */ +VOID RTMP_MapKHZ2ChannelID( + IN ULONG Freq, + OUT INT *pCh) +{ + int chIdx; + for (chIdx = 0; chIdx < CH_HZ_ID_MAP_NUM; chIdx++) + { + if ((Freq) == CH_HZ_ID_MAP[chIdx].freqKHz) + { + (*pCh) = CH_HZ_ID_MAP[chIdx].channel; + break; + } + } + if (chIdx == CH_HZ_ID_MAP_NUM) + (*pCh) = 1; +} diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt_rf.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt_rf.c new file mode 100644 index 000000000..866296bd5 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rt_rf.c @@ -0,0 +1,216 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt_rf.c + + Abstract: + Ralink Wireless driver RF related functions + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + + +#include "rt_config.h" + + +#ifdef RTMP_RF_RW_SUPPORT +/* + ======================================================================== + + Routine Description: Write RT30xx RF register through MAC + + Arguments: + + Return Value: + + IRQL = + + Note: + + ======================================================================== +*/ +NDIS_STATUS RT30xxWriteRFRegister( + IN PRTMP_ADAPTER pAd, + IN UCHAR regID, + IN UCHAR value) +{ + RF_CSR_CFG_STRUC rfcsr; + UINT i = 0; + + do + { + RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word); + + if (!rfcsr.field.RF_CSR_KICK) + break; + i++; + } + while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))); + + if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) + { + DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n")); + return STATUS_UNSUCCESSFUL; + } + + rfcsr.field.RF_CSR_WR = 1; + rfcsr.field.RF_CSR_KICK = 1; + rfcsr.field.TESTCSR_RFACC_REGNUM = regID; + rfcsr.field.RF_CSR_DATA = value; + + RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word); + + return NDIS_STATUS_SUCCESS; +} + + +/* + ======================================================================== + + Routine Description: Read RT30xx RF register through MAC + + Arguments: + + Return Value: + + IRQL = + + Note: + + ======================================================================== +*/ +NDIS_STATUS RT30xxReadRFRegister( + IN PRTMP_ADAPTER pAd, + IN UCHAR regID, + IN PUCHAR pValue) +{ + RF_CSR_CFG_STRUC rfcsr; + UINT i=0, k=0; + + for (i=0; i<MAX_BUSY_COUNT; i++) + { + if(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return STATUS_UNSUCCESSFUL; + + RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word); + + if (rfcsr.field.RF_CSR_KICK == BUSY) + { + continue; + } + rfcsr.word = 0; + rfcsr.field.RF_CSR_WR = 0; + rfcsr.field.RF_CSR_KICK = 1; + rfcsr.field.TESTCSR_RFACC_REGNUM = regID; + RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word); + for (k=0; k<MAX_BUSY_COUNT; k++) + { + if(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return STATUS_UNSUCCESSFUL; + + RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word); + + if (rfcsr.field.RF_CSR_KICK == IDLE) + break; + } + if ((rfcsr.field.RF_CSR_KICK == IDLE) && + (rfcsr.field.TESTCSR_RFACC_REGNUM == regID)) + { + *pValue = (UCHAR)rfcsr.field.RF_CSR_DATA; + break; + } + } + if (rfcsr.field.RF_CSR_KICK == BUSY) + { + DBGPRINT_ERR(("RF read R%d=0x%x fail, i[%d], k[%d]\n", regID, rfcsr.word,i,k)); + return STATUS_UNSUCCESSFUL; + } + + return STATUS_SUCCESS; +} + + +VOID NICInitRFRegisters( + IN RTMP_ADAPTER *pAd) +{ + if (pAd->chipOps.AsicRfInit) + pAd->chipOps.AsicRfInit(pAd); +} + + +VOID RtmpChipOpsRFHook( + IN RTMP_ADAPTER *pAd) +{ + RTMP_CHIP_OP *pChipOps = &pAd->chipOps; + + pChipOps->pRFRegTable = NULL; + pChipOps->pBBPRegTable = NULL; + pChipOps->AsicRfInit = NULL; + pChipOps->AsicRfTurnOn = NULL; + pChipOps->AsicRfTurnOff = NULL; + pChipOps->AsicReverseRfFromSleepMode = NULL; + pChipOps->AsicHaltAction = NULL; + + /* We depends on RfICType and MACVersion to assign the corresponding operation callbacks. */ + + +#ifdef RT30xx +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + pChipOps->AsicRfTurnOff = RT30xxLoadRFSleepModeSetup; + pChipOps->pRFRegTable = RF3572_RFRegTable; + pChipOps->AsicRfInit = NICInitRT3572RFRegisters; + pChipOps->AsicReverseRfFromSleepMode = RT3572ReverseRFSleepModeSetup; + pChipOps->AsicHaltAction = RT30xxHaltAction; + } +#endif // RT35xx // + + if (IS_RT30xx(pAd)) + { + /* + WARNING: + Currently following table are shared by all RT30xx based IC, change it carefully when you add a new IC here. + */ + pChipOps->pRFRegTable = RT30xx_RFRegTable; + pChipOps->AsicHaltAction = RT30xxHaltAction; + pChipOps->AsicRfTurnOff = RT30xxLoadRFSleepModeSetup; + pChipOps->AsicReverseRfFromSleepMode = RT30xxReverseRFSleepModeSetup; + + } +#endif // RT30xx // + + if (pChipOps->pBBPRegTable != NULL) + pChipOps->bbpRegTbSize = (sizeof(*(pChipOps->pBBPRegTable)) / sizeof(REG_PAIR)); + DBGPRINT(RT_DEBUG_TRACE, ("Chip specific bbpRegTbSize=%d!\n", pChipOps->bbpRegTbSize)); + +} + +#endif // RTMP_RF_RW_SUPPORT // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_init.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_init.c new file mode 100644 index 000000000..63ed8490b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_init.c @@ -0,0 +1,4225 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_init.c + + Abstract: + Miniport generic portion header file + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ +#include "rt_config.h" + +UCHAR BIT8[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; +#ifdef DBG +char* CipherName[] = {"none","wep64","wep128","TKIP","AES","CKIP64","CKIP128","CKIP152","SMS4"}; +#endif + +// +// BBP register initialization set +// +REG_PAIR BBPRegTable[] = { + + {BBP_R65, 0x2C}, // fix rssi issue + {BBP_R66, 0x38}, // Also set this default value to pAd->BbpTuning.R66CurrentValue at initial + {BBP_R69, 0x12}, + {BBP_R70, 0xa}, // BBP_R70 will change to 0x8 in ApStartUp and LinkUp for rt2860C, otherwise value is 0xa + {BBP_R73, 0x10}, + {BBP_R81, 0x37}, + {BBP_R82, 0x62}, + {BBP_R83, 0x6A}, + {BBP_R84, 0x99}, // 0x19 is for rt2860E and after. This is for extension channel overlapping IOT. 0x99 is for rt2860D and before + {BBP_R86, 0x00}, // middle range issue, Rory @2008-01-28 + {BBP_R91, 0x04}, // middle range issue, Rory @2008-01-28 + {BBP_R92, 0x00}, // middle range issue, Rory @2008-01-28 + {BBP_R103, 0x00}, // near range high-power issue, requested from Gary @2008-0528 + {BBP_R105, 0x05}, // 0x05 is for rt2860E to turn on FEQ control. It is safe for rt2860D and before, because Bit 7:2 are reserved in rt2860D and before. + {BBP_R106, 0x35}, // Optimizing the Short GI sampling request from Gray @2009-0409 +}; +#define NUM_BBP_REG_PARMS (sizeof(BBPRegTable) / sizeof(REG_PAIR)) + + +// +// ASIC register initialization sets +// + +RTMP_REG_PAIR MACRegTable[] = { +#if defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x200) + {BCN_OFFSET0, 0xf8f0e8e0}, /* 0x3800(e0), 0x3A00(e8), 0x3C00(f0), 0x3E00(f8), 512B for each beacon */ + {BCN_OFFSET1, 0x6f77d0c8}, /* 0x3200(c8), 0x3400(d0), 0x1DC0(77), 0x1BC0(6f), 512B for each beacon */ +#elif defined(HW_BEACON_OFFSET) && (HW_BEACON_OFFSET == 0x100) + {BCN_OFFSET0, 0xece8e4e0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */ + {BCN_OFFSET1, 0xfcf8f4f0}, /* 0x3800, 0x3A00, 0x3C00, 0x3E00, 512B for each beacon */ +#else + #error You must re-calculate new value for BCN_OFFSET0 & BCN_OFFSET1 in MACRegTable[]!!! +#endif // HW_BEACON_OFFSET // + + {LEGACY_BASIC_RATE, 0x0000013f}, // Basic rate set bitmap + {HT_BASIC_RATE, 0x00008003}, // Basic HT rate set , 20M, MCS=3, MM. Format is the same as in TXWI. + {MAC_SYS_CTRL, 0x00}, // 0x1004, , default Disable RX + {RX_FILTR_CFG, 0x17f97}, //0x1400 , RX filter control, + {BKOFF_SLOT_CFG, 0x209}, // default set short slot time, CC_DELAY_TIME should be 2 + //{TX_SW_CFG0, 0x40a06}, // Gary,2006-08-23 + {TX_SW_CFG0, 0x0}, // Gary,2008-05-21 for CWC test + {TX_SW_CFG1, 0x80606}, // Gary,2006-08-23 + {TX_LINK_CFG, 0x1020}, // Gary,2006-08-23 + //{TX_TIMEOUT_CFG, 0x00182090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT + {TX_TIMEOUT_CFG, 0x000a2090}, // CCK has some problem. So increase timieout value. 2006-10-09// MArvek RT , Modify for 2860E ,2007-08-01 + {MAX_LEN_CFG, MAX_AGGREGATION_SIZE | 0x00001000}, // 0x3018, MAX frame length. Max PSDU = 16kbytes. + {LED_CFG, 0x7f031e46}, // Gary, 2006-08-23 + +//#ifdef CONFIG_AP_SUPPORT +// {WMM_AIFSN_CFG, 0x00001173}, +// {WMM_CWMIN_CFG, 0x00002344}, +// {WMM_CWMAX_CFG, 0x000034a6}, +// {WMM_TXOP0_CFG, 0x00100020}, +// {WMM_TXOP1_CFG, 0x002F0038}, +//#endif // CONFIG_AP_SUPPORT // + +//#ifdef CONFIG_STA_SUPPORT +// {WMM_AIFSN_CFG, 0x00002273}, +// {WMM_CWMIN_CFG, 0x00002344}, +// {WMM_CWMAX_CFG, 0x000034aa}, +//#endif // CONFIG_STA_SUPPORT // +#ifdef INF_AMAZON_SE + {PBF_MAX_PCNT, 0x1F3F6F6F}, //iverson modify for usb issue, 2008/09/19 + // 6F + 6F < total page count FE + // so that RX doesn't occupy TX's buffer space when WMM congestion. +#else + {PBF_MAX_PCNT, 0x1F3FBF9F}, //0x1F3f7f9f}, //Jan, 2006/04/20 +#endif // INF_AMAZON_SE // + //{TX_RTY_CFG, 0x6bb80408}, // Jan, 2006/11/16 +// WMM_ACM_SUPPORT +// {TX_RTY_CFG, 0x6bb80101}, // sample + {TX_RTY_CFG, 0x47d01f0f}, // Jan, 2006/11/16, Set TxWI->ACK =0 in Probe Rsp Modify for 2860E ,2007-08-03 + + {AUTO_RSP_CFG, 0x00000013}, // Initial Auto_Responder, because QA will turn off Auto-Responder + {CCK_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled. + {OFDM_PROT_CFG, 0x05740003 /*0x01740003*/}, // Initial Auto_Responder, because QA will turn off Auto-Responder. And RTS threshold is enabled. + {GF20_PROT_CFG, 0x01744004}, // set 19:18 --> Short NAV for MIMO PS + {GF40_PROT_CFG, 0x03F44084}, + {MM20_PROT_CFG, 0x01744004}, +#ifdef RTMP_MAC_PCI + {MM40_PROT_CFG, 0x03F54084}, +#endif // RTMP_MAC_PCI // + {TXOP_CTRL_CFG, 0x0000583f, /*0x0000243f*/ /*0x000024bf*/}, //Extension channel backoff. + {TX_RTS_CFG, 0x00092b20}, +//#ifdef WIFI_TEST + {EXP_ACK_TIME, 0x002400ca}, // default value +//#else +// {EXP_ACK_TIME, 0x005400ca}, // suggested by Gray @ 20070323 for 11n intel-sta throughput +//#endif // end - WIFI_TEST // +//#ifdef CONFIG_AP_SUPPORT +// {TBTT_SYNC_CFG, 0x00422000}, // TBTT_ADJUST(7:0) == 0 +// {TBTT_SYNC_CFG, 0x00012000}, // TBTT_ADJUST(7:0) == 0 +//#endif // CONFIG_AP_SUPPORT // + {TXOP_HLDR_ET, 0x00000002}, + + /* Jerry comments 2008/01/16: we use SIFS = 10us in CCK defaultly, but it seems that 10us + is too small for INTEL 2200bg card, so in MBSS mode, the delta time between beacon0 + and beacon1 is SIFS (10us), so if INTEL 2200bg card connects to BSS0, the ping + will always lost. So we change the SIFS of CCK from 10us to 16us. */ + {XIFS_TIME_CFG, 0x33a41010}, + {PWR_PIN_CFG, 0x00000003}, // patch for 2880-E +}; + + +#ifdef CONFIG_STA_SUPPORT +RTMP_REG_PAIR STAMACRegTable[] = { + {WMM_AIFSN_CFG, 0x00002273}, + {WMM_CWMIN_CFG, 0x00002344}, + {WMM_CWMAX_CFG, 0x000034aa}, +}; +#endif // CONFIG_STA_SUPPORT // + +#define NUM_MAC_REG_PARMS (sizeof(MACRegTable) / sizeof(RTMP_REG_PAIR)) +#ifdef CONFIG_STA_SUPPORT +#define NUM_STA_MAC_REG_PARMS (sizeof(STAMACRegTable) / sizeof(RTMP_REG_PAIR)) +#endif // CONFIG_STA_SUPPORT // + + +/* + ======================================================================== + + Routine Description: + Allocate RTMP_ADAPTER data block and do some initialization + + Arguments: + Adapter Pointer to our adapter + + Return Value: + NDIS_STATUS_SUCCESS + NDIS_STATUS_FAILURE + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +NDIS_STATUS RTMPAllocAdapterBlock( + IN PVOID handle, + OUT PRTMP_ADAPTER *ppAdapter) +{ + PRTMP_ADAPTER pAd = NULL; + NDIS_STATUS Status; + INT index; + UCHAR *pBeaconBuf = NULL; + + DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocAdapterBlock\n")); + + *ppAdapter = NULL; + + do + { + // Allocate RTMP_ADAPTER memory block + pBeaconBuf = kmalloc(MAX_BEACON_SIZE, MEM_ALLOC_FLAG); + if (pBeaconBuf == NULL) + { + Status = NDIS_STATUS_FAILURE; + DBGPRINT_ERR(("Failed to allocate memory - BeaconBuf!\n")); + break; + } + NdisZeroMemory(pBeaconBuf, MAX_BEACON_SIZE); + + Status = AdapterBlockAllocateMemory(handle, (PVOID *)&pAd); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT_ERR(("Failed to allocate memory - ADAPTER\n")); + break; + } + pAd->BeaconBuf = pBeaconBuf; + DBGPRINT(RT_DEBUG_OFF, ("\n\n=== pAd = %p, size = %d ===\n\n", pAd, (UINT32)sizeof(RTMP_ADAPTER))); + + + // Init spin locks + NdisAllocateSpinLock(&pAd->MgmtRingLock); +#ifdef RTMP_MAC_PCI + NdisAllocateSpinLock(&pAd->RxRingLock); +#endif // RTMP_MAC_PCI // + + for (index =0 ; index < NUM_OF_TX_RING; index++) + { + NdisAllocateSpinLock(&pAd->TxSwQueueLock[index]); + NdisAllocateSpinLock(&pAd->DeQueueLock[index]); + pAd->DeQueueRunning[index] = FALSE; + } + + NdisAllocateSpinLock(&pAd->irq_lock); + + + + // assign function pointers + } while (FALSE); + + if ((Status != NDIS_STATUS_SUCCESS) && (pBeaconBuf)) + kfree(pBeaconBuf); + + *ppAdapter = pAd; + + + /* + Init ProbeRespIE Table + */ + for (index = 0; index < MAX_LEN_OF_BSS_TABLE; index++) + { + if (os_alloc_mem(pAd,&pAd->ProbeRespIE[index].pIe, MAX_VIE_LEN) == NDIS_STATUS_SUCCESS) + RTMPZeroMemory(pAd->ProbeRespIE[index].pIe, MAX_VIE_LEN); + else + pAd->ProbeRespIE[index].pIe = NULL; + } + + DBGPRINT_S(Status, ("<-- RTMPAllocAdapterBlock, Status=%x\n", Status)); + return Status; +} + + +/* + ======================================================================== + + Routine Description: + Read initial Tx power per MCS and BW from EEPROM + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPReadTxPwrPerRate( + IN PRTMP_ADAPTER pAd) +{ + ULONG data, Adata, Gdata; + USHORT i, value, value2; + USHORT value_1, value_2, value_3, value_4; + INT Apwrdelta, Gpwrdelta; + UCHAR t1,t2,t3,t4; + BOOLEAN bApwrdeltaMinus = TRUE, bGpwrdeltaMinus = TRUE; + + // + // Get power delta for 20MHz and 40MHz. + // + DBGPRINT(RT_DEBUG_TRACE, ("Txpower per Rate\n")); + RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_DELTA, value2); + Apwrdelta = 0; + Gpwrdelta = 0; + + if ((value2 & 0xff) != 0xff) + { + if ((value2 & 0x80)) + Gpwrdelta = (value2&0xf); + + if ((value2 & 0x40)) + bGpwrdeltaMinus = FALSE; + else + bGpwrdeltaMinus = TRUE; + } + if ((value2 & 0xff00) != 0xff00) + { + if ((value2 & 0x8000)) + Apwrdelta = ((value2&0xf00)>>8); + + if ((value2 & 0x4000)) + bApwrdeltaMinus = FALSE; + else + bApwrdeltaMinus = TRUE; + } + DBGPRINT(RT_DEBUG_TRACE, ("Gpwrdelta = %x, Apwrdelta = %x .\n", Gpwrdelta, Apwrdelta)); + + // + // Get Txpower per MCS for 20MHz in 2.4G. + // + for (i=0; i<5; i++) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4, value); + data = value; + + /* use value_1 ~ value_4 for code size reduce */ + value_1 = value&0xf; + value_2 = (value&0xf0)>>4; + value_3 = (value&0xf00)>>8; + value_4 = (value&0xf000)>>12; + + if (bApwrdeltaMinus == FALSE) + { + t1 = value_1+(Apwrdelta); + if (t1 > 0xf) + t1 = 0xf; + t2 = value_2+(Apwrdelta); + if (t2 > 0xf) + t2 = 0xf; + t3 = value_3+(Apwrdelta); + if (t3 > 0xf) + t3 = 0xf; + t4 = value_4+(Apwrdelta); + if (t4 > 0xf) + t4 = 0xf; + } + else + { + if (value_1 > Apwrdelta) + t1 = value_1-(Apwrdelta); + else + t1 = 0; + if (value_2 > Apwrdelta) + t2 = value_2-(Apwrdelta); + else + t2 = 0; + if (value_3 > Apwrdelta) + t3 = value_3-(Apwrdelta); + else + t3 = 0; + if (value_4 > Apwrdelta) + t4 = value_4-(Apwrdelta); + else + t4 = 0; + } + Adata = t1 + (t2<<4) + (t3<<8) + (t4<<12); + if (bGpwrdeltaMinus == FALSE) + { + t1 = value_1+(Gpwrdelta); + if (t1 > 0xf) + t1 = 0xf; + t2 = value_2+(Gpwrdelta); + if (t2 > 0xf) + t2 = 0xf; + t3 = value_3+(Gpwrdelta); + if (t3 > 0xf) + t3 = 0xf; + t4 = value_4+(Gpwrdelta); + if (t4 > 0xf) + t4 = 0xf; + } + else + { + if (value_1 > Gpwrdelta) + t1 = value_1-(Gpwrdelta); + else + t1 = 0; + if (value_2 > Gpwrdelta) + t2 = value_2-(Gpwrdelta); + else + t2 = 0; + if (value_3 > Gpwrdelta) + t3 = value_3-(Gpwrdelta); + else + t3 = 0; + if (value_4 > Gpwrdelta) + t4 = value_4-(Gpwrdelta); + else + t4 = 0; + } + Gdata = t1 + (t2<<4) + (t3<<8) + (t4<<12); + + RT28xx_EEPROM_READ16(pAd, EEPROM_TXPOWER_BYRATE_20MHZ_2_4G + i*4 + 2, value); + + /* use value_1 ~ value_4 for code size reduce */ + value_1 = value&0xf; + value_2 = (value&0xf0)>>4; + value_3 = (value&0xf00)>>8; + value_4 = (value&0xf000)>>12; + + if (bApwrdeltaMinus == FALSE) + { + t1 = value_1+(Apwrdelta); + if (t1 > 0xf) + t1 = 0xf; + t2 = value_2+(Apwrdelta); + if (t2 > 0xf) + t2 = 0xf; + t3 = value_3+(Apwrdelta); + if (t3 > 0xf) + t3 = 0xf; + t4 = value_4+(Apwrdelta); + if (t4 > 0xf) + t4 = 0xf; + } + else + { + if (value_1 > Apwrdelta) + t1 = value_1-(Apwrdelta); + else + t1 = 0; + if (value_2 > Apwrdelta) + t2 = value_2-(Apwrdelta); + else + t2 = 0; + if (value_3 > Apwrdelta) + t3 = value_3-(Apwrdelta); + else + t3 = 0; + if (value_4 > Apwrdelta) + t4 = value_4-(Apwrdelta); + else + t4 = 0; + } + Adata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28)); + if (bGpwrdeltaMinus == FALSE) + { + t1 = value_1+(Gpwrdelta); + if (t1 > 0xf) + t1 = 0xf; + t2 = value_2+(Gpwrdelta); + if (t2 > 0xf) + t2 = 0xf; + t3 = value_3+(Gpwrdelta); + if (t3 > 0xf) + t3 = 0xf; + t4 = value_4+(Gpwrdelta); + if (t4 > 0xf) + t4 = 0xf; + } + else + { + if (value_1 > Gpwrdelta) + t1 = value_1-(Gpwrdelta); + else + t1 = 0; + if (value_2 > Gpwrdelta) + t2 = value_2-(Gpwrdelta); + else + t2 = 0; + if (value_3 > Gpwrdelta) + t3 = value_3-(Gpwrdelta); + else + t3 = 0; + if (value_4 > Gpwrdelta) + t4 = value_4-(Gpwrdelta); + else + t4 = 0; + } + Gdata |= ((t1<<16) + (t2<<20) + (t3<<24) + (t4<<28)); + data |= (value<<16); + + /* For 20M/40M Power Delta issue */ + pAd->Tx20MPwrCfgABand[i] = data; + pAd->Tx20MPwrCfgGBand[i] = data; + pAd->Tx40MPwrCfgABand[i] = Adata; + pAd->Tx40MPwrCfgGBand[i] = Gdata; + + if (data != 0xffffffff) + RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, data); + DBGPRINT_RAW(RT_DEBUG_TRACE, ("20MHz BW, 2.4G band-%lx, Adata = %lx, Gdata = %lx \n", data, Adata, Gdata)); + } +} + + +/* + ======================================================================== + + Routine Description: + Read initial channel power parameters from EEPROM + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPReadChannelPwr( + IN PRTMP_ADAPTER pAd) +{ + UINT32 i, choffset; + EEPROM_TX_PWR_STRUC Power; + EEPROM_TX_PWR_STRUC Power2; + + // Read Tx power value for all channels + // Value from 1 - 0x7f. Default value is 24. + // Power value : 2.4G 0x00 (0) ~ 0x1F (31) + // : 5.5G 0xF9 (-7) ~ 0x0F (15) + + // 0. 11b/g, ch1 - ch 14 + for (i = 0; i < 7; i++) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + i * 2, Power.word); + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + i * 2, Power2.word); + pAd->TxPower[i * 2].Channel = i * 2 + 1; + pAd->TxPower[i * 2 + 1].Channel = i * 2 + 2; + + if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0)) + pAd->TxPower[i * 2].Power = DEFAULT_RF_TX_POWER; + else + pAd->TxPower[i * 2].Power = Power.field.Byte0; + + if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0)) + pAd->TxPower[i * 2 + 1].Power = DEFAULT_RF_TX_POWER; + else + pAd->TxPower[i * 2 + 1].Power = Power.field.Byte1; + + if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0)) + pAd->TxPower[i * 2].Power2 = DEFAULT_RF_TX_POWER; + else + pAd->TxPower[i * 2].Power2 = Power2.field.Byte0; + + if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0)) + pAd->TxPower[i * 2 + 1].Power2 = DEFAULT_RF_TX_POWER; + else + pAd->TxPower[i * 2 + 1].Power2 = Power2.field.Byte1; + } + + // 1. U-NII lower/middle band: 36, 38, 40; 44, 46, 48; 52, 54, 56; 60, 62, 64 (including central frequency in BW 40MHz) + // 1.1 Fill up channel + choffset = 14; + for (i = 0; i < 4; i++) + { + pAd->TxPower[3 * i + choffset + 0].Channel = 36 + i * 8 + 0; + pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER; + + pAd->TxPower[3 * i + choffset + 1].Channel = 36 + i * 8 + 2; + pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER; + + pAd->TxPower[3 * i + choffset + 2].Channel = 36 + i * 8 + 4; + pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER; + } + + // 1.2 Fill up power + for (i = 0; i < 6; i++) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + i * 2, Power.word); + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + i * 2, Power2.word); + + if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7)) + pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0; + + if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7)) + pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1; + + if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7)) + pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0; + + if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7)) + pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1; + } + + // 2. HipperLAN 2 100, 102 ,104; 108, 110, 112; 116, 118, 120; 124, 126, 128; 132, 134, 136; 140 (including central frequency in BW 40MHz) + // 2.1 Fill up channel + choffset = 14 + 12; + for (i = 0; i < 5; i++) + { + pAd->TxPower[3 * i + choffset + 0].Channel = 100 + i * 8 + 0; + pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER; + + pAd->TxPower[3 * i + choffset + 1].Channel = 100 + i * 8 + 2; + pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER; + + pAd->TxPower[3 * i + choffset + 2].Channel = 100 + i * 8 + 4; + pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER; + } + pAd->TxPower[3 * 5 + choffset + 0].Channel = 140; + pAd->TxPower[3 * 5 + choffset + 0].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * 5 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER; + + // 2.2 Fill up power + for (i = 0; i < 8; i++) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word); + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word); + + if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7)) + pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0; + + if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7)) + pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1; + + if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7)) + pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0; + + if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7)) + pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1; + } + + // 3. U-NII upper band: 149, 151, 153; 157, 159, 161; 165, 167, 169; 171, 173 (including central frequency in BW 40MHz) + // 3.1 Fill up channel + choffset = 14 + 12 + 16; + /*for (i = 0; i < 2; i++)*/ + for (i = 0; i < 3; i++) + { + pAd->TxPower[3 * i + choffset + 0].Channel = 149 + i * 8 + 0; + pAd->TxPower[3 * i + choffset + 0].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 0].Power2 = DEFAULT_RF_TX_POWER; + + pAd->TxPower[3 * i + choffset + 1].Channel = 149 + i * 8 + 2; + pAd->TxPower[3 * i + choffset + 1].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 1].Power2 = DEFAULT_RF_TX_POWER; + + pAd->TxPower[3 * i + choffset + 2].Channel = 149 + i * 8 + 4; + pAd->TxPower[3 * i + choffset + 2].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * i + choffset + 2].Power2 = DEFAULT_RF_TX_POWER; + } + pAd->TxPower[3 * 3 + choffset + 0].Channel = 171; + pAd->TxPower[3 * 3 + choffset + 0].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * 3 + choffset + 0].Power2 = DEFAULT_RF_TX_POWER; + + pAd->TxPower[3 * 3 + choffset + 1].Channel = 173; + pAd->TxPower[3 * 3 + choffset + 1].Power = DEFAULT_RF_TX_POWER; + pAd->TxPower[3 * 3 + choffset + 1].Power2 = DEFAULT_RF_TX_POWER; + + // 3.2 Fill up power + /*for (i = 0; i < 4; i++)*/ + for (i = 0; i < 6; i++) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX_PWR_OFFSET + (choffset - 14) + i * 2, Power.word); + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TX2_PWR_OFFSET + (choffset - 14) + i * 2, Power2.word); + + if ((Power.field.Byte0 < 16) && (Power.field.Byte0 >= -7)) + pAd->TxPower[i * 2 + choffset + 0].Power = Power.field.Byte0; + + if ((Power.field.Byte1 < 16) && (Power.field.Byte1 >= -7)) + pAd->TxPower[i * 2 + choffset + 1].Power = Power.field.Byte1; + + if ((Power2.field.Byte0 < 16) && (Power2.field.Byte0 >= -7)) + pAd->TxPower[i * 2 + choffset + 0].Power2 = Power2.field.Byte0; + + if ((Power2.field.Byte1 < 16) && (Power2.field.Byte1 >= -7)) + pAd->TxPower[i * 2 + choffset + 1].Power2 = Power2.field.Byte1; + } + + // 4. Print and Debug + /*choffset = 14 + 12 + 16 + 7;*/ + choffset = 14 + 12 + 16 + 11; + + +} + + + +/* + ======================================================================== + + Routine Description: + Read initial parameters from EEPROM + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +VOID NICReadEEPROMParameters( + IN PRTMP_ADAPTER pAd, + IN PSTRING mac_addr) +{ + UINT32 data = 0; + USHORT i, value, value2; + UCHAR TmpPhy; + EEPROM_TX_PWR_STRUC Power; + EEPROM_VERSION_STRUC Version; + EEPROM_ANTENNA_STRUC Antenna; + EEPROM_NIC_CONFIG2_STRUC NicConfig2; + USHORT Addr01,Addr23,Addr45 ; + MAC_DW0_STRUC csr2; + MAC_DW1_STRUC csr3; + + + DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters\n")); + + if (pAd->chipOps.eeinit) + pAd->chipOps.eeinit(pAd); +#ifdef RTMP_EFUSE_SUPPORT +#ifdef RT30xx +#ifdef RALINK_ATE + if(!pAd->bFroceEEPROMBuffer && pAd->bEEPROMFile) + { + DBGPRINT(RT_DEBUG_TRACE, ("--> NICReadEEPROMParameters::(Efuse)Load to EEPROM Buffer Mode\n")); + eFuseLoadEEPROM(pAd); + } +#endif // RALINK_ATE // +#endif // RT30xx // +#endif // RTMP_EFUSE_SUPPORT // + + // Init EEPROM Address Number, before access EEPROM; if 93c46, EEPROMAddressNum=6, else if 93c66, EEPROMAddressNum=8 + RTMP_IO_READ32(pAd, E2PROM_CSR, &data); + DBGPRINT(RT_DEBUG_TRACE, ("--> E2PROM_CSR = 0x%x\n", data)); + + if((data & 0x30) == 0) + pAd->EEPROMAddressNum = 6; // 93C46 + else if((data & 0x30) == 0x10) + pAd->EEPROMAddressNum = 8; // 93C66 + else + pAd->EEPROMAddressNum = 8; // 93C86 + DBGPRINT(RT_DEBUG_TRACE, ("--> EEPROMAddressNum = %d\n", pAd->EEPROMAddressNum )); + + /* Read MAC setting from EEPROM and record as permanent MAC address */ + DBGPRINT(RT_DEBUG_TRACE, ("Initialize MAC Address from E2PROM \n")); + + RT28xx_EEPROM_READ16(pAd, 0x04, Addr01); + RT28xx_EEPROM_READ16(pAd, 0x06, Addr23); + RT28xx_EEPROM_READ16(pAd, 0x08, Addr45); + + pAd->PermanentAddress[0] = (UCHAR)(Addr01 & 0xff); + pAd->PermanentAddress[1] = (UCHAR)(Addr01 >> 8); + pAd->PermanentAddress[2] = (UCHAR)(Addr23 & 0xff); + pAd->PermanentAddress[3] = (UCHAR)(Addr23 >> 8); + pAd->PermanentAddress[4] = (UCHAR)(Addr45 & 0xff); + pAd->PermanentAddress[5] = (UCHAR)(Addr45 >> 8); + + //more conveninet to test mbssid, so ap's bssid &0xf1 + if (pAd->PermanentAddress[0] == 0xff) + pAd->PermanentAddress[0] = RandomByte(pAd)&0xf8; + + DBGPRINT(RT_DEBUG_TRACE, ("E2PROM MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n", + PRINT_MAC(pAd->PermanentAddress))); + + /* Assign the actually working MAC Address */ + if (pAd->bLocalAdminMAC) + { + DBGPRINT(RT_DEBUG_TRACE, ("Use the MAC address what is assigned from Configuration file(.dat). \n")); + } + else if (mac_addr && + strlen((PSTRING)mac_addr) == 17 && + (strcmp(mac_addr, "00:00:00:00:00:00") != 0)) + { + INT j; + PSTRING macptr; + + macptr = (PSTRING) mac_addr; + + for (j=0; j<MAC_ADDR_LEN; j++) + { + AtoH(macptr, &pAd->CurrentAddress[j], 1); + macptr=macptr+3; + } + + DBGPRINT(RT_DEBUG_TRACE, ("Use the MAC address what is assigned from Moudle Parameter. \n")); + } + else + { + COPY_MAC_ADDR(pAd->CurrentAddress, pAd->PermanentAddress); + DBGPRINT(RT_DEBUG_TRACE, ("Use the MAC address what is assigned from EEPROM. \n")); + } + + /* Set the current MAC to ASIC */ + csr2.field.Byte0 = pAd->CurrentAddress[0]; + csr2.field.Byte1 = pAd->CurrentAddress[1]; + csr2.field.Byte2 = pAd->CurrentAddress[2]; + csr2.field.Byte3 = pAd->CurrentAddress[3]; + RTMP_IO_WRITE32(pAd, MAC_ADDR_DW0, csr2.word); + csr3.word = 0; + csr3.field.Byte4 = pAd->CurrentAddress[4]; + csr3.field.Byte5 = pAd->CurrentAddress[5]; + csr3.field.U2MeMask = 0xff; + RTMP_IO_WRITE32(pAd, MAC_ADDR_DW1, csr3.word); + DBGPRINT_RAW(RT_DEBUG_TRACE,("Current MAC: =%02x:%02x:%02x:%02x:%02x:%02x\n", + PRINT_MAC(pAd->CurrentAddress))); + + // if not return early. cause fail at emulation. + // Init the channel number for TX channel power + RTMPReadChannelPwr(pAd); + + // if E2PROM version mismatch with driver's expectation, then skip + // all subsequent E2RPOM retieval and set a system error bit to notify GUI + RT28xx_EEPROM_READ16(pAd, EEPROM_VERSION_OFFSET, Version.word); + pAd->EepromVersion = Version.field.Version + Version.field.FaeReleaseNumber * 256; + DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: Version = %d, FAE release #%d\n", Version.field.Version, Version.field.FaeReleaseNumber)); + + if (Version.field.Version > VALID_EEPROM_VERSION) + { + DBGPRINT_ERR(("E2PROM: WRONG VERSION 0x%x, should be %d\n",Version.field.Version, VALID_EEPROM_VERSION)); + /*pAd->SystemErrorBitmap |= 0x00000001; + + // hard-code default value when no proper E2PROM installed + pAd->bAutoTxAgcA = FALSE; + pAd->bAutoTxAgcG = FALSE; + + // Default the channel power + for (i = 0; i < MAX_NUM_OF_CHANNELS; i++) + pAd->TxPower[i].Power = DEFAULT_RF_TX_POWER; + + // Default the channel power + for (i = 0; i < MAX_NUM_OF_11JCHANNELS; i++) + pAd->TxPower11J[i].Power = DEFAULT_RF_TX_POWER; + + for(i = 0; i < NUM_EEPROM_BBP_PARMS; i++) + pAd->EEPROMDefaultValue[i] = 0xffff; + return; */ + } + + // Read BBP default value from EEPROM and store to array(EEPROMDefaultValue) in pAd + RT28xx_EEPROM_READ16(pAd, EEPROM_NIC1_OFFSET, value); + pAd->EEPROMDefaultValue[0] = value; + + RT28xx_EEPROM_READ16(pAd, EEPROM_NIC2_OFFSET, value); + pAd->EEPROMDefaultValue[1] = value; + + RT28xx_EEPROM_READ16(pAd, EEPROM_COUNTRY_REGION, value); // Country Region + pAd->EEPROMDefaultValue[2] = value; + + for(i = 0; i < 8; i++) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_BBP_BASE_OFFSET + i*2, value); + pAd->EEPROMDefaultValue[i+3] = value; + } + + // We have to parse NIC configuration 0 at here. + // If TSSI did not have preloaded value, it should reset the TxAutoAgc to false + // Therefore, we have to read TxAutoAgc control beforehand. + // Read Tx AGC control bit + Antenna.word = pAd->EEPROMDefaultValue[0]; + if (Antenna.word == 0xFFFF) + { +#ifdef RT30xx + if(IS_RT3090(pAd)|| IS_RT3390(pAd)) + { + Antenna.word = 0; + Antenna.field.RfIcType = RFIC_3020; + Antenna.field.TxPath = 1; + Antenna.field.RxPath = 1; + } + else +#endif // RT30xx // +#ifdef RT35xx + if(IS_RT3572(pAd)) + { + Antenna.word = 0; + Antenna.field.RfIcType = RFIC_3052; + Antenna.field.TxPath = 2; + Antenna.field.RxPath = 2; + } + else +#endif // RT35xx // + { + + Antenna.word = 0; + Antenna.field.RfIcType = RFIC_2820; + Antenna.field.TxPath = 1; + Antenna.field.RxPath = 2; + DBGPRINT(RT_DEBUG_WARN, ("E2PROM error, hard code as 0x%04x\n", Antenna.word)); + } + } + + // Choose the desired Tx&Rx stream. + if ((pAd->CommonCfg.TxStream == 0) || (pAd->CommonCfg.TxStream > Antenna.field.TxPath)) + pAd->CommonCfg.TxStream = Antenna.field.TxPath; + + if ((pAd->CommonCfg.RxStream == 0) || (pAd->CommonCfg.RxStream > Antenna.field.RxPath)) + { + pAd->CommonCfg.RxStream = Antenna.field.RxPath; + + if ((pAd->MACVersion != RALINK_2883_VERSION) && + (pAd->CommonCfg.RxStream > 2)) + { + // only 2 Rx streams for RT2860 series + pAd->CommonCfg.RxStream = 2; + } + } + + + /* EEPROM offset 0x36 - NIC Configuration 1 */ + NicConfig2.word = pAd->EEPROMDefaultValue[1]; + + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if ((NicConfig2.word & 0x00ff) == 0xff) + { + NicConfig2.word &= 0xff00; + } + + if ((NicConfig2.word >> 8) == 0xff) + { + NicConfig2.word &= 0x00ff; + } + } +#endif // CONFIG_STA_SUPPORT // + + if (NicConfig2.field.DynamicTxAgcControl == 1) + pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE; + else + pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE; + + /* Save value for future using */ + pAd->NicConfig2.word = NicConfig2.word; + + DBGPRINT_RAW(RT_DEBUG_TRACE, ("NICReadEEPROMParameters: RxPath = %d, TxPath = %d\n", Antenna.field.RxPath, Antenna.field.TxPath)); + + // Save the antenna for future use + pAd->Antenna.word = Antenna.word; + + // Set the RfICType here, then we can initialize RFIC related operation callbacks + pAd->Mlme.RealRxPath = (UCHAR) Antenna.field.RxPath; + pAd->RfIcType = (UCHAR) Antenna.field.RfIcType; + +#ifdef CONFIG_STA_SUPPORT +#ifdef RTMP_MAC_PCI +#ifdef RT35xx + if (IS_RT3572(pAd)) + sprintf((PSTRING) pAd->nickname, "RT3562STA"); + else +#endif // RT35xx + sprintf((PSTRING) pAd->nickname, "RT2860STA"); +#endif // RTMP_MAC_PCI // +#endif // CONFIG_STA_SUPPORT // + +#ifdef RTMP_RF_RW_SUPPORT + RtmpChipOpsRFHook(pAd); +#endif // RTMP_RF_RW_SUPPORT // + + // + // Reset PhyMode if we don't support 802.11a + // Only RFIC_2850 & RFIC_2750 support 802.11a + // + if ((Antenna.field.RfIcType != RFIC_2850) + && (Antenna.field.RfIcType != RFIC_2750) + && (Antenna.field.RfIcType != RFIC_3052) + ) + { + if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) || + (pAd->CommonCfg.PhyMode == PHY_11A)) + pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; +#ifdef DOT11_N_SUPPORT + else if ((pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || + (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) || + (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) || + (pAd->CommonCfg.PhyMode == PHY_11N_5G)) + pAd->CommonCfg.PhyMode = PHY_11BGN_MIXED; +#endif // DOT11_N_SUPPORT // + + pAd->RFICType = RFIC_24GHZ; // CRDA + } + else + { + pAd->RFICType = RFIC_24GHZ | RFIC_5GHZ; // CRDA + } + + // Read TSSI reference and TSSI boundary for temperature compensation. This is ugly + // 0. 11b/g + { + /* these are tempature reference value (0x00 ~ 0xFE) + ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0 + TssiPlusBoundaryG [4] [3] [2] [1] [0] (smaller) + + TssiMinusBoundaryG[0] [1] [2] [3] [4] (larger) */ + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND1, Power.word); + pAd->TssiMinusBoundaryG[4] = Power.field.Byte0; + pAd->TssiMinusBoundaryG[3] = Power.field.Byte1; + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND2, Power.word); + pAd->TssiMinusBoundaryG[2] = Power.field.Byte0; + pAd->TssiMinusBoundaryG[1] = Power.field.Byte1; + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND3, Power.word); + pAd->TssiRefG = Power.field.Byte0; /* reference value [0] */ + pAd->TssiPlusBoundaryG[1] = Power.field.Byte1; + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND4, Power.word); + pAd->TssiPlusBoundaryG[2] = Power.field.Byte0; + pAd->TssiPlusBoundaryG[3] = Power.field.Byte1; + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TSSI_BOUND5, Power.word); + pAd->TssiPlusBoundaryG[4] = Power.field.Byte0; + pAd->TxAgcStepG = Power.field.Byte1; + pAd->TxAgcCompensateG = 0; + pAd->TssiMinusBoundaryG[0] = pAd->TssiRefG; + pAd->TssiPlusBoundaryG[0] = pAd->TssiRefG; + + // Disable TxAgc if the based value is not right + if (pAd->TssiRefG == 0xff) + pAd->bAutoTxAgcG = FALSE; + + DBGPRINT(RT_DEBUG_TRACE,("E2PROM: G Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n", + pAd->TssiMinusBoundaryG[4], pAd->TssiMinusBoundaryG[3], pAd->TssiMinusBoundaryG[2], pAd->TssiMinusBoundaryG[1], + pAd->TssiRefG, + pAd->TssiPlusBoundaryG[1], pAd->TssiPlusBoundaryG[2], pAd->TssiPlusBoundaryG[3], pAd->TssiPlusBoundaryG[4], + pAd->TxAgcStepG, pAd->bAutoTxAgcG)); + } + // 1. 11a + { + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND1, Power.word); + pAd->TssiMinusBoundaryA[4] = Power.field.Byte0; + pAd->TssiMinusBoundaryA[3] = Power.field.Byte1; + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND2, Power.word); + pAd->TssiMinusBoundaryA[2] = Power.field.Byte0; + pAd->TssiMinusBoundaryA[1] = Power.field.Byte1; + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND3, Power.word); + pAd->TssiRefA = Power.field.Byte0; + pAd->TssiPlusBoundaryA[1] = Power.field.Byte1; + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND4, Power.word); + pAd->TssiPlusBoundaryA[2] = Power.field.Byte0; + pAd->TssiPlusBoundaryA[3] = Power.field.Byte1; + RT28xx_EEPROM_READ16(pAd, EEPROM_A_TSSI_BOUND5, Power.word); + pAd->TssiPlusBoundaryA[4] = Power.field.Byte0; + pAd->TxAgcStepA = Power.field.Byte1; + pAd->TxAgcCompensateA = 0; + pAd->TssiMinusBoundaryA[0] = pAd->TssiRefA; + pAd->TssiPlusBoundaryA[0] = pAd->TssiRefA; + + // Disable TxAgc if the based value is not right + if (pAd->TssiRefA == 0xff) + pAd->bAutoTxAgcA = FALSE; + + DBGPRINT(RT_DEBUG_TRACE,("E2PROM: A Tssi[-4 .. +4] = %d %d %d %d - %d -%d %d %d %d, step=%d, tuning=%d\n", + pAd->TssiMinusBoundaryA[4], pAd->TssiMinusBoundaryA[3], pAd->TssiMinusBoundaryA[2], pAd->TssiMinusBoundaryA[1], + pAd->TssiRefA, + pAd->TssiPlusBoundaryA[1], pAd->TssiPlusBoundaryA[2], pAd->TssiPlusBoundaryA[3], pAd->TssiPlusBoundaryA[4], + pAd->TxAgcStepA, pAd->bAutoTxAgcA)); + } + pAd->BbpRssiToDbmDelta = 0x0; + + // Read frequency offset setting for RF + RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value); + if ((value & 0x00FF) != 0x00FF) + pAd->RfFreqOffset = (ULONG) (value & 0x00FF); + else + pAd->RfFreqOffset = 0; + DBGPRINT(RT_DEBUG_TRACE, ("E2PROM: RF FreqOffset=0x%lx \n", pAd->RfFreqOffset)); + + //CountryRegion byte offset (38h) + value = pAd->EEPROMDefaultValue[2] >> 8; // 2.4G band + value2 = pAd->EEPROMDefaultValue[2] & 0x00FF; // 5G band + + if ((value <= REGION_MAXIMUM_BG_BAND) && (value2 <= REGION_MAXIMUM_A_BAND)) + { + pAd->CommonCfg.CountryRegion = ((UCHAR) value) | 0x80; + pAd->CommonCfg.CountryRegionForABand = ((UCHAR) value2) | 0x80; + TmpPhy = pAd->CommonCfg.PhyMode; + pAd->CommonCfg.PhyMode = 0xff; + RTMPSetPhyMode(pAd, TmpPhy); +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + } + + // + // Get RSSI Offset on EEPROM 0x9Ah & 0x9Ch. + // The valid value are (-10 ~ 10) + // + RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, value); + pAd->BGRssiOffset0 = value & 0x00ff; + pAd->BGRssiOffset1 = (value >> 8); + RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET+2, value); + pAd->BGRssiOffset2 = value & 0x00ff; + pAd->ALNAGain1 = (value >> 8); + RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, value); + pAd->BLNAGain = value & 0x00ff; + pAd->ALNAGain0 = (value >> 8); + + // Validate 11b/g RSSI_0 offset. + if ((pAd->BGRssiOffset0 < -10) || (pAd->BGRssiOffset0 > 10)) + pAd->BGRssiOffset0 = 0; + + // Validate 11b/g RSSI_1 offset. + if ((pAd->BGRssiOffset1 < -10) || (pAd->BGRssiOffset1 > 10)) + pAd->BGRssiOffset1 = 0; + + // Validate 11b/g RSSI_2 offset. + if ((pAd->BGRssiOffset2 < -10) || (pAd->BGRssiOffset2 > 10)) + pAd->BGRssiOffset2 = 0; + + RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, value); + pAd->ARssiOffset0 = value & 0x00ff; + pAd->ARssiOffset1 = (value >> 8); + RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET+2), value); + pAd->ARssiOffset2 = value & 0x00ff; + pAd->ALNAGain2 = (value >> 8); + + + if (((UCHAR)pAd->ALNAGain1 == 0xFF) || (pAd->ALNAGain1 == 0x00)) + pAd->ALNAGain1 = pAd->ALNAGain0; + if (((UCHAR)pAd->ALNAGain2 == 0xFF) || (pAd->ALNAGain2 == 0x00)) + pAd->ALNAGain2 = pAd->ALNAGain0; + + // Validate 11a RSSI_0 offset. + if ((pAd->ARssiOffset0 < -10) || (pAd->ARssiOffset0 > 10)) + pAd->ARssiOffset0 = 0; + + // Validate 11a RSSI_1 offset. + if ((pAd->ARssiOffset1 < -10) || (pAd->ARssiOffset1 > 10)) + pAd->ARssiOffset1 = 0; + + //Validate 11a RSSI_2 offset. + if ((pAd->ARssiOffset2 < -10) || (pAd->ARssiOffset2 > 10)) + pAd->ARssiOffset2 = 0; + +#ifdef RT30xx + // + // Get TX mixer gain setting + // 0xff are invalid value + // Note: RT30xX default value is 0x00 and will program to RF_R17 only when this value is not zero. + // RT359X default value is 0x02 + // + if (IS_RT30xx(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_TXMIXER_GAIN_2_4G, value); + pAd->TxMixerGain24G = 0; + value &= 0x00ff; + if (value != 0xff) + { + value &= 0x07; + pAd->TxMixerGain24G = (UCHAR)value; + } + } +#endif // RT30xx // +#ifdef RT35xx + // EEPROM setting of TxMixer for 3572 + if (IS_RT3572(pAd)) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_TXMIXER_GAIN_5G, value); + pAd->TxMixerGain5G = 0; + value &= 0x00ff; + if (value != 0xff) + { + value &= 0x07; + pAd->TxMixerGain5G = (UCHAR)value; + } + } +#endif // RT35xx // + + // + // Get LED Setting. + // + RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value); + pAd->LedCntl.word = (value>>8); + RT28xx_EEPROM_READ16(pAd, EEPROM_LED1_OFFSET, value); + pAd->Led1 = value; + RT28xx_EEPROM_READ16(pAd, EEPROM_LED2_OFFSET, value); + pAd->Led2 = value; + RT28xx_EEPROM_READ16(pAd, EEPROM_LED3_OFFSET, value); + pAd->Led3 = value; + + RTMPReadTxPwrPerRate(pAd); + +#ifdef SINGLE_SKU + RT28xx_EEPROM_READ16(pAd, EEPROM_DEFINE_MAX_TXPWR, pAd->CommonCfg.DefineMaxTxPwr); + if (pAd->CommonCfg.DefineMaxTxPwr <= 0x50 && pAd->CommonCfg.AntGain > 0 && pAd->CommonCfg.BandedgeDelta >= 0) + { + DBGPRINT(RT_DEBUG_TRACE, ("Single SKU Mode is enabled\n")); + pAd->CommonCfg.bSKUMode = TRUE; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Single SKU Mode is disabled\n")); + pAd->CommonCfg.bSKUMode = FALSE; + } +#endif // SINGLE_SKU // + +#ifdef RT30xx +#ifdef RTMP_EFUSE_SUPPORT + RtmpEfuseSupportCheck(pAd); +#endif // RTMP_EFUSE_SUPPORT // +#endif // RT30xx // + + DBGPRINT(RT_DEBUG_TRACE, ("<-- NICReadEEPROMParameters\n")); +} + + +/* + ======================================================================== + + Routine Description: + Set default value from EEPROM + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +VOID NICInitAsicFromEEPROM( + IN PRTMP_ADAPTER pAd) +{ +#ifdef CONFIG_STA_SUPPORT + UINT32 data = 0; + UCHAR BBPR1 = 0; +#endif // CONFIG_STA_SUPPORT // + USHORT i; + EEPROM_NIC_CONFIG2_STRUC NicConfig2; + UCHAR BBPR3 = 0; +#ifdef RT30xx + UCHAR bbpreg = 0; + UCHAR RFValue = 0; +#endif // RT30xx // + + DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitAsicFromEEPROM\n")); + for(i = 3; i < NUM_EEPROM_BBP_PARMS; i++) + { + UCHAR BbpRegIdx, BbpValue; + + if ((pAd->EEPROMDefaultValue[i] != 0xFFFF) && (pAd->EEPROMDefaultValue[i] != 0)) + { + BbpRegIdx = (UCHAR)(pAd->EEPROMDefaultValue[i] >> 8); + BbpValue = (UCHAR)(pAd->EEPROMDefaultValue[i] & 0xff); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BbpRegIdx, BbpValue); + } + } + + NicConfig2.word = pAd->NicConfig2.word; + +#ifdef RT30xx + // set default antenna as main + if (pAd->RfIcType == RFIC_3020) + AsicSetRxAnt(pAd, pAd->RxAnt.Pair1PrimaryRxAnt); +#endif // RT30xx // + + // + // Send LED Setting to MCU. + // + if (pAd->LedCntl.word == 0xFF) + { + pAd->LedCntl.word = 0x01; + pAd->Led1 = 0x5555; + pAd->Led2 = 0x2221; + +#ifdef RTMP_MAC_PCI + pAd->Led3 = 0xA9F8; +#endif // RTMP_MAC_PCI // + } + + AsicSendCommandToMcu(pAd, 0x52, 0xff, (UCHAR)pAd->Led1, (UCHAR)(pAd->Led1 >> 8)); + AsicSendCommandToMcu(pAd, 0x53, 0xff, (UCHAR)pAd->Led2, (UCHAR)(pAd->Led2 >> 8)); + AsicSendCommandToMcu(pAd, 0x54, 0xff, (UCHAR)pAd->Led3, (UCHAR)(pAd->Led3 >> 8)); + AsicSendCommandToMcu(pAd, 0x51, 0xff, 0, pAd->LedCntl.field.Polarity); + + pAd->LedIndicatorStrength = 0xFF; + RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, before link up + +#ifdef RTMP_RF_RW_SUPPORT + //Init RT30xx RFRegisters after read RFIC type from EEPROM + NICInitRFRegisters(pAd); +#endif // RTMP_RF_RW_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Read Hardware controlled Radio state enable bit + if (NicConfig2.field.HardwareRadioControl == 1) + { + pAd->StaCfg.bHardwareRadio = TRUE; + + // Read GPIO pin2 as Hardware controlled radio state + RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &data); + if ((data & 0x04) == 0) + { + pAd->StaCfg.bHwRadio = FALSE; + pAd->StaCfg.bRadio = FALSE; +// RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818); + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); + } + } + else + pAd->StaCfg.bHardwareRadio = FALSE; + + if (pAd->StaCfg.bRadio == FALSE) + { + RTMPSetLED(pAd, LED_RADIO_OFF); + } + else + { + RTMPSetLED(pAd, LED_RADIO_ON); +#ifdef RTMP_MAC_PCI + + AsicSendCommandToMcu(pAd, 0x30, PowerRadioOffCID, 0xff, 0x02); + AsicCheckCommanOk(pAd, PowerRadioOffCID); + + //AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02); + AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x00); + // 2-1. wait command ok. + AsicCheckCommanOk(pAd, PowerWakeCID); +#endif // RTMP_MAC_PCI // + } + } + + if (IS_RT3090(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd)) + { + RTMP_CHIP_OP *pChipOps = &pAd->chipOps; + if (pChipOps->AsicReverseRfFromSleepMode) + pChipOps->AsicReverseRfFromSleepMode(pAd); + } + +#ifdef PCIE_PS_SUPPORT +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + // Turn off patching for cardbus controller + if (NicConfig2.field.CardbusAcceleration == 1) + { +// pAd->bTest1 = TRUE; + } + + if (NicConfig2.field.DynamicTxAgcControl == 1) + pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = TRUE; + else + pAd->bAutoTxAgcA = pAd->bAutoTxAgcG = FALSE; + // + // Since BBP has been progamed, to make sure BBP setting will be + // upate inside of AsicAntennaSelect, so reset to UNKNOWN_BAND!! + // + pAd->CommonCfg.BandState = UNKNOWN_BAND; + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPR3); + BBPR3 &= (~0x18); + if(pAd->Antenna.field.RxPath == 3) + { + BBPR3 |= (0x10); + } + else if(pAd->Antenna.field.RxPath == 2) + { + BBPR3 |= (0x8); + } + else if(pAd->Antenna.field.RxPath == 1) + { + BBPR3 |= (0x0); + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPR3); + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Handle the difference when 1T + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BBPR1); + if(pAd->Antenna.field.TxPath == 1) + { + BBPR1 &= (~0x18); + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BBPR1); + + DBGPRINT(RT_DEBUG_TRACE, ("Use Hw Radio Control Pin=%d; if used Pin=%d;\n", + pAd->CommonCfg.bHardwareRadio, pAd->CommonCfg.bHardwareRadio)); + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef RT30xx +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + // enable DC filter + if ((pAd->MACVersion & 0xffff) >= 0x0201) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0); + } + + // improve power consumption + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg); + if (pAd->Antenna.field.TxPath == 1) + { + // turn off tx DAC_1 + bbpreg = (bbpreg | 0x20); + } + + if (pAd->Antenna.field.RxPath == 1) + { + // turn off tx ADC_1 + bbpreg &= (~0x2); + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg); + + if ((pAd->MACVersion & 0xffff) >= 0x0211) + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg); + bbpreg &= (~0x3); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg); + } + + // TX_LO1_en + RT30xxReadRFRegister(pAd, RF_R16, &RFValue); + + // set RF_R16_bit[2:0] equal to EEPROM setting at 0x48h and the value should start from 2. + //if (pAd->TxMixerGain24G >= 2) + { + RFValue &= (~0x7); // clean bit [2:0] + RFValue |= pAd->TxMixerGain24G; + } + RT30xxWriteRFRegister(pAd, RF_R16, RFValue); + } + else +#endif // RT35xx // + // Initialize RT3070 serial MAC registers which is different from RT2870 serial + if (IS_RT3090(pAd) || IS_RT3390(pAd)) + { + // enable DC filter + if ((pAd->MACVersion & 0xffff) >= 0x0211) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0); + } + + // improve power consumption + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R138, &bbpreg); + if (pAd->Antenna.field.TxPath == 1) + { + // turn off tx DAC_1 + bbpreg = (bbpreg | 0x20); + } + + if (pAd->Antenna.field.RxPath == 1) + { + // turn off tx ADC_1 + bbpreg &= (~0x2); + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R138, bbpreg); + + // improve power consumption in RT3071 Ver.E + if ((pAd->MACVersion & 0xffff) >= 0x0211) + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg); + bbpreg &= (~0x3); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg); + } + + + RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0); + + // RT3071 version E has fixed this issue + if ((pAd->MACVersion & 0xffff) < 0x0211) + { + if (pAd->NicConfig2.field.DACTestBit == 1) + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); // To fix throughput drop drastically + } + else + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); // To fix throughput drop drastically + } + } + else + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0); + } + } + else if (IS_RT3070(pAd)) + { + if ((pAd->MACVersion & 0xffff) >= 0x0201) + { + // enable DC filter + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R103, 0xc0); + + // improve power consumption in RT3070 Ver.F + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R31, &bbpreg); + bbpreg &= (~0x3); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R31, bbpreg); + } + + // TX_LO1_en, RF R17 register Bit 3 to 0 + RT30xxReadRFRegister(pAd, RF_R17, &RFValue); + RFValue &= (~0x08); + // to fix rx long range issue + if (pAd->NicConfig2.field.ExternalLNAForG == 0) + { + RFValue |= 0x20; + } + // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h + if (pAd->TxMixerGain24G >= 1) + { + RFValue &= (~0x7); // clean bit [2:0] + RFValue |= pAd->TxMixerGain24G; + } + RT30xxWriteRFRegister(pAd, RF_R17, RFValue); + + if (((pAd->MACVersion & 0xffff) < 0x0201)) + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0); + RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x2C); // To fix throughput drop drastically + } + else + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0); + } + } + else if (IS_RT3071(pAd) || IS_RT3572(pAd)) + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG1, 0); + if (((pAd->MACVersion & 0xffff) < 0x0211)) + { + if (pAd->NicConfig2.field.DACTestBit == 1) + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x1F); // To fix throughput drop drastically + } + else + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0F); // To fix throughput drop drastically + } + } + else + { + RTMP_IO_WRITE32(pAd, TX_SW_CFG2, 0x0); + } + } + + // update registers from EEPROM for RT3071 or later(3572/3562/3592). + if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) + { + UCHAR RegIdx, RegValue; + USHORT value; + + // after RT3071, write BBP from EEPROM 0xF0 to 0x102 + for (i = 0xF0; i <= 0x102; i = i+2) + { + value = 0xFFFF; + RT28xx_EEPROM_READ16(pAd, i, value); + if ((value != 0xFFFF) && (value != 0)) + { + RegIdx = (UCHAR)(value >> 8); + RegValue = (UCHAR)(value & 0xff); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, RegIdx, RegValue); + DBGPRINT(RT_DEBUG_TRACE, ("Update BBP Registers from EEPROM(0x%0x), BBP(0x%x) = 0x%x\n", i, RegIdx, RegValue)); + } + } + + // after RT3071, write RF from EEPROM 0x104 to 0x116 + for (i = 0x104; i <= 0x116; i = i+2) + { + value = 0xFFFF; + RT28xx_EEPROM_READ16(pAd, i, value); + if ((value != 0xFFFF) && (value != 0)) + { + RegIdx = (UCHAR)(value >> 8); + RegValue = (UCHAR)(value & 0xff); + RT30xxWriteRFRegister(pAd, RegIdx, RegValue); + DBGPRINT(RT_DEBUG_TRACE, ("Update RF Registers from EEPROM0x%x), BBP(0x%x) = 0x%x\n", i, RegIdx, RegValue)); + } + } + } +#endif // RT30xx // + + DBGPRINT(RT_DEBUG_TRACE, ("TxPath = %d, RxPath = %d, RFIC=%d, Polar+LED mode=%x\n", + pAd->Antenna.field.TxPath, pAd->Antenna.field.RxPath, + pAd->RfIcType, pAd->LedCntl.word)); + DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitAsicFromEEPROM\n")); +} + +/* + ======================================================================== + + Routine Description: + Initialize NIC hardware + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +NDIS_STATUS NICInitializeAdapter( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bHardReset) +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + WPDMA_GLO_CFG_STRUC GloCfg; +#ifdef RTMP_MAC_PCI + UINT32 Value; + DELAY_INT_CFG_STRUC IntCfg; +#endif // RTMP_MAC_PCI // +// INT_MASK_CSR_STRUC IntMask; + ULONG i =0, j=0; + //AC_TXOP_CSR0_STRUC csr0; + + DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAdapter\n")); + + // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits: +retry: + i = 0; + do + { + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); + if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0)) + break; + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return NDIS_STATUS_FAILURE; + + RTMPusecDelay(1000); + i++; + }while ( i<100); + DBGPRINT(RT_DEBUG_TRACE, ("<== DMA offset 0x208 = 0x%x\n", GloCfg.word)); + GloCfg.word &= 0xff0; + GloCfg.field.EnTXWriteBackDDONE =1; + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); + + // Record HW Beacon offset + pAd->BeaconOffset[0] = HW_BEACON_BASE0; + pAd->BeaconOffset[1] = HW_BEACON_BASE1; + pAd->BeaconOffset[2] = HW_BEACON_BASE2; + pAd->BeaconOffset[3] = HW_BEACON_BASE3; + pAd->BeaconOffset[4] = HW_BEACON_BASE4; + pAd->BeaconOffset[5] = HW_BEACON_BASE5; + pAd->BeaconOffset[6] = HW_BEACON_BASE6; + pAd->BeaconOffset[7] = HW_BEACON_BASE7; + + // + // write all shared Ring's base address into ASIC + // + + // asic simulation sequence put this ahead before loading firmware. + // pbf hardware reset +#ifdef RTMP_MAC_PCI + RTMP_IO_WRITE32(pAd, WPDMA_RST_IDX, 0x1003f); // 0x10000 for reset rx, 0x3f resets all 6 tx rings. + RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe1f); + RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0xe00); +#endif // RTMP_MAC_PCI // + + // Initialze ASIC for TX & Rx operation + if (NICInitializeAsic(pAd , bHardReset) != NDIS_STATUS_SUCCESS) + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return NDIS_STATUS_FAILURE; + + if (j++ == 0) + { + NICLoadFirmware(pAd); + goto retry; + } + return NDIS_STATUS_FAILURE; + } + + +#ifdef RTMP_MAC_PCI + // Write AC_BK base address register + Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BK].Cell[0].AllocPa); + RTMP_IO_WRITE32(pAd, TX_BASE_PTR1, Value); + DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR1 : 0x%x\n", Value)); + + // Write AC_BE base address register + Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_BE].Cell[0].AllocPa); + RTMP_IO_WRITE32(pAd, TX_BASE_PTR0, Value); + DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR0 : 0x%x\n", Value)); + + // Write AC_VI base address register + Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VI].Cell[0].AllocPa); + RTMP_IO_WRITE32(pAd, TX_BASE_PTR2, Value); + DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR2 : 0x%x\n", Value)); + + // Write AC_VO base address register + Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_AC_VO].Cell[0].AllocPa); + RTMP_IO_WRITE32(pAd, TX_BASE_PTR3, Value); + DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR3 : 0x%x\n", Value)); + + // Write HCCA base address register + Value = RTMP_GetPhysicalAddressLow(pAd->TxRing[QID_HCCA].Cell[0].AllocPa); + RTMP_IO_WRITE32(pAd, TX_BASE_PTR4, Value); + DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR4 : 0x%x\n", Value)); + + // Write MGMT_BASE_CSR register + Value = RTMP_GetPhysicalAddressLow(pAd->MgmtRing.Cell[0].AllocPa); + RTMP_IO_WRITE32(pAd, TX_BASE_PTR5, Value); + DBGPRINT(RT_DEBUG_TRACE, ("--> TX_BASE_PTR5 : 0x%x\n", Value)); + + // Write RX_BASE_CSR register + Value = RTMP_GetPhysicalAddressLow(pAd->RxRing.Cell[0].AllocPa); + RTMP_IO_WRITE32(pAd, RX_BASE_PTR, Value); + DBGPRINT(RT_DEBUG_TRACE, ("--> RX_BASE_PTR : 0x%x\n", Value)); + + // Init RX Ring index pointer + pAd->RxRing.RxSwReadIdx = 0; + pAd->RxRing.RxCpuIdx = RX_RING_SIZE-1; + RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx); + + // Init TX rings index pointer + { + for (i=0; i<NUM_OF_TX_RING; i++) + { + pAd->TxRing[i].TxSwFreeIdx = 0; + pAd->TxRing[i].TxCpuIdx = 0; + RTMP_IO_WRITE32(pAd, (TX_CTX_IDX0 + i * 0x10) , pAd->TxRing[i].TxCpuIdx); + } + } + + // init MGMT ring index pointer + pAd->MgmtRing.TxSwFreeIdx = 0; + pAd->MgmtRing.TxCpuIdx = 0; + RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx); + + // + // set each Ring's SIZE into ASIC. Descriptor Size is fixed by design. + // + + // Write TX_RING_CSR0 register + Value = TX_RING_SIZE; + RTMP_IO_WRITE32(pAd, TX_MAX_CNT0, Value); + RTMP_IO_WRITE32(pAd, TX_MAX_CNT1, Value); + RTMP_IO_WRITE32(pAd, TX_MAX_CNT2, Value); + RTMP_IO_WRITE32(pAd, TX_MAX_CNT3, Value); + RTMP_IO_WRITE32(pAd, TX_MAX_CNT4, Value); + Value = MGMT_RING_SIZE; + RTMP_IO_WRITE32(pAd, TX_MGMTMAX_CNT, Value); + + // Write RX_RING_CSR register + Value = RX_RING_SIZE; + RTMP_IO_WRITE32(pAd, RX_MAX_CNT, Value); +#endif // RTMP_MAC_PCI // + + + +#ifdef RTMP_MAC_PCI + // 3. Set DMA global configuration except TX_DMA_EN and RX_DMA_EN bits: + i = 0; + do + { + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); + if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0)) + break; + + RTMPusecDelay(1000); + i++; + }while ( i < 100); + + GloCfg.word &= 0xff0; + GloCfg.field.EnTXWriteBackDDONE =1; + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); + + IntCfg.word = 0; + RTMP_IO_WRITE32(pAd, DELAY_INT_CFG, IntCfg.word); +#endif // RTMP_MAC_PCI // + + + // reset action + // Load firmware + // Status = NICLoadFirmware(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAdapter\n")); + return Status; +} + +/* + ======================================================================== + + Routine Description: + Initialize ASIC + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +NDIS_STATUS NICInitializeAsic( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bHardReset) +{ + ULONG Index = 0; + UCHAR R0 = 0xff; + UINT32 MacCsr12 = 0, Counter = 0; + USHORT KeyIdx; + INT i,apidx; + + DBGPRINT(RT_DEBUG_TRACE, ("--> NICInitializeAsic\n")); + +#ifdef RTMP_MAC_PCI + RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x3); // To fix driver disable/enable hang issue when radio off + if (bHardReset == TRUE) + { + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x3); + } + else + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x1); + + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x0); + // Initialize MAC register to default value + for (Index = 0; Index < NUM_MAC_REG_PARMS; Index++) + { +#ifdef RT30xx + if ((MACRegTable[Index].Register == TX_SW_CFG0) && ( IS_RT3090(pAd) || IS_RT3390(pAd))) + { + MACRegTable[Index].Value = 0x00000400; + } +#endif // RT30xx // +#ifdef RT35xx + if ((MACRegTable[Index].Register == TX_SW_CFG0) && IS_RT3572(pAd)) + { + MACRegTable[Index].Value = 0x00000400; + } +#endif // RT35xx // + RTMP_IO_WRITE32(pAd, MACRegTable[Index].Register, MACRegTable[Index].Value); + } + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + for (Index = 0; Index < NUM_STA_MAC_REG_PARMS; Index++) + { + RTMP_IO_WRITE32(pAd, STAMACRegTable[Index].Register, STAMACRegTable[Index].Value); + } + } +#endif // CONFIG_STA_SUPPORT // +#endif // RTMP_MAC_PCI // + + + // + // Before program BBP, we need to wait BBP/RF get wake up. + // + Index = 0; + do + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return NDIS_STATUS_FAILURE; + + RTMP_IO_READ32(pAd, MAC_STATUS_CFG, &MacCsr12); + + if ((MacCsr12 & 0x03) == 0) // if BB.RF is stable + break; + + DBGPRINT(RT_DEBUG_TRACE, ("Check MAC_STATUS_CFG = Busy = %x\n", MacCsr12)); + RTMPusecDelay(1000); + } while (Index++ < 100); + + // The commands to firmware should be after these commands, these commands will init firmware + // PCI and USB are not the same because PCI driver needs to wait for PCI bus ready + RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); // initialize BBP R/W access agent + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0); + +#ifdef RTMP_MAC_PCI + AsicSendCommandToMcu(pAd, 0x72, 0, 0, 0); +#endif // RTMP_MAC_PCI // + + RTMPusecDelay(1000); + + // Read BBP register, make sure BBP is up and running before write new data + Index = 0; + do + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return NDIS_STATUS_FAILURE; + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R0, &R0); + DBGPRINT(RT_DEBUG_TRACE, ("BBP version = %x\n", R0)); + } while ((++Index < 20) && ((R0 == 0xff) || (R0 == 0x00))); + //ASSERT(Index < 20); //this will cause BSOD on Check-build driver + + if ((R0 == 0xff) || (R0 == 0x00)) + return NDIS_STATUS_FAILURE; + + // Initialize BBP register to default value + for (Index = 0; Index < NUM_BBP_REG_PARMS; Index++) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBPRegTable[Index].Register, BBPRegTable[Index].Value); + } + + if (pAd->chipOps.pBBPRegTable) + { + REG_PAIR *pbbpRegTb = pAd->chipOps.pBBPRegTable; + + for (Index = 0; Index < pAd->chipOps.bbpRegTbSize; Index++) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, pbbpRegTb[Index].Register, pbbpRegTb[Index].Value); + DBGPRINT(RT_DEBUG_TRACE, ("BBP_R%d=%d\n", pbbpRegTb[Index].Register, pbbpRegTb[Index].Value)); + } + } + +#ifdef RTMP_MAC_PCI + // TODO: shiang, check MACVersion, currently, rbus-based chip use this. + if (pAd->MACVersion == 0x28720200) + { + //UCHAR value; + ULONG value2; + + //disable MLD by Bruce 20080704 + //BBP_IO_READ8_BY_REG_ID(pAd, BBP_R105, &value); + //BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R105, value | 4); + + //Maximum PSDU length from 16K to 32K bytes + RTMP_IO_READ32(pAd, MAX_LEN_CFG, &value2); + value2 &= ~(0x3<<12); + value2 |= (0x2<<12); + RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, value2); + } +#endif // RTMP_MAC_PCI // + + // for rt2860E and after, init BBP_R84 with 0x19. This is for extension channel overlapping IOT. + // RT3090 should not program BBP R84 to 0x19, otherwise TX will block. + //3070/71/72,3090,3090A( are included in RT30xx),3572,3390 + if (((pAd->MACVersion & 0xffff) != 0x0101) && !(IS_RT30xx(pAd)|| IS_RT3572(pAd) || IS_RT3390(pAd))) + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R84, 0x19); + +#ifdef RT30xx + // RF power sequence setup + if (IS_RT30xx(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) + { //update for RT3070/71/72/90/91/92,3572,3390. + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R79, 0x13); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R80, 0x05); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R81, 0x33); + } +#endif // RT30xx // + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x12); + } + + if (pAd->MACVersion >= RALINK_2880E_VERSION && pAd->MACVersion < RALINK_3070_VERSION) // 3*3 + { + // enlarge MAX_LEN_CFG + UINT32 csr; + RTMP_IO_READ32(pAd, MAX_LEN_CFG, &csr); + { + csr &= 0xFFF; + csr |= 0x2000; + } + RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, csr); + } + + +#ifdef CONFIG_STA_SUPPORT + // Add radio off control + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (pAd->StaCfg.bRadio == FALSE) + { +// RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x00001818); + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); + DBGPRINT(RT_DEBUG_TRACE, ("Set Radio Off\n")); + } + } +#endif // CONFIG_STA_SUPPORT // + + // Clear raw counters + RTMP_IO_READ32(pAd, RX_STA_CNT0, &Counter); + RTMP_IO_READ32(pAd, RX_STA_CNT1, &Counter); + RTMP_IO_READ32(pAd, RX_STA_CNT2, &Counter); + RTMP_IO_READ32(pAd, TX_STA_CNT0, &Counter); + RTMP_IO_READ32(pAd, TX_STA_CNT1, &Counter); + RTMP_IO_READ32(pAd, TX_STA_CNT2, &Counter); + + // ASIC will keep garbage value after boot + // Clear all shared key table when initial + // This routine can be ignored in radio-ON/OFF operation. + if (bHardReset) + { + for (KeyIdx = 0; KeyIdx < 4; KeyIdx++) + { + RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE + 4*KeyIdx, 0); + } + + // Clear all pairwise key table when initial + for (KeyIdx = 0; KeyIdx < 256; KeyIdx++) + { + RTMP_IO_WRITE32(pAd, MAC_WCID_ATTRIBUTE_BASE + (KeyIdx * HW_WCID_ATTRI_SIZE), 1); + } + } + + // assert HOST ready bit +// RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x0); // 2004-09-14 asked by Mark +// RTMP_IO_WRITE32(pAd, MAC_CSR1, 0x4); + + // It isn't necessary to clear this space when not hard reset. + if (bHardReset == TRUE) + { + // clear all on-chip BEACON frame space + for (apidx = 0; apidx < HW_BEACON_MAX_COUNT; apidx++) + { + for (i = 0; i < HW_BEACON_OFFSET>>2; i+=4) + RTMP_IO_WRITE32(pAd, pAd->BeaconOffset[apidx] + i, 0x00); + } + } + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // for rt2860E and after, init TXOP_CTRL_CFG with 0x583f. This is for extension channel overlapping IOT. + if ((pAd->MACVersion&0xffff) != 0x0101) + RTMP_IO_WRITE32(pAd, TXOP_CTRL_CFG, 0x583f); + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef RT30xx +#ifdef NEW_FW + if (IS_RT3070(pAd) || IS_RT3572(pAd)||IS_RT3390(pAd)||IS_RT3090(pAd)) + { + // send 0x36 mcu command after 0x72 for RT3xxx to fix Radio-Off current leakage issue + RTMPusecDelay(200); + if (pAd->buseEfuse) + AsicSendCommandToMcu(pAd, 0x36, 0xff, 0xff, 0); + else + AsicSendCommandToMcu(pAd, 0x36, 0xff, 0xff, 0x04); + RTMPusecDelay(10); + } +#endif // NEW_FW // +#endif // RT30xx // + + DBGPRINT(RT_DEBUG_TRACE, ("<-- NICInitializeAsic\n")); + return NDIS_STATUS_SUCCESS; +} + +/* + ======================================================================== + + Routine Description: + Reset NIC Asics + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + Reset NIC to initial state AS IS system boot up time. + + ======================================================================== +*/ +VOID NICIssueReset( + IN PRTMP_ADAPTER pAd) +{ + UINT32 Value = 0; + DBGPRINT(RT_DEBUG_TRACE, ("--> NICIssueReset\n")); + + // Abort Tx, prevent ASIC from writing to Host memory + //RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x001f0000); + + // Disable Rx, register value supposed will remain after reset + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); + Value &= (0xfffffff3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); + + // Issue reset and clear from reset state + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x03); // 2004-09-17 change from 0x01 + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0x00); + + DBGPRINT(RT_DEBUG_TRACE, ("<-- NICIssueReset\n")); +} + + + +VOID NICUpdateFifoStaCounters( + IN PRTMP_ADAPTER pAd) +{ + TX_STA_FIFO_STRUC StaFifo; + MAC_TABLE_ENTRY *pEntry; + UINT32 i = 0; + UCHAR pid = 0, wcid = 0; + INT32 reTry; + UCHAR succMCS; + +#ifdef RALINK_ATE + /* Nothing to do in ATE mode */ + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + + do + { + RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word); + + if (StaFifo.field.bValid == 0) + break; + + wcid = (UCHAR)StaFifo.field.wcid; + + + /* ignore NoACK and MGMT frame use 0xFF as WCID */ + if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE)) + { + i++; + continue; + } + + /* PID store Tx MCS Rate */ + pid = (UCHAR)StaFifo.field.PidType; + + pEntry = &pAd->MacTab.Content[wcid]; + + pEntry->DebugFIFOCount++; + +#ifdef DOT11_N_SUPPORT + if (StaFifo.field.TxBF) // 3*3 + pEntry->TxBFCount++; +#endif // DOT11_N_SUPPORT // + +#ifdef UAPSD_AP_SUPPORT + UAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess); +#endif // UAPSD_AP_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + continue; +#endif // CONFIG_STA_SUPPORT // + + if (!StaFifo.field.TxSuccess) + { + pEntry->FIFOCount++; + pEntry->OneSecTxFailCount++; + + if (pEntry->FIFOCount >= 1) + { + DBGPRINT(RT_DEBUG_TRACE, ("#")); +#ifdef DOT11_N_SUPPORT + pEntry->NoBADataCountDown = 64; +#endif // DOT11_N_SUPPORT // + +//#ifdef CONFIG_STA_SUPPORT +//#ifdef DOT11Z_TDLS_SUPPORT +// IF_DEV_CONFIG_OPMODE_ON_STA(pAd) +// { +// if(IS_ENTRY_TDLS(pEntry)) +// TDLS_LinkTearDown(pAd); +// } +//#endif // DOT11Z_TDLS_SUPPORT // +//#endif // CONFIG_STA_SUPPORT // + + // Update the continuous transmission counter. + pEntry->ContinueTxFailCnt++; + + if(pEntry->PsMode == PWR_ACTIVE) + { +#ifdef DOT11_N_SUPPORT + int tid; + for (tid=0; tid<NUM_OF_TID; tid++) + { + BAOriSessionTearDown(pAd, pEntry->Aid, tid, FALSE, FALSE); + } +#endif // DOT11_N_SUPPORT // + + +#ifdef WDS_SUPPORT + // fix WDS Jam issue + if(IS_ENTRY_WDS(pEntry) + && (pEntry->LockEntryTx == FALSE) + && (pEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck)) + { + DBGPRINT(RT_DEBUG_TRACE, ("Entry %02x:%02x:%02x:%02x:%02x:%02x Blocked!! (Fail Cnt = %d)\n", + pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2],pEntry->Addr[3], + pEntry->Addr[4],pEntry->Addr[5],pEntry->ContinueTxFailCnt )); + + pEntry->LockEntryTx = TRUE; + } +#endif // WDS_SUPPORT // + } + + //pEntry->FIFOCount = 0; + } + //pEntry->bSendBAR = TRUE; + } + else + { +#ifdef DOT11_N_SUPPORT + if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0)) + { + pEntry->NoBADataCountDown--; + if (pEntry->NoBADataCountDown==0) + { + DBGPRINT(RT_DEBUG_TRACE, ("@\n")); + } + } +#endif // DOT11_N_SUPPORT // + pEntry->FIFOCount = 0; + pEntry->OneSecTxNoRetryOkCount++; + // update NoDataIdleCount when sucessful send packet to STA. + pEntry->NoDataIdleCount = 0; + pEntry->ContinueTxFailCnt = 0; +#ifdef WDS_SUPPORT + pEntry->LockEntryTx = FALSE; +#endif // WDS_SUPPORT // + } + + succMCS = StaFifo.field.SuccessRate & 0x7F; + + + reTry = pid - succMCS; + + if (StaFifo.field.TxSuccess) + { + pEntry->TXMCSExpected[pid]++; + if (pid == succMCS) + { + pEntry->TXMCSSuccessful[pid]++; + } + else + { + pEntry->TXMCSAutoFallBack[pid][succMCS]++; + } + } + else + { + pEntry->TXMCSFailed[pid]++; + } + + if (reTry > 0) + { + if ((pid >= 12) && succMCS <=7) + { + reTry -= 4; + } + pEntry->OneSecTxRetryOkCount += reTry; + } + + i++; + // ASIC store 16 stack + } while ( i < (TX_RING_SIZE<<1) ); + +} + +/* + ======================================================================== + + Routine Description: + Read statistical counters from hardware registers and record them + in software variables for later on query + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + ======================================================================== +*/ +VOID NICUpdateRawCounters( + IN PRTMP_ADAPTER pAd) +{ + UINT32 OldValue;//, Value2; + //ULONG PageSum, OneSecTransmitCount; + //ULONG TxErrorRatio, Retry, Fail; + RX_STA_CNT0_STRUC RxStaCnt0; + RX_STA_CNT1_STRUC RxStaCnt1; + RX_STA_CNT2_STRUC RxStaCnt2; + TX_STA_CNT0_STRUC TxStaCnt0; + TX_STA_CNT1_STRUC StaTx1; + TX_STA_CNT2_STRUC StaTx2; +#ifdef STATS_COUNT_SUPPORT + TX_AGG_CNT_STRUC TxAggCnt; + TX_AGG_CNT0_STRUC TxAggCnt0; + TX_AGG_CNT1_STRUC TxAggCnt1; + TX_AGG_CNT2_STRUC TxAggCnt2; + TX_AGG_CNT3_STRUC TxAggCnt3; + TX_AGG_CNT4_STRUC TxAggCnt4; + TX_AGG_CNT5_STRUC TxAggCnt5; + TX_AGG_CNT6_STRUC TxAggCnt6; + TX_AGG_CNT7_STRUC TxAggCnt7; +#endif // STATS_COUNT_SUPPORT // + COUNTER_RALINK *pRalinkCounters; + + + pRalinkCounters = &pAd->RalinkCounters; + + RTMP_IO_READ32(pAd, RX_STA_CNT0, &RxStaCnt0.word); + RTMP_IO_READ32(pAd, RX_STA_CNT2, &RxStaCnt2.word); + + { + RTMP_IO_READ32(pAd, RX_STA_CNT1, &RxStaCnt1.word); + // Update RX PLCP error counter + pAd->PrivateInfo.PhyRxErrCnt += RxStaCnt1.field.PlcpErr; + // Update False CCA counter + pAd->RalinkCounters.OneSecFalseCCACnt += RxStaCnt1.field.FalseCca; + } + +#ifdef STATS_COUNT_SUPPORT + // Update FCS counters + OldValue= pAd->WlanCounters.FCSErrorCount.u.LowPart; + pAd->WlanCounters.FCSErrorCount.u.LowPart += (RxStaCnt0.field.CrcErr); // >> 7); + if (pAd->WlanCounters.FCSErrorCount.u.LowPart < OldValue) + pAd->WlanCounters.FCSErrorCount.u.HighPart++; +#endif // STATS_COUNT_SUPPORT // + + // Add FCS error count to private counters + pRalinkCounters->OneSecRxFcsErrCnt += RxStaCnt0.field.CrcErr; + OldValue = pRalinkCounters->RealFcsErrCount.u.LowPart; + pRalinkCounters->RealFcsErrCount.u.LowPart += RxStaCnt0.field.CrcErr; + if (pRalinkCounters->RealFcsErrCount.u.LowPart < OldValue) + pRalinkCounters->RealFcsErrCount.u.HighPart++; + + // Update Duplicate Rcv check + pRalinkCounters->DuplicateRcv += RxStaCnt2.field.RxDupliCount; +#ifdef STATS_COUNT_SUPPORT + pAd->WlanCounters.FrameDuplicateCount.u.LowPart += RxStaCnt2.field.RxDupliCount; +#endif // STATS_COUNT_SUPPORT // + // Update RX Overflow counter + pAd->Counters8023.RxNoBuffer += (RxStaCnt2.field.RxFifoOverflowCount); + + //pAd->RalinkCounters.RxCount = 0; + + + //if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) || + // (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED) && (pAd->MacTab.Size != 1))) + if (!pAd->bUpdateBcnCntDone) + { + // Update BEACON sent count + RTMP_IO_READ32(pAd, TX_STA_CNT0, &TxStaCnt0.word); + RTMP_IO_READ32(pAd, TX_STA_CNT1, &StaTx1.word); + RTMP_IO_READ32(pAd, TX_STA_CNT2, &StaTx2.word); + pRalinkCounters->OneSecBeaconSentCnt += TxStaCnt0.field.TxBeaconCount; + pRalinkCounters->OneSecTxRetryOkCount += StaTx1.field.TxRetransmit; + pRalinkCounters->OneSecTxNoRetryOkCount += StaTx1.field.TxSuccess; + pRalinkCounters->OneSecTxFailCount += TxStaCnt0.field.TxFailCount; + +#ifdef STATS_COUNT_SUPPORT + pAd->WlanCounters.TransmittedFragmentCount.u.LowPart += StaTx1.field.TxSuccess; + pAd->WlanCounters.RetryCount.u.LowPart += StaTx1.field.TxRetransmit; + pAd->WlanCounters.FailedCount.u.LowPart += TxStaCnt0.field.TxFailCount; +#endif // STATS_COUNT_SUPPORT // + } + + + //if (pAd->bStaFifoTest == TRUE) +#ifdef STATS_COUNT_SUPPORT + { + RTMP_IO_READ32(pAd, TX_AGG_CNT, &TxAggCnt.word); + RTMP_IO_READ32(pAd, TX_AGG_CNT0, &TxAggCnt0.word); + RTMP_IO_READ32(pAd, TX_AGG_CNT1, &TxAggCnt1.word); + RTMP_IO_READ32(pAd, TX_AGG_CNT2, &TxAggCnt2.word); + RTMP_IO_READ32(pAd, TX_AGG_CNT3, &TxAggCnt3.word); + RTMP_IO_READ32(pAd, TX_AGG_CNT4, &TxAggCnt4.word); + RTMP_IO_READ32(pAd, TX_AGG_CNT5, &TxAggCnt5.word); + RTMP_IO_READ32(pAd, TX_AGG_CNT6, &TxAggCnt6.word); + RTMP_IO_READ32(pAd, TX_AGG_CNT7, &TxAggCnt7.word); + pRalinkCounters->TxAggCount += TxAggCnt.field.AggTxCount; + pRalinkCounters->TxNonAggCount += TxAggCnt.field.NonAggTxCount; + pRalinkCounters->TxAgg1MPDUCount += TxAggCnt0.field.AggSize1Count; + pRalinkCounters->TxAgg2MPDUCount += TxAggCnt0.field.AggSize2Count; + + pRalinkCounters->TxAgg3MPDUCount += TxAggCnt1.field.AggSize3Count; + pRalinkCounters->TxAgg4MPDUCount += TxAggCnt1.field.AggSize4Count; + pRalinkCounters->TxAgg5MPDUCount += TxAggCnt2.field.AggSize5Count; + pRalinkCounters->TxAgg6MPDUCount += TxAggCnt2.field.AggSize6Count; + + pRalinkCounters->TxAgg7MPDUCount += TxAggCnt3.field.AggSize7Count; + pRalinkCounters->TxAgg8MPDUCount += TxAggCnt3.field.AggSize8Count; + pRalinkCounters->TxAgg9MPDUCount += TxAggCnt4.field.AggSize9Count; + pRalinkCounters->TxAgg10MPDUCount += TxAggCnt4.field.AggSize10Count; + + pRalinkCounters->TxAgg11MPDUCount += TxAggCnt5.field.AggSize11Count; + pRalinkCounters->TxAgg12MPDUCount += TxAggCnt5.field.AggSize12Count; + pRalinkCounters->TxAgg13MPDUCount += TxAggCnt6.field.AggSize13Count; + pRalinkCounters->TxAgg14MPDUCount += TxAggCnt6.field.AggSize14Count; + + pRalinkCounters->TxAgg15MPDUCount += TxAggCnt7.field.AggSize15Count; + pRalinkCounters->TxAgg16MPDUCount += TxAggCnt7.field.AggSize16Count; + + // Calculate the transmitted A-MPDU count + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += TxAggCnt0.field.AggSize1Count; + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt0.field.AggSize2Count >> 1); + + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize3Count / 3); + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt1.field.AggSize4Count >> 2); + + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize5Count / 5); + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt2.field.AggSize6Count / 6); + + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize7Count / 7); + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt3.field.AggSize8Count >> 3); + + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize9Count / 9); + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt4.field.AggSize10Count / 10); + + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize11Count / 11); + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt5.field.AggSize12Count / 12); + + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize13Count / 13); + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt6.field.AggSize14Count / 14); + + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize15Count / 15); + pRalinkCounters->TransmittedAMPDUCount.u.LowPart += (TxAggCnt7.field.AggSize16Count >> 4); + } +#endif // STATS_COUNT_SUPPORT // + +#ifdef DBG_DIAGNOSE + { + RtmpDiagStruct *pDiag; + UCHAR ArrayCurIdx, i; + + pDiag = &pAd->DiagStruct; + ArrayCurIdx = pDiag->ArrayCurIdx; + + if (pDiag->inited == 0) + { + NdisZeroMemory(pDiag, sizeof(struct _RtmpDiagStrcut_)); + pDiag->ArrayStartIdx = pDiag->ArrayCurIdx = 0; + pDiag->inited = 1; + } + else + { + // Tx + pDiag->TxFailCnt[ArrayCurIdx] = TxStaCnt0.field.TxFailCount; + pDiag->TxAggCnt[ArrayCurIdx] = TxAggCnt.field.AggTxCount; + pDiag->TxNonAggCnt[ArrayCurIdx] = TxAggCnt.field.NonAggTxCount; + + pDiag->TxAMPDUCnt[ArrayCurIdx][0] = TxAggCnt0.field.AggSize1Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][1] = TxAggCnt0.field.AggSize2Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][2] = TxAggCnt1.field.AggSize3Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][3] = TxAggCnt1.field.AggSize4Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][4] = TxAggCnt2.field.AggSize5Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][5] = TxAggCnt2.field.AggSize6Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][6] = TxAggCnt3.field.AggSize7Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][7] = TxAggCnt3.field.AggSize8Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][8] = TxAggCnt4.field.AggSize9Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][9] = TxAggCnt4.field.AggSize10Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][10] = TxAggCnt5.field.AggSize11Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][11] = TxAggCnt5.field.AggSize12Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][12] = TxAggCnt6.field.AggSize13Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][13] = TxAggCnt6.field.AggSize14Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][14] = TxAggCnt7.field.AggSize15Count; + pDiag->TxAMPDUCnt[ArrayCurIdx][15] = TxAggCnt7.field.AggSize16Count; + + pDiag->RxCrcErrCnt[ArrayCurIdx] = RxStaCnt0.field.CrcErr; + + INC_RING_INDEX(pDiag->ArrayCurIdx, DIAGNOSE_TIME); + ArrayCurIdx = pDiag->ArrayCurIdx; + for (i =0; i < 9; i++) + { + pDiag->TxDescCnt[ArrayCurIdx][i]= 0; + pDiag->TxSWQueCnt[ArrayCurIdx][i] =0; + pDiag->TxMcsCnt[ArrayCurIdx][i] = 0; + pDiag->RxMcsCnt[ArrayCurIdx][i] = 0; + } + pDiag->TxDataCnt[ArrayCurIdx] = 0; + pDiag->TxFailCnt[ArrayCurIdx] = 0; + pDiag->RxDataCnt[ArrayCurIdx] = 0; + pDiag->RxCrcErrCnt[ArrayCurIdx] = 0; +// for (i = 9; i < 16; i++) + for (i = 9; i < 24; i++) // 3*3 + { + pDiag->TxDescCnt[ArrayCurIdx][i] = 0; + pDiag->TxMcsCnt[ArrayCurIdx][i] = 0; + pDiag->RxMcsCnt[ArrayCurIdx][i] = 0; +} + + if (pDiag->ArrayCurIdx == pDiag->ArrayStartIdx) + INC_RING_INDEX(pDiag->ArrayStartIdx, DIAGNOSE_TIME); + } + + } +#endif // DBG_DIAGNOSE // + + +} + + + + +NDIS_STATUS NICLoadFirmware( + IN PRTMP_ADAPTER pAd) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; + if (pAd->chipOps.loadFirmware) + status = pAd->chipOps.loadFirmware(pAd); + + return status; +} + + +/* + ======================================================================== + + Routine Description: + erase 8051 firmware image in MAC ASIC + + Arguments: + Adapter Pointer to our adapter + + IRQL = PASSIVE_LEVEL + + ======================================================================== +*/ +VOID NICEraseFirmware( + IN PRTMP_ADAPTER pAd) +{ + if (pAd->chipOps.eraseFirmware) + pAd->chipOps.eraseFirmware(pAd); + +}/* End of NICEraseFirmware */ + + +/* + ======================================================================== + + Routine Description: + Load Tx rate switching parameters + + Arguments: + Adapter Pointer to our adapter + + Return Value: + NDIS_STATUS_SUCCESS firmware image load ok + NDIS_STATUS_FAILURE image not found + + IRQL = PASSIVE_LEVEL + + Rate Table Format: + 1. (B0: Valid Item number) (B1:Initial item from zero) + 2. Item Number(Dec) Mode(Hex) Current MCS(Dec) TrainUp(Dec) TrainDown(Dec) + + ======================================================================== +*/ +NDIS_STATUS NICLoadRateSwitchingParams( + IN PRTMP_ADAPTER pAd) +{ + return NDIS_STATUS_SUCCESS; +} + + +/* + ======================================================================== + + Routine Description: + Compare two memory block + + Arguments: + pSrc1 Pointer to first memory address + pSrc2 Pointer to second memory address + + Return Value: + 0: memory is equal + 1: pSrc1 memory is larger + 2: pSrc2 memory is larger + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +ULONG RTMPCompareMemory( + IN PVOID pSrc1, + IN PVOID pSrc2, + IN ULONG Length) +{ + PUCHAR pMem1; + PUCHAR pMem2; + ULONG Index = 0; + + pMem1 = (PUCHAR) pSrc1; + pMem2 = (PUCHAR) pSrc2; + + for (Index = 0; Index < Length; Index++) + { + if (pMem1[Index] > pMem2[Index]) + return (1); + else if (pMem1[Index] < pMem2[Index]) + return (2); + } + + // Equal + return (0); +} + + +/* + ======================================================================== + + Routine Description: + Zero out memory block + + Arguments: + pSrc1 Pointer to memory address + Length Size + + Return Value: + None + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPZeroMemory( + IN PVOID pSrc, + IN ULONG Length) +{ + PUCHAR pMem; + ULONG Index = 0; + + pMem = (PUCHAR) pSrc; + + for (Index = 0; Index < Length; Index++) + { + pMem[Index] = 0x00; + } +} + + +/* + ======================================================================== + + Routine Description: + Copy data from memory block 1 to memory block 2 + + Arguments: + pDest Pointer to destination memory address + pSrc Pointer to source memory address + Length Copy size + + Return Value: + None + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPMoveMemory( + OUT PVOID pDest, + IN PVOID pSrc, + IN ULONG Length) +{ + PUCHAR pMem1; + PUCHAR pMem2; + UINT Index; + + ASSERT((Length==0) || (pDest && pSrc)); + + pMem1 = (PUCHAR) pDest; + pMem2 = (PUCHAR) pSrc; + + for (Index = 0; Index < Length; Index++) + { + pMem1[Index] = pMem2[Index]; + } +} + +VOID UserCfgExit( + IN RTMP_ADAPTER *pAd) +{ +#ifdef DOT11_N_SUPPORT + BATableExit(pAd); +#endif // DOT11_N_SUPPORT // + NdisFreeSpinLock(&pAd->MacTabLock); +} + +/* + ======================================================================== + + Routine Description: + Initialize port configuration structure + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + + ======================================================================== +*/ +VOID UserCfgInit( + IN PRTMP_ADAPTER pAd) +{ + UINT i; +// EDCA_PARM DefaultEdcaParm; + UINT key_index, bss_index; + + DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit\n")); + + + + // + // part I. intialize common configuration + // + + for(key_index=0; key_index<SHARE_KEY_NUM; key_index++) + { + for(bss_index = 0; bss_index < MAX_MBSSID_NUM; bss_index++) + { + pAd->SharedKey[bss_index][key_index].KeyLen = 0; + pAd->SharedKey[bss_index][key_index].CipherAlg = CIPHER_NONE; + } + } + + pAd->bLocalAdminMAC = FALSE; + pAd->EepromAccess = FALSE; + + pAd->Antenna.word = 0; + pAd->CommonCfg.BBPCurrentBW = BW_20; + + pAd->LedCntl.word = 0; +#ifdef RTMP_MAC_PCI + pAd->LedIndicatorStrength = 0; +#ifdef CONFIG_STA_SUPPORT + pAd->RLnkCtrlOffset = 0; + pAd->HostLnkCtrlOffset = 0; +#endif // CONFIG_STA_SUPPORT // +#endif // RTMP_MAC_PCI // + + pAd->bAutoTxAgcA = FALSE; // Default is OFF + pAd->bAutoTxAgcG = FALSE; // Default is OFF + pAd->RfIcType = RFIC_2820; + + // Init timer for reset complete event + pAd->CommonCfg.CentralChannel = 1; + pAd->bForcePrintTX = FALSE; + pAd->bForcePrintRX = FALSE; + pAd->bStaFifoTest = FALSE; + pAd->bProtectionTest = FALSE; + pAd->bHCCATest = FALSE; + pAd->bGenOneHCCA = FALSE; + pAd->CommonCfg.Dsifs = 10; // in units of usec + pAd->CommonCfg.TxPower = 100; //mW + pAd->CommonCfg.TxPowerPercentage = 0xffffffff; // AUTO + pAd->CommonCfg.TxPowerDefault = 0xffffffff; // AUTO + pAd->CommonCfg.TxPreamble = Rt802_11PreambleAuto; // use Long preamble on TX by defaut + pAd->CommonCfg.bUseZeroToDisableFragment = FALSE; + pAd->CommonCfg.RtsThreshold = 2347; + pAd->CommonCfg.FragmentThreshold = 2346; + pAd->CommonCfg.UseBGProtection = 0; // 0: AUTO + pAd->CommonCfg.bEnableTxBurst = TRUE; //0; + pAd->CommonCfg.PhyMode = 0xff; // unknown + pAd->CommonCfg.BandState = UNKNOWN_BAND; + pAd->CommonCfg.RadarDetect.CSPeriod = 10; + pAd->CommonCfg.RadarDetect.CSCount = 0; + pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE; + + + +#ifdef TONE_RADAR_DETECT_SUPPORT +#ifdef CARRIER_DETECTION_SUPPORT + pAd->CommonCfg.CarrierDetect.delta = CARRIER_DETECT_DELTA; + pAd->CommonCfg.CarrierDetect.div_flag = CARRIER_DETECT_DIV_FLAG; + pAd->CommonCfg.CarrierDetect.criteria = CARRIER_DETECT_CRITIRIA; + pAd->CommonCfg.CarrierDetect.threshold = CARRIER_DETECT_THRESHOLD; +#endif // CARRIER_DETECTION_SUPPORT // +#endif // TONE_RADAR_DETECT_SUPPORT // + + pAd->CommonCfg.RadarDetect.ChMovingTime = 65; +#ifdef MERGE_ARCH_TEAM + pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 2; + pAd->CommonCfg.RadarDetect.AvgRssiReq = -75; +#else // original rt28xx source code + pAd->CommonCfg.RadarDetect.LongPulseRadarTh = 3; +#endif // MERGE_ARCH_TEAM // + pAd->CommonCfg.bAPSDCapable = FALSE; + pAd->CommonCfg.bNeedSendTriggerFrame = FALSE; + pAd->CommonCfg.TriggerTimerCount = 0; + pAd->CommonCfg.bAPSDForcePowerSave = FALSE; + pAd->CommonCfg.bCountryFlag = FALSE; + pAd->CommonCfg.TxStream = 0; + pAd->CommonCfg.RxStream = 0; + + NdisZeroMemory(&pAd->BeaconTxWI, sizeof(pAd->BeaconTxWI)); + +#ifdef DOT11_N_SUPPORT + NdisZeroMemory(&pAd->CommonCfg.HtCapability, sizeof(pAd->CommonCfg.HtCapability)); + pAd->HTCEnable = FALSE; + pAd->bBroadComHT = FALSE; + pAd->CommonCfg.bRdg = FALSE; + +#ifdef DOT11N_DRAFT3 + pAd->CommonCfg.Dot11OBssScanPassiveDwell = dot11OBSSScanPassiveDwell; // Unit : TU. 5~1000 + pAd->CommonCfg.Dot11OBssScanActiveDwell = dot11OBSSScanActiveDwell; // Unit : TU. 10~1000 + pAd->CommonCfg.Dot11BssWidthTriggerScanInt = dot11BSSWidthTriggerScanInterval; // Unit : Second + pAd->CommonCfg.Dot11OBssScanPassiveTotalPerChannel = dot11OBSSScanPassiveTotalPerChannel; // Unit : TU. 200~10000 + pAd->CommonCfg.Dot11OBssScanActiveTotalPerChannel = dot11OBSSScanActiveTotalPerChannel; // Unit : TU. 20~10000 + pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor = dot11BSSWidthChannelTransactionDelayFactor; + pAd->CommonCfg.Dot11OBssScanActivityThre = dot11BSSScanActivityThreshold; // Unit : percentage + pAd->CommonCfg.Dot11BssWidthChanTranDelay = (pAd->CommonCfg.Dot11BssWidthTriggerScanInt * pAd->CommonCfg.Dot11BssWidthChanTranDelayFactor); + + pAd->CommonCfg.bBssCoexEnable = TRUE; // by default, we enable this feature, you can disable it via the profile or ioctl command +#endif // DOT11N_DRAFT3 // + + NdisZeroMemory(&pAd->CommonCfg.AddHTInfo, sizeof(pAd->CommonCfg.AddHTInfo)); + pAd->CommonCfg.BACapability.field.MMPSmode = MMPS_ENABLE; + pAd->CommonCfg.BACapability.field.MpduDensity = 0; + pAd->CommonCfg.BACapability.field.Policy = IMMED_BA; + pAd->CommonCfg.BACapability.field.RxBAWinLimit = 64; //32; + pAd->CommonCfg.BACapability.field.TxBAWinLimit = 64; //32; + DBGPRINT(RT_DEBUG_TRACE, ("--> UserCfgInit. BACapability = 0x%x\n", pAd->CommonCfg.BACapability.word)); + + pAd->CommonCfg.BACapability.field.AutoBA = FALSE; + BATableInit(pAd, &pAd->BATable); + + pAd->CommonCfg.bExtChannelSwitchAnnouncement = 1; + pAd->CommonCfg.bHTProtect = 1; + pAd->CommonCfg.bMIMOPSEnable = TRUE; +#ifdef GREENAP_SUPPORT + pAd->ApCfg.bGreenAPEnable=FALSE; + pAd->ApCfg.bBlockAntDivforGreenAP = FALSE; + pAd->ApCfg.bGreenAPIsOn= FALSE; +#endif // GREENAP_SUPPORT // + pAd->CommonCfg.bBADecline = FALSE; + pAd->CommonCfg.bDisableReordering = FALSE; + + if (pAd->MACVersion == 0x28720200) + { + pAd->CommonCfg.TxBASize = 13; //by Jerry recommend + }else{ + pAd->CommonCfg.TxBASize = 7; + } + + pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word; +#endif // DOT11_N_SUPPORT // + + //pAd->CommonCfg.HTPhyMode.field.BW = BW_20; + //pAd->CommonCfg.HTPhyMode.field.MCS = MCS_AUTO; + //pAd->CommonCfg.HTPhyMode.field.ShortGI = GI_800; + //pAd->CommonCfg.HTPhyMode.field.STBC = STBC_NONE; + pAd->CommonCfg.TxRate = RATE_6; + + pAd->CommonCfg.MlmeTransmit.field.MCS = MCS_RATE_6; + pAd->CommonCfg.MlmeTransmit.field.BW = BW_20; + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM; + + pAd->CommonCfg.BeaconPeriod = 100; // in mSec + + +#ifdef MCAST_RATE_SPECIFIC + pAd->CommonCfg.MCastPhyMode.word + = pAd->MacTab.Content[MCAST_WCID].HTPhyMode.word; +#endif // MCAST_RATE_SPECIFIC // + + // + // part II. intialize STA specific configuration + // +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_DIRECT); + RX_FILTER_CLEAR_FLAG(pAd, fRX_FILTER_ACCEPT_MULTICAST); + RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_BROADCAST); + RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_ALL_MULTICAST); + + pAd->StaCfg.Psm = PWR_ACTIVE; + + pAd->StaCfg.OrigWepStatus = Ndis802_11EncryptionDisabled; + pAd->StaCfg.PairCipher = Ndis802_11EncryptionDisabled; + pAd->StaCfg.GroupCipher = Ndis802_11EncryptionDisabled; + pAd->StaCfg.bMixCipher = FALSE; + pAd->StaCfg.DefaultKeyId = 0; + + // 802.1x port control + pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP; + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; + pAd->StaCfg.LastMicErrorTime = 0; + pAd->StaCfg.MicErrCnt = 0; + pAd->StaCfg.bBlockAssoc = FALSE; + pAd->StaCfg.WpaState = SS_NOTUSE; + + pAd->CommonCfg.NdisRadioStateOff = FALSE; // New to support microsoft disable radio with OID command + + pAd->StaCfg.RssiTrigger = 0; + NdisZeroMemory(&pAd->StaCfg.RssiSample, sizeof(RSSI_SAMPLE)); + pAd->StaCfg.RssiTriggerMode = RSSI_TRIGGERED_UPON_BELOW_THRESHOLD; + pAd->StaCfg.AtimWin = 0; + pAd->StaCfg.DefaultListenCount = 3;//default listen count; + pAd->StaCfg.BssType = BSS_INFRA; // BSS_INFRA or BSS_ADHOC or BSS_MONITOR + pAd->StaCfg.bScanReqIsFromWebUI = FALSE; + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_WAKEUP_NOW); + + pAd->StaCfg.bAutoTxRateSwitch = TRUE; + pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; + pAd->StaCfg.bAutoConnectIfNoSSID = FALSE; + } + +#ifdef EXT_BUILD_CHANNEL_LIST + pAd->StaCfg.IEEE80211dClientMode = Rt802_11_D_None; +#endif // EXT_BUILD_CHANNEL_LIST // + +#ifdef RTMP_MAC_PCI + +pAd->brt30xxBanMcuCmd = FALSE; +pAd->StaCfg.PSControl.field.EnableNewPS=FALSE; + +#ifdef PCIE_PS_SUPPORT +pAd->StaCfg.PSControl.field.EnableNewPS=TRUE; +pAd->b3090ESpecialChip = FALSE; +//The value of PowerMode could be 1 or 3. Level 3 could save more power than Level 1. +pAd->StaCfg.PSControl.field.rt30xxPowerMode=3; +pAd->StaCfg.PSControl.field.rt30xxForceASPMTest=0; +pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM=1; +#endif // PCIE_PS_SUPPORT // +#endif // RTMP_MAC_PCI // +#endif // CONFIG_STA_SUPPORT // + + // global variables mXXXX used in MAC protocol state machines + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON); + + // PHY specification + pAd->CommonCfg.PhyMode = PHY_11BG_MIXED; // default PHY mode + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); // CCK use LONG preamble + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // user desired power mode + pAd->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM; + pAd->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM; + pAd->StaCfg.bWindowsACCAMEnable = FALSE; + + RTMPInitTimer(pAd, &pAd->StaCfg.StaQuickResponeForRateUpTimer, GET_TIMER_FUNCTION(StaQuickResponeForRateUpExec), pAd, FALSE); + pAd->StaCfg.StaQuickResponeForRateUpTimerRunning = FALSE; + + // Patch for Ndtest + pAd->StaCfg.ScanCnt = 0; + + pAd->StaCfg.bHwRadio = TRUE; // Default Hardware Radio status is On + pAd->StaCfg.bSwRadio = TRUE; // Default Software Radio status is On + pAd->StaCfg.bRadio = TRUE; // bHwRadio && bSwRadio + pAd->StaCfg.bHardwareRadio = FALSE; // Default is OFF + pAd->StaCfg.bShowHiddenSSID = FALSE; // Default no show + + // Nitro mode control + pAd->StaCfg.bAutoReconnect = TRUE; + + // Save the init time as last scan time, the system should do scan after 2 seconds. + // This patch is for driver wake up from standby mode, system will do scan right away. + NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime); + if (pAd->StaCfg.LastScanTime > 10 * OS_HZ) + pAd->StaCfg.LastScanTime -= (10 * OS_HZ); + + NdisZeroMemory(pAd->nickname, IW_ESSID_MAX_SIZE+1); + RTMPInitTimer(pAd, &pAd->StaCfg.WpaDisassocAndBlockAssocTimer, GET_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc), pAd, FALSE); +#ifdef WPA_SUPPLICANT_SUPPORT + pAd->StaCfg.IEEE8021X = FALSE; + pAd->StaCfg.IEEE8021x_required_keys = FALSE; + pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE; + pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE; +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE; +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + pAd->StaCfg.bLostAp = FALSE; + pAd->StaCfg.pWpsProbeReqIe = NULL; + pAd->StaCfg.WpsProbeReqIeLen = 0; + pAd->StaCfg.pWpaAssocIe = NULL; + pAd->StaCfg.WpaAssocIeLen = 0; +#endif // WPA_SUPPLICANT_SUPPORT // + + NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8); + + + pAd->StaCfg.bAutoConnectByBssid = FALSE; + pAd->StaCfg.BeaconLostTime = BEACON_LOST_TIME; + NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64); + pAd->StaCfg.WpaPassPhraseLen = 0; + pAd->StaCfg.bAutoRoaming = FALSE; + pAd->StaCfg.bForceTxBurst = FALSE; + pAd->StaCfg.bNotFirstScan = FALSE; +#ifdef DOT11_N_SUPPORT + pAd->StaCfg.bAdhocN = TRUE; +#endif // DOT11_N_SUPPORT // + } +#endif // CONFIG_STA_SUPPORT // + + // Default for extra information is not valid + pAd->ExtraInfo = EXTRA_INFO_CLEAR; + + // Default Config change flag + pAd->bConfigChanged = FALSE; + + // + // part III. AP configurations + // + + + // + // part IV. others + // + // dynamic BBP R66:sensibity tuning to overcome background noise + pAd->BbpTuning.bEnable = TRUE; + pAd->BbpTuning.FalseCcaLowerThreshold = 100; + pAd->BbpTuning.FalseCcaUpperThreshold = 512; + pAd->BbpTuning.R66Delta = 4; + pAd->Mlme.bEnableAutoAntennaCheck = TRUE; + + // + // Also initial R66CurrentValue, RTUSBResumeMsduTransmission might use this value. + // if not initial this value, the default value will be 0. + // + pAd->BbpTuning.R66CurrentValue = 0x38; + + pAd->Bbp94 = BBPR94_DEFAULT; + pAd->BbpForCCK = FALSE; + + // Default is FALSE for test bit 1 + //pAd->bTest1 = FALSE; + + // initialize MAC table and allocate spin lock + NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE)); + InitializeQueueHeader(&pAd->MacTab.McastPsQueue); + NdisAllocateSpinLock(&pAd->MacTabLock); + + //RTMPInitTimer(pAd, &pAd->RECBATimer, RECBATimerTimeout, pAd, TRUE); + //RTMPSetTimer(&pAd->RECBATimer, REORDER_EXEC_INTV); + +#ifdef RALINK_ATE + NdisZeroMemory(&pAd->ate, sizeof(ATE_INFO)); + pAd->ate.Mode = ATE_STOP; + pAd->ate.TxCount = 200;/* to exceed TX_RING_SIZE ... */ + pAd->ate.TxDoneCount = 0; + pAd->ate.RFFreqOffset = 0; + pAd->ate.TxLength = 1024; + pAd->ate.TxWI.ShortGI = 0;// LONG GI : 800 ns + pAd->ate.TxWI.PHYMODE = MODE_CCK; + pAd->ate.TxWI.MCS = 3; + pAd->ate.TxWI.BW = BW_20; + /* please do not change this default channel value */ + pAd->ate.Channel = 1; + /* This is supposed just for rt3062 now. */ +#ifdef RTMP_MAC_PCI +#ifdef RT35xx + { + USHORT value = 0; + EEPROM_TX_PWR_STRUC Power; + EEPROM_TX_PWR_STRUC Power2; + + /* Read frequency offset setting from E2P for ATE */ + RT28xx_EEPROM_READ16(pAd, EEPROM_FREQ_OFFSET, value); + + if ((value & 0x00FF) != 0x00FF) + pAd->ate.RFFreqOffset = (UINT32) (value & 0x00FF); + else + pAd->ate.RFFreqOffset = 0; + + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET, Power.word); + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET, Power2.word); + + if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0)) + pAd->ate.TxPower0 = DEFAULT_RF_TX_POWER; + else + pAd->ate.TxPower0 = Power.field.Byte1; + + if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0)) + pAd->ate.TxPower1 = DEFAULT_RF_TX_POWER; + else + pAd->ate.TxPower1 = Power2.field.Byte1; + } +#endif // RT35xx // +#endif // RTMP_MAC_PCI // + pAd->ate.QID = QID_AC_BE; + +#if defined (RT2883) || defined (RT3883) + /* For stream mode in 3T/3R ++ */ + /* use broadcast address as default value */ + pAd->ate.Addr1[0] = 0xFF; + pAd->ate.Addr1[1] = 0xFF; + pAd->ate.Addr1[2] = 0xFF; + pAd->ate.Addr1[3] = 0xFF; + pAd->ate.Addr1[4] = 0xFF; + pAd->ate.Addr1[5] = 0xFF; + /* For stream mode in 3T/3R -- */ + + pAd->ate.Addr2[0] = 0x00; + pAd->ate.Addr2[1] = 0x11; + pAd->ate.Addr2[2] = 0x22; + pAd->ate.Addr2[3] = 0xAA; + pAd->ate.Addr2[4] = 0xBB; + pAd->ate.Addr2[5] = 0xCC; + + NdisMoveMemory(pAd->ate.Addr3, pAd->ate.Addr2, ETH_LENGTH_OF_ADDRESS); +#else + pAd->ate.Addr1[0] = 0x00; + pAd->ate.Addr1[1] = 0x11; + pAd->ate.Addr1[2] = 0x22; + pAd->ate.Addr1[3] = 0xAA; + pAd->ate.Addr1[4] = 0xBB; + pAd->ate.Addr1[5] = 0xCC; + + NdisMoveMemory(pAd->ate.Addr2, pAd->ate.Addr1, ETH_LENGTH_OF_ADDRESS); + NdisMoveMemory(pAd->ate.Addr3, pAd->ate.Addr1, ETH_LENGTH_OF_ADDRESS); +#endif // defined (RT2883) || defined (RT3883) // + + + pAd->ate.bRxFER = 0; + pAd->ate.bQATxStart = FALSE; + pAd->ate.bQARxStart = FALSE; + +#ifdef RTMP_MAC_PCI + pAd->ate.bFWLoading = FALSE; +#endif // RTMP_MAC_PCI // + + +#ifdef RALINK_28xx_QA + pAd->ate.TxStatus = 0; + pAd->ate.AtePid = THREAD_PID_INIT_VALUE; +#endif // RALINK_28xx_QA // +#endif // RALINK_ATE // + + + pAd->CommonCfg.bWiFiTest = FALSE; +#ifdef RTMP_MAC_PCI + pAd->bPCIclkOff = FALSE; +#endif // RTMP_MAC_PCI // + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + + RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); +#endif // CONFIG_STA_SUPPORT // + + for (i = 0; i < MAX_LEN_OF_BSS_TABLE; i++) + { + PBSS_ENTRY pBssEntry = &pAd->ScanTab.BssEntry[i]; + + if (pAd->ProbeRespIE[i].pIe) + pBssEntry->pVarIeFromProbRsp = pAd->ProbeRespIE[i].pIe; + else + pBssEntry->pVarIeFromProbRsp = NULL; + } + + DBGPRINT(RT_DEBUG_TRACE, ("<-- UserCfgInit\n")); +} + +// IRQL = PASSIVE_LEVEL +UCHAR BtoH(STRING ch) +{ + if (ch >= '0' && ch <= '9') return (ch - '0'); // Handle numerals + if (ch >= 'A' && ch <= 'F') return (ch - 'A' + 0xA); // Handle capitol hex digits + if (ch >= 'a' && ch <= 'f') return (ch - 'a' + 0xA); // Handle small hex digits + return(255); +} + +// +// FUNCTION: AtoH(char *, UCHAR *, int) +// +// PURPOSE: Converts ascii string to network order hex +// +// PARAMETERS: +// src - pointer to input ascii string +// dest - pointer to output hex +// destlen - size of dest +// +// COMMENTS: +// +// 2 ascii bytes make a hex byte so must put 1st ascii byte of pair +// into upper nibble and 2nd ascii byte of pair into lower nibble. +// +// IRQL = PASSIVE_LEVEL + +void AtoH(PSTRING src, PUCHAR dest, int destlen) +{ + PSTRING srcptr; + PUCHAR destTemp; + + srcptr = src; + destTemp = (PUCHAR) dest; + + while(destlen--) + { + *destTemp = BtoH(*srcptr++) << 4; // Put 1st ascii byte in upper nibble. + *destTemp += BtoH(*srcptr++); // Add 2nd ascii byte to above. + destTemp++; + } +} + + +//+++Mark by shiang, not use now, need to remove after confirm +//---Mark by shiang, not use now, need to remove after confirm + + +/* + ======================================================================== + + Routine Description: + Init timer objects + + Arguments: + pAd Pointer to our adapter + pTimer Timer structure + pTimerFunc Function to execute when timer expired + Repeat Ture for period timer + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID RTMPInitTimer( + IN PRTMP_ADAPTER pAd, + IN PRALINK_TIMER_STRUCT pTimer, + IN PVOID pTimerFunc, + IN PVOID pData, + IN BOOLEAN Repeat) +{ + // + // Set Valid to TRUE for later used. + // It will crash if we cancel a timer or set a timer + // that we haven't initialize before. + // + pTimer->Valid = TRUE; + + pTimer->PeriodicType = Repeat; + pTimer->State = FALSE; + pTimer->cookie = (ULONG) pData; + pTimer->pAd = pAd; + + RTMP_OS_Init_Timer(pAd, &pTimer->TimerObj, pTimerFunc, (PVOID) pTimer); +} + + +/* + ======================================================================== + + Routine Description: + Init timer objects + + Arguments: + pTimer Timer structure + Value Timer value in milliseconds + + Return Value: + None + + Note: + To use this routine, must call RTMPInitTimer before. + + ======================================================================== +*/ +VOID RTMPSetTimer( + IN PRALINK_TIMER_STRUCT pTimer, + IN ULONG Value) +{ + if (pTimer->Valid) + { + RTMP_ADAPTER *pAd; + + pAd = (RTMP_ADAPTER *)pTimer->pAd; + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + { + DBGPRINT_ERR(("RTMPSetTimer failed, Halt in Progress!\n")); + return; + } + + pTimer->TimerValue = Value; + pTimer->State = FALSE; + if (pTimer->PeriodicType == TRUE) + { + pTimer->Repeat = TRUE; + RTMP_SetPeriodicTimer(&pTimer->TimerObj, Value); + } + else + { + pTimer->Repeat = FALSE; + RTMP_OS_Add_Timer(&pTimer->TimerObj, Value); + } + } + else + { + DBGPRINT_ERR(("RTMPSetTimer failed, Timer hasn't been initialize!\n")); + } +} + + +/* + ======================================================================== + + Routine Description: + Init timer objects + + Arguments: + pTimer Timer structure + Value Timer value in milliseconds + + Return Value: + None + + Note: + To use this routine, must call RTMPInitTimer before. + + ======================================================================== +*/ +VOID RTMPModTimer( + IN PRALINK_TIMER_STRUCT pTimer, + IN ULONG Value) +{ + BOOLEAN Cancel; + + if (pTimer->Valid) + { + pTimer->TimerValue = Value; + pTimer->State = FALSE; + if (pTimer->PeriodicType == TRUE) + { + RTMPCancelTimer(pTimer, &Cancel); + RTMPSetTimer(pTimer, Value); + } + else + { + RTMP_OS_Mod_Timer(&pTimer->TimerObj, Value); + } + } + else + { + DBGPRINT_ERR(("RTMPModTimer failed, Timer hasn't been initialize!\n")); + } +} + + +/* + ======================================================================== + + Routine Description: + Cancel timer objects + + Arguments: + Adapter Pointer to our adapter + + Return Value: + None + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + 1.) To use this routine, must call RTMPInitTimer before. + 2.) Reset NIC to initial state AS IS system boot up time. + + ======================================================================== +*/ +VOID RTMPCancelTimer( + IN PRALINK_TIMER_STRUCT pTimer, + OUT BOOLEAN *pCancelled) +{ + if (pTimer->Valid) + { + if (pTimer->State == FALSE) + pTimer->Repeat = FALSE; + + RTMP_OS_Del_Timer(&pTimer->TimerObj, pCancelled); + + if (*pCancelled == TRUE) + pTimer->State = TRUE; + +#ifdef RTMP_TIMER_TASK_SUPPORT + // We need to go-through the TimerQ to findout this timer handler and remove it if + // it's still waiting for execution. + RtmpTimerQRemove(pTimer->pAd, pTimer); +#endif // RTMP_TIMER_TASK_SUPPORT // + } + else + { + DBGPRINT_ERR(("RTMPCancelTimer failed, Timer hasn't been initialize!\n")); + } +} + + +/* + ======================================================================== + + Routine Description: + Set LED Status + + Arguments: + pAd Pointer to our adapter + Status LED Status + + Return Value: + None + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPSetLED( + IN PRTMP_ADAPTER pAd, + IN UCHAR Status) +{ + //ULONG data; + UCHAR HighByte = 0; + UCHAR LowByte; + BOOLEAN bIgnored = FALSE; + BOOLEAN FlgCmdSend = FALSE; + +#ifdef RALINK_ATE + /* + In ATE mode of RT2860 AP/STA, we have erased 8051 firmware. + So LED mode is not supported when ATE is running. + */ + if (!IS_RT3572(pAd)) + { + if (ATE_ON(pAd)) + return; + } +#endif // RALINK_ATE // + + LowByte = pAd->LedCntl.field.LedMode&0x7f; + switch (Status) + { + case LED_LINK_DOWN: + HighByte = 0x20; + pAd->LedIndicatorStrength = 0; + FlgCmdSend = TRUE; + break; + case LED_LINK_UP: + if (pAd->CommonCfg.Channel > 14) + HighByte = 0xa0; + else + HighByte = 0x60; + FlgCmdSend = TRUE; + break; + case LED_RADIO_ON: + HighByte = 0x20; + FlgCmdSend = TRUE; + break; + case LED_HALT: + LowByte = 0; // Driver sets MAC register and MAC controls LED + case LED_RADIO_OFF: + HighByte = 0; + FlgCmdSend = TRUE; + break; + case LED_WPS: + HighByte = 0x10; + FlgCmdSend = TRUE; + break; + case LED_ON_SITE_SURVEY: + HighByte = 0x08; + FlgCmdSend = TRUE; + break; + case LED_POWER_UP: + HighByte = 0x04; + FlgCmdSend = TRUE; + break; +#ifdef RALINK_ATE +#ifdef RT35xx + case LED_HW_CONTROL: + LowByte = 0; + HighByte = 0; + FlgCmdSend = TRUE; + break; +#endif // RT35xx // +#endif // RALINK_ATE // + default: + DBGPRINT(RT_DEBUG_WARN, ("RTMPSetLED::Unknown Status %d\n", Status)); + break; + } + + if (FlgCmdSend == TRUE) + { + /* command here so we can reduce code size */ + AsicSendCommandToMcu(pAd, 0x50, 0xff, LowByte, HighByte); + } + + // + // Keep LED status for LED SiteSurvey mode. + // After SiteSurvey, we will set the LED mode to previous status. + // + if ((Status != LED_ON_SITE_SURVEY) && (Status != LED_POWER_UP) && (bIgnored == FALSE)) + pAd->LedStatus = Status; + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPSetLED::Mode=%d,HighByte=0x%02x,LowByte=0x%02x\n", pAd->LedCntl.field.LedMode, HighByte, LowByte)); +} + +/* + ======================================================================== + + Routine Description: + Set LED Signal Stregth + + Arguments: + pAd Pointer to our adapter + Dbm Signal Stregth + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + Can be run on any IRQL level. + + According to Microsoft Zero Config Wireless Signal Stregth definition as belows. + <= -90 No Signal + <= -81 Very Low + <= -71 Low + <= -67 Good + <= -57 Very Good + > -57 Excellent + ======================================================================== +*/ +VOID RTMPSetSignalLED( + IN PRTMP_ADAPTER pAd, + IN NDIS_802_11_RSSI Dbm) +{ + UCHAR nLed = 0; + + if (pAd->LedCntl.field.LedMode == LED_MODE_SIGNAL_STREGTH) + { + if (Dbm <= -90) + nLed = 0; + else if (Dbm <= -81) + nLed = 1; + else if (Dbm <= -71) + nLed = 3; + else if (Dbm <= -67) + nLed = 7; + else if (Dbm <= -57) + nLed = 15; + else + nLed = 31; + + // + // Update Signal Stregth to firmware if changed. + // + if (pAd->LedIndicatorStrength != nLed) + { + AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed, pAd->LedCntl.field.Polarity); + pAd->LedIndicatorStrength = nLed; + } +} +} + + + +/* + ======================================================================== + + Routine Description: + Enable RX + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL <= DISPATCH_LEVEL + + Note: + Before Enable RX, make sure you have enabled Interrupt. + ======================================================================== +*/ +VOID RTMPEnableRxTx( + IN PRTMP_ADAPTER pAd) +{ +// WPDMA_GLO_CFG_STRUC GloCfg; +// ULONG i = 0; + UINT32 rx_filter_flag; + + DBGPRINT(RT_DEBUG_TRACE, ("==> RTMPEnableRxTx\n")); + + // Enable Rx DMA. + RT28XXDMAEnable(pAd); + + // enable RX of MAC block + if (pAd->OpMode == OPMODE_AP) + { + rx_filter_flag = APNORMAL; + + + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); // enable RX of DMA block + } +#ifdef CONFIG_STA_SUPPORT + else + { +#ifdef XLINK_SUPPORT + if (pAd->StaCfg.PSPXlink) + rx_filter_flag = PSPXLINK; + else +#endif // XLINK_SUPPORT // + rx_filter_flag = STANORMAL; // Staion not drop control frame will fail WiFi Certification. + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, rx_filter_flag); + } +#endif // CONFIG_STA_SUPPORT // + + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, 0xc); + DBGPRINT(RT_DEBUG_TRACE, ("<== RTMPEnableRxTx\n")); +} + + +//+++Add by shiang, move from os/linux/rt_main_dev.c +void CfgInitHook(PRTMP_ADAPTER pAd) +{ + //pAd->bBroadComHT = TRUE; +} + +//---Add by shiang, move from os/linux/rt_main_dev.c + + +static INT RtmpChipOpsRegister( + IN RTMP_ADAPTER *pAd, + IN INT infType) +{ + RTMP_CHIP_OP *pChipOps = &pAd->chipOps; + int status; + + memset(pChipOps, 0, sizeof(RTMP_CHIP_OP)); + + /* set eeprom related hook functions */ + status = RtmpChipOpsEepromHook(pAd, infType); + + /* set mcu related hook functions */ + switch(infType) + { +#ifdef RTMP_PCI_SUPPORT + case RTMP_DEV_INF_PCI: + case RTMP_DEV_INF_PCIE: + pChipOps->loadFirmware = RtmpAsicLoadFirmware; + pChipOps->eraseFirmware = RtmpAsicEraseFirmware; + pChipOps->sendCommandToMcu = RtmpAsicSendCommandToMcu; + break; +#endif // RTMP_PCI_SUPPORT // + + + default: + break; + } + + return status; +} + + +INT RtmpRaDevCtrlInit( + IN RTMP_ADAPTER *pAd, + IN RTMP_INF_TYPE infType) +{ + //VOID *handle; + + // Assign the interface type. We need use it when do register/EEPROM access. + pAd->infType = infType; + + +#ifdef CONFIG_STA_SUPPORT + pAd->OpMode = OPMODE_STA; + DBGPRINT(RT_DEBUG_TRACE, ("STA Driver version-%s\n", STA_DRIVER_VERSION)); +#endif // CONFIG_STA_SUPPORT // + + + + RtmpChipOpsRegister(pAd, infType); + +#ifdef MULTIPLE_CARD_SUPPORT +{ + extern BOOLEAN RTMP_CardInfoRead(PRTMP_ADAPTER pAd); + + // find its profile path + pAd->MC_RowID = -1; // use default profile path + RTMP_CardInfoRead(pAd); + + if (pAd->MC_RowID == -1) +#ifdef CONFIG_STA_SUPPORT + strcpy(pAd->MC_FileName, STA_PROFILE_PATH); +#endif // CONFIG_STA_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("MC> ROW = %d, PATH = %s\n", pAd->MC_RowID, pAd->MC_FileName)); +} +#endif // MULTIPLE_CARD_SUPPORT // + + return 0; +} + + +BOOLEAN RtmpRaDevCtrlExit(IN RTMP_ADAPTER *pAd) +{ + INT index; + +#ifdef MULTIPLE_CARD_SUPPORT +extern UINT8 MC_CardUsed[MAX_NUM_OF_MULTIPLE_CARD]; + + if ((pAd->MC_RowID >= 0) && (pAd->MC_RowID <= MAX_NUM_OF_MULTIPLE_CARD)) + MC_CardUsed[pAd->MC_RowID] = 0; // not clear MAC address +#endif // MULTIPLE_CARD_SUPPORT // + + + /* + Free ProbeRespIE Table + */ + for (index = 0; index < MAX_LEN_OF_BSS_TABLE; index++) + { + if (pAd->ProbeRespIE[index].pIe) + os_free_mem(pAd, pAd->ProbeRespIE[index].pIe); + } + + RTMPFreeAdapter(pAd); + + return TRUE; +} + + + + + + +#ifdef VENDOR_FEATURE3_SUPPORT +VOID RTMP_IO_WRITE32( + PRTMP_ADAPTER pAd, + UINT32 Offset, + UINT32 Value) +{ + if (pAd->bPCIclkOff == FALSE) + { + UINT Val; + + Val = readl((void *)(pAd->CSRBaseAddress + MAC_CSR0)); +#if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(INF_AR9) || defined(IKANOS_VX_1X0) + Val = SWAP32(Value); +#else + Val = Value; +#endif + writel(Val, (void *)(pAd->CSRBaseAddress + Offset)); + } +} + +VOID RTMP_BBP_IO_READ8_BY_REG_ID( + PRTMP_ADAPTER pAd, + UINT32 Offset, + UINT8 *pValue) +{ + if (pAd->bPCIclkOff == FALSE) + { + if (pAd->infType == RTMP_DEV_INF_RBUS) + RTMP_BBP_IO_READ8(pAd, Offset, pValue, FALSE); + else + if (IS_SUPPORT_PCIE_PS_L3(pAd)) + RTMP_PCIE_PS_L3_BBP_IO_READ8(pAd, Offset, pValue, TRUE); + else + RTMP_BBP_IO_READ8(pAd, Offset, pValue, TRUE); + } +} + +VOID RTMP_BBP_IO_READ8( + PRTMP_ADAPTER pAd, + UCHAR Offset, + UINT8 *pValue, + BOOLEAN FlgValidMCR) +{ + BBP_CSR_CFG_STRUC BbpCsr; + int busyCnt, secCnt, regID; + + regID = ((FlgValidMCR) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG); + for (busyCnt=0; busyCnt<MAX_BUSY_COUNT; busyCnt++) + { + RTMP_IO_READ32(pAd, regID, &BbpCsr.word); + if (BbpCsr.field.Busy == BUSY) + continue; + BbpCsr.word = 0; + BbpCsr.field.fRead = 1; + BbpCsr.field.BBP_RW_MODE = 1; + BbpCsr.field.Busy = 1; + BbpCsr.field.RegNum = Offset; + RTMP_IO_WRITE32(pAd, regID, BbpCsr.word); + if ((FlgValidMCR) == TRUE) + { + AsicSendCommandToMcu(pAd, 0x80, 0xff, 0x0, 0x0); + RTMPusecDelay(1000); + } + for (secCnt=0; secCnt<MAX_BUSY_COUNT; secCnt++) + { + RTMP_IO_READ32(pAd, regID, &BbpCsr.word); + if (BbpCsr.field.Busy == IDLE) + break; + } + if ((BbpCsr.field.Busy == IDLE) && + (BbpCsr.field.RegNum == Offset)) + { + *(pValue) = (UCHAR)BbpCsr.field.Value; + break; + } + } + if (BbpCsr.field.Busy == BUSY) + { + DBGPRINT_ERR(("BBP(viaMCU=%d) read R%d fail\n", (FlgValidMCR), Offset)); + *(pValue) = (pAd)->BbpWriteLatch[Offset]; + if ((FlgValidMCR) == TRUE) + { + RTMP_IO_READ32(pAd, regID, &BbpCsr.word); + BbpCsr.field.Busy = 0; + RTMP_IO_WRITE32(pAd, regID, BbpCsr.word); + } + } +} + +VOID RTMP_BBP_IO_WRITE8_BY_REG_ID( + PRTMP_ADAPTER pAd, + UINT32 Offset, + UINT8 Value) +{ + if ((pAd)->bPCIclkOff == FALSE) + { + if ((pAd)->infType == RTMP_DEV_INF_RBUS) + RTMP_BBP_IO_WRITE8((pAd), Offset, Value, FALSE); + else + if (IS_SUPPORT_PCIE_PS_L3((pAd))) + RTMP_PCIE_PS_L3_BBP_IO_WRITE8((pAd), Offset, Value, TRUE); + else + RTMP_BBP_IO_WRITE8((pAd), Offset, Value, TRUE); + } +} + +VOID RTMP_BBP_IO_WRITE8( + PRTMP_ADAPTER pAd, + UCHAR Offset, + UINT8 Value, + BOOLEAN FlgValidMCR) +{ + BBP_CSR_CFG_STRUC BbpCsr; + int busyCnt=0, regID; + + regID = ((FlgValidMCR) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG); + for (busyCnt=0; busyCnt<MAX_BUSY_COUNT; busyCnt++) + { + RTMP_IO_READ32((pAd), regID, &BbpCsr.word); + if (BbpCsr.field.Busy == BUSY) + continue; + BbpCsr.word = 0; + BbpCsr.field.fRead = 0; + BbpCsr.field.BBP_RW_MODE = 1; + BbpCsr.field.Busy = 1; + BbpCsr.field.Value = Value; + BbpCsr.field.RegNum = Offset; + RTMP_IO_WRITE32((pAd), regID, BbpCsr.word); + if ((FlgValidMCR) == TRUE) + { + AsicSendCommandToMcu(pAd, 0x80, 0xff, 0x0, 0x0); + if ((pAd)->OpMode == OPMODE_AP) + RTMPusecDelay(1000); + } + (pAd)->BbpWriteLatch[Offset] = Value; + break; + } + if (busyCnt == MAX_BUSY_COUNT) + { + DBGPRINT_ERR(("BBP write R%d fail\n", Offset)); + if((FlgValidMCR) == TRUE) + { + RTMP_IO_READ32(pAd, H2M_BBP_AGENT, &BbpCsr.word); + BbpCsr.field.Busy = 0; + RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word); + } + } +} +#endif // VENDOR_FEATURE3_SUPPORT // + + +#ifdef RTMP_MAC_PCI +VOID CMDHandler( + IN PRTMP_ADAPTER pAd) +{ + PCmdQElmt cmdqelmt; + PUCHAR pData; + NDIS_STATUS NdisStatus = NDIS_STATUS_SUCCESS; +// ULONG Now = 0; +// NTSTATUS ntStatus; +// unsigned long IrqFlags; + + while (pAd && pAd->CmdQ.size > 0) + { + NdisStatus = NDIS_STATUS_SUCCESS; + + NdisAcquireSpinLock(&pAd->CmdQLock); + RTThreadDequeueCmd(&pAd->CmdQ, &cmdqelmt); + NdisReleaseSpinLock(&pAd->CmdQLock); + + if (cmdqelmt == NULL) + break; + + pData = cmdqelmt->buffer; + + if(!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))) + { + switch (cmdqelmt->command) + { + + case CMDTHREAD_REG_HINT: +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + RT_CFG80211_CRDA_REG_HINT(pAd, pData, cmdqelmt->bufferlength); +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + break; + + case CMDTHREAD_REG_HINT_11D: +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + RT_CFG80211_CRDA_REG_HINT11D(pAd, pData, cmdqelmt->bufferlength); +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + break; + + case CMDTHREAD_SCAN_END: +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + RT_CFG80211_SCAN_END(pAd, FALSE); +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + break; + + case CMDTHREAD_CONNECT_RESULT_INFORM: +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + RT_CFG80211_CONN_RESULT_INFORM(pAd, + pAd->MlmeAux.Bssid, + pData, cmdqelmt->bufferlength, + pData, cmdqelmt->bufferlength, + 1); +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + break; + + default: + DBGPRINT(RT_DEBUG_ERROR, ("--> Control Thread !! ERROR !! Unknown(cmdqelmt->command=0x%x) !! \n", cmdqelmt->command)); + break; + } + } + + if (cmdqelmt->CmdFromNdis == TRUE) + { + if (cmdqelmt->buffer != NULL) + os_free_mem(pAd, cmdqelmt->buffer); + os_free_mem(pAd, cmdqelmt); + } + else + { + if ((cmdqelmt->buffer != NULL) && (cmdqelmt->bufferlength != 0)) + os_free_mem(pAd, cmdqelmt->buffer); + os_free_mem(pAd, cmdqelmt); + } + } /* end of while */ +} +#endif // RTMP_MAC_PCI // + + +/* export wlan function symbol list */ +#ifdef OS_ABL_SUPPORT + + +EXPORT_SYMBOL(NICInitializeAdapter); +EXPORT_SYMBOL(NICInitAsicFromEEPROM); +EXPORT_SYMBOL(NICReadEEPROMParameters); +#ifdef RTMP_RF_RW_SUPPORT +EXPORT_SYMBOL(NICInitRFRegisters); +#endif // RTMP_RF_RW_SUPPORT // +EXPORT_SYMBOL(UserCfgExit); +EXPORT_SYMBOL(UserCfgInit); +EXPORT_SYMBOL(CfgInitHook); +EXPORT_SYMBOL(RTMPEnableRxTx); +EXPORT_SYMBOL(RTMPSetPhyMode); +EXPORT_SYMBOL(RTMPMaxRssi); +EXPORT_SYMBOL(RTMPAllocAdapterBlock); +EXPORT_SYMBOL(RTMPAllocTxRxRingMemory); +EXPORT_SYMBOL(RTMPFreeTxRxRingMemory); +EXPORT_SYMBOL(NICLoadRateSwitchingParams); +EXPORT_SYMBOL(RtmpRaDevCtrlInit); +EXPORT_SYMBOL(RtmpRaDevCtrlExit); +EXPORT_SYMBOL(NICLoadFirmware); +EXPORT_SYMBOL(RTMPSetProfileParameters); +EXPORT_SYMBOL(RT28XXDMADisable); + +#ifdef DOT11_N_SUPPORT +EXPORT_SYMBOL(SetCommonHT); +#endif // DOT11_N_SUPPORT // + +EXPORT_SYMBOL(AsicSwitchChannel); +EXPORT_SYMBOL(AsicLockChannel); +EXPORT_SYMBOL(N_ChannelCheck); + +EXPORT_SYMBOL(ba_reordering_resource_init); +EXPORT_SYMBOL(ba_reordering_resource_release); + +EXPORT_SYMBOL(RTMPDeQueuePacket); + +EXPORT_SYMBOL(CMDHandler); +EXPORT_SYMBOL(RTEnqueueInternalCmd); +EXPORT_SYMBOL(RTThreadDequeueCmd); + +EXPORT_SYMBOL(TpcReqTabInit); +EXPORT_SYMBOL(TpcReqTabExit); +EXPORT_SYMBOL(MeasureReqTabInit); +EXPORT_SYMBOL(MeasureReqTabExit); + +EXPORT_SYMBOL(MlmeInit); +EXPORT_SYMBOL(MlmeHandler); +EXPORT_SYMBOL(MlmeHalt); +EXPORT_SYMBOL(MlmeEnqueue); + +EXPORT_SYMBOL(RTMPCancelTimer); +EXPORT_SYMBOL(AsicSendCommandToMcu); +EXPORT_SYMBOL(MacTableLookup); +EXPORT_SYMBOL(RTMPZeroMemory); +EXPORT_SYMBOL(RTMPSoftEncryptWEP); +EXPORT_SYMBOL(getRate); + +/* command */ +EXPORT_SYMBOL(RTMPIoctlGetSiteSurvey); + + + + +#ifdef CONFIG_STA_SUPPORT +EXPORT_SYMBOL(STASendPackets); + +EXPORT_SYMBOL(LinkUp); +EXPORT_SYMBOL(LinkDown); +EXPORT_SYMBOL(MlmeRadioOn); +EXPORT_SYMBOL(MlmeRadioOff); + +EXPORT_SYMBOL(BAOriSessionSetUp); +EXPORT_SYMBOL(BAOriSessionTearDown); +EXPORT_SYMBOL(BARecSessionTearDown); +EXPORT_SYMBOL(MlmeDeauthReqAction); +EXPORT_SYMBOL(MlmeDisassocReqAction); + +EXPORT_SYMBOL(GetPhyMode); +EXPORT_SYMBOL(ChannelSanity); + +EXPORT_SYMBOL(rtstrchr); +EXPORT_SYMBOL(Set_SSID_Proc); +EXPORT_SYMBOL(Show_DescInfo_Proc); +EXPORT_SYMBOL(Show_Adhoc_MacTable_Proc); +EXPORT_SYMBOL(RTMPShowCfgValue); +EXPORT_SYMBOL(MlmeSetTxPreamble); +EXPORT_SYMBOL(RTMPSetDesiredRates); +EXPORT_SYMBOL(Set_PSMode_Proc); +EXPORT_SYMBOL(Set_NetworkType_Proc); +EXPORT_SYMBOL(rt_ioctl_setparam); +EXPORT_SYMBOL(Set_Channel_Proc); + +EXPORT_SYMBOL(AsicAddSharedKeyEntry); +EXPORT_SYMBOL(AsicRemoveSharedKeyEntry); +EXPORT_SYMBOL(RTMPAddKey); +EXPORT_SYMBOL(RTMPSetWcidSecurityInfo); +EXPORT_SYMBOL(AsicRemovePairwiseKeyEntry); +EXPORT_SYMBOL(RTMPWPARemoveKeyProc); + +EXPORT_SYMBOL(MlmeUpdateTxRates); +EXPORT_SYMBOL(MlmeSetPsmBit); + +EXPORT_SYMBOL(MakeIbssBeacon); +EXPORT_SYMBOL(AsicEnableIbssSync); +EXPORT_SYMBOL(AsicEnableBssSync); +EXPORT_SYMBOL(AsicDisableSync); + +EXPORT_SYMBOL(RTMP_MapChannelID2KHZ); +EXPORT_SYMBOL(RTMP_MapKHZ2ChannelID); + +EXPORT_SYMBOL(AtoH); +EXPORT_SYMBOL(NetworkTypeInUseSanity); +EXPORT_SYMBOL(NICUpdateRawCounters); +EXPORT_SYMBOL(RTMPSetHT); +EXPORT_SYMBOL(RTMPSendNullFrame); +EXPORT_SYMBOL(AsicForceWakeup); +EXPORT_SYMBOL(RateIdTo500Kbps); + +EXPORT_SYMBOL(MacTableReset); +EXPORT_SYMBOL(RTMPCheckStrPrintAble); +EXPORT_SYMBOL(BssTableDeleteEntry); +EXPORT_SYMBOL(DisassocParmFill); +EXPORT_SYMBOL(RTMPConstructWEPIVHdr); +EXPORT_SYMBOL(RTMPMoveMemory); + +EXPORT_SYMBOL(Set_Key1_Proc); +EXPORT_SYMBOL(Set_Key2_Proc); +EXPORT_SYMBOL(Set_Key3_Proc); +EXPORT_SYMBOL(Set_Key4_Proc); +EXPORT_SYMBOL(Set_EncrypType_Proc); +EXPORT_SYMBOL(Set_WPAPSK_Proc); +EXPORT_SYMBOL(Set_AuthMode_Proc); + +#ifdef RT30xx +EXPORT_SYMBOL(RT30xxReadRFRegister); +EXPORT_SYMBOL(RT30xxWriteRFRegister); +EXPORT_SYMBOL(RT3572WriteBBPR66); +#endif // RT30xx // + + +#ifdef RTMP_MAC_PCI +EXPORT_SYMBOL(STARxDoneInterruptHandle); +EXPORT_SYMBOL(MlmeRestartStateMachine); +EXPORT_SYMBOL(RTMPHandleTwakeupInterrupt); +EXPORT_SYMBOL(AsicResetBBPAgent); +#endif // RTMP_MAC_PCI // +#endif // CONFIG_STA_SUPPORT // + + +#ifdef RTMP_MAC_PCI +EXPORT_SYMBOL(RT28xxPciAsicRadioOff); +EXPORT_SYMBOL(RTMPHandleTxRingDmaDoneInterrupt); +EXPORT_SYMBOL(RTMPHandlePreTBTTInterrupt); +EXPORT_SYMBOL(RTMPHandleTBTTInterrupt); +EXPORT_SYMBOL(NICUpdateFifoStaCounters); +EXPORT_SYMBOL(RTMPHandleMgmtRingDmaDoneInterrupt); +EXPORT_SYMBOL(RTMPHandleRxCoherentInterrupt); +#endif // RTMP_MAC_PCI // + + + + + + +#ifdef APCLI_SUPPORT +EXPORT_SYMBOL(ApCliIfUp); +EXPORT_SYMBOL(RT28xx_ApCli_Remove); +EXPORT_SYMBOL(ApCliIfLookUp); +#endif // APCLI_SUPPORT // + +#ifdef WDS_SUPPORT +EXPORT_SYMBOL(WdsDown); +EXPORT_SYMBOL(RT28xx_WDS_Remove); +#endif // WDS_SUPPORT // + +EXPORT_SYMBOL(GenerateWpsPinCode); + + +#ifdef AUTO_CH_SELECT_ENHANCE +EXPORT_SYMBOL(AutoChBssTableDestroy); +EXPORT_SYMBOL(ChannelInfoDestroy); +EXPORT_SYMBOL(AutoChBssTableInit); +EXPORT_SYMBOL(ChannelInfoInit); +EXPORT_SYMBOL(New_APAutoSelectChannel); +#endif // AUTO_CH_SELECT_ENHANCE // + +#ifdef DOT11_N_SUPPORT + +#ifdef CONFIG_STA_SUPPORT +EXPORT_SYMBOL(N_SetCenCh); +#endif // CONFIG_STA_SUPPORT // +#endif // DOT11_N_SUPPORT // + +#ifdef BLOCK_NET_IF +EXPORT_SYMBOL(initblockQueueTab); +#endif // BLOCK_NET_IF // + + +#ifdef RALINK_ATE +EXPORT_SYMBOL(RtmpDoAte); + +#ifdef RT35xx +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + +#ifdef RTMP_MAC_PCI +EXPORT_SYMBOL(ATE_RT3562WriteBBPR66); +#endif // RTMP_MAC_PCI // +#endif // RALINK_ATE // +#endif // RT35xx // + + + +#ifdef QOS_DLS_SUPPORT +#ifdef CONFIG_STA_SUPPORT +EXPORT_SYMBOL(Set_DlsEntryInfo_Display_Proc); +EXPORT_SYMBOL(RTMPSendDLSTearDownFrame); +#endif // CONFIG_STA_SUPPORT // +#endif // QOS_DLS_SUPPORT // + +#ifdef DFS_SUPPORT +#endif // DFS_SUPPORT // + + + +#ifdef EXT_BUILD_CHANNEL_LIST +EXPORT_SYMBOL(ChRegion); +#endif // EXT_BUILD_CHANNEL_LIST // + +#endif // OS_ABL_SUPPORT // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_init_inf.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_init_inf.c new file mode 100644 index 000000000..667cc6b38 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_init_inf.c @@ -0,0 +1,374 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_init.c + + Abstract: + Miniport generic portion header file + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ +#include "rt_config.h" + +#ifdef OS_ABL_SUPPORT +UCHAR BIT8[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; +#endif // OS_ABL_SUPPORT // + + +int rt28xx_init( + IN PRTMP_ADAPTER pAd, + IN PSTRING pDefaultMac, + IN PSTRING pHostName) +{ + UINT index; + UCHAR TmpPhy; + NDIS_STATUS Status; + UINT32 MacCsr0 = 0; + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // If dirver doesn't wake up firmware here, + // NICLoadFirmware will hang forever when interface is up again. + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) && + OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + { + AUTO_WAKEUP_STRUC AutoWakeupCfg; + AsicForceWakeup(pAd, TRUE); + AutoWakeupCfg.word = 0; + RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); + } + } +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + + // reset Adapter flags + RTMP_CLEAR_FLAGS(pAd); + + // Init BssTab & ChannelInfo tabbles for auto channel select. + +#ifdef DOT11_N_SUPPORT + // Allocate BA Reordering memory + if (ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM) != TRUE) + goto err1; +#endif // DOT11_N_SUPPORT // + + // Make sure MAC gets ready. + index = 0; + do + { + RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); + pAd->MACVersion = MacCsr0; + + if ((pAd->MACVersion != 0x00) && (pAd->MACVersion != 0xFFFFFFFF)) + break; + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + goto err1; + + RTMPusecDelay(10); + } while (index++ < 100); + DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion)); + +#ifdef RTMP_MAC_PCI + + // To fix driver disable/enable hang issue when radio off + RTMP_IO_WRITE32(pAd, PWR_PIN_CFG, 0x2); +#endif // RTMP_MAC_PCI // + + // Disable DMA + RT28XXDMADisable(pAd); + + + // Load 8051 firmware + Status = NICLoadFirmware(pAd); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT_ERR(("NICLoadFirmware failed, Status[=0x%08x]\n", Status)); + goto err1; + } + + NICLoadRateSwitchingParams(pAd); + + // Disable interrupts here which is as soon as possible + // This statement should never be true. We might consider to remove it later +#ifdef RTMP_MAC_PCI + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) + { + RTMP_ASIC_INTERRUPT_DISABLE(pAd); + } +#endif // RTMP_MAC_PCI // + + Status = RTMPAllocTxRxRingMemory(pAd); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT_ERR(("RTMPAllocDMAMemory failed, Status[=0x%08x]\n", Status)); + goto err2; + } + + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); + + // initialize MLME + // + + Status = RtmpMgmtTaskInit(pAd); + if (Status != NDIS_STATUS_SUCCESS) + goto err3; + + Status = MlmeInit(pAd); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT_ERR(("MlmeInit failed, Status[=0x%08x]\n", Status)); + goto err4; + } + + // Initialize pAd->StaCfg, pAd->ApCfg, pAd->CommonCfg to manufacture default + // + UserCfgInit(pAd); + Status = RtmpNetTaskInit(pAd); + if (Status != NDIS_STATUS_SUCCESS) + goto err5; + +// COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].Bssid, netif->hwaddr); +// pAd->bForcePrintTX = TRUE; + + CfgInitHook(pAd); + + +#ifdef BLOCK_NET_IF + initblockQueueTab(pAd); +#endif // BLOCK_NET_IF // + + Status = MeasureReqTabInit(pAd); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT_ERR(("MeasureReqTabInit failed, Status[=0x%08x]\n",Status)); + goto err6; + } + + Status = TpcReqTabInit(pAd); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT_ERR(("TpcReqTabInit failed, Status[=0x%08x]\n",Status)); + goto err6; + } + + // + // Init the hardware, we need to init asic before read registry, otherwise mac register will be reset + // + Status = NICInitializeAdapter(pAd, TRUE); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT_ERR(("NICInitializeAdapter failed, Status[=0x%08x]\n", Status)); + if (Status != NDIS_STATUS_SUCCESS) + goto err6; + } + + // Read parameters from Config File + Status = RTMPReadParametersHook(pAd); + + DBGPRINT(RT_DEBUG_OFF, ("1. Phy Mode = %d\n", pAd->CommonCfg.PhyMode)); + if (Status != NDIS_STATUS_SUCCESS) + { + DBGPRINT_ERR(("RTMPReadParametersHook failed, Status[=0x%08x]\n",Status)); + goto err6; + } + + + +#ifdef DOT11_N_SUPPORT + //Init Ba Capability parameters. +// RT28XX_BA_INIT(pAd); + pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity; + pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable; + pAd->CommonCfg.DesiredHtPhy.AmsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize; + pAd->CommonCfg.DesiredHtPhy.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode; + // UPdata to HT IE + pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode; + pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize; + pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity; +#endif // DOT11_N_SUPPORT // + + // after reading Registry, we now know if in AP mode or STA mode + + // Load 8051 firmware; crash when FW image not existent + // Status = NICLoadFirmware(pAd); + // if (Status != NDIS_STATUS_SUCCESS) + // break; + + DBGPRINT(RT_DEBUG_OFF, ("2. Phy Mode = %d\n", pAd->CommonCfg.PhyMode)); + + // We should read EEPROM for all cases. rt2860b + NICReadEEPROMParameters(pAd, (PUCHAR)pDefaultMac); +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + DBGPRINT(RT_DEBUG_OFF, ("3. Phy Mode = %d\n", pAd->CommonCfg.PhyMode)); + + NICInitAsicFromEEPROM(pAd); //rt2860b + + // Set PHY to appropriate mode + TmpPhy = pAd->CommonCfg.PhyMode; + pAd->CommonCfg.PhyMode = 0xff; + RTMPSetPhyMode(pAd, TmpPhy); +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + + // No valid channels. + if (pAd->ChannelListNum == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n")); + goto err6; + } + +#ifdef DOT11_N_SUPPORT + DBGPRINT(RT_DEBUG_OFF, ("MCS Set = %02x %02x %02x %02x %02x\n", pAd->CommonCfg.HtCapability.MCSSet[0], + pAd->CommonCfg.HtCapability.MCSSet[1], pAd->CommonCfg.HtCapability.MCSSet[2], + pAd->CommonCfg.HtCapability.MCSSet[3], pAd->CommonCfg.HtCapability.MCSSet[4])); +#endif // DOT11_N_SUPPORT // + + + +// APInitialize(pAd); + +#ifdef IKANOS_VX_1X0 + VR_IKANOS_FP_Init(pAd->ApCfg.BssidNum, pAd->PermanentAddress); +#endif // IKANOS_VX_1X0 // + + // + // Initialize RF register to default value + // + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + + /* + Some modules init must be called before APStartUp(). + Or APStartUp() will make up beacon content and call + other modules API to get some information to fill. + */ + + // 8051 firmware require the signal during booting time. + //2008/11/28:KH marked the following codes to patch Frequency offset bug + //AsicSendCommandToMcu(pAd, 0x72, 0xFF, 0x00, 0x00); + + if (pAd && (Status != NDIS_STATUS_SUCCESS)) + { + // + // Undo everything if it failed + // + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { +// NdisMDeregisterInterrupt(&pAd->Interrupt); + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); + } +// RTMPFreeAdapter(pAd); // we will free it in disconnect() + } + else if (pAd) + { + // Microsoft HCT require driver send a disconnect event after driver initialization. + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); +// pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE); + + DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n")); + + + }// end of else + + + // Set up the Mac address + RtmpOSNetDevAddrSet(pAd->net_dev, &pAd->CurrentAddress[0]); + + // Various AP function init + + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + // send wireless event to wpa_supplicant for infroming interface up. + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_INTERFACE_UP, NULL, NULL, 0); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // + + } +#endif // CONFIG_STA_SUPPORT // + + + DBGPRINT_S(Status, ("<==== rt28xx_init, Status=%x\n", Status)); + + return TRUE; + + +err6: + MeasureReqTabExit(pAd); + TpcReqTabExit(pAd); + +err5: + RtmpNetTaskExit(pAd); + UserCfgExit(pAd); + +err4: + MlmeHalt(pAd); + +err3: + RtmpMgmtTaskExit(pAd); + +err2: + RTMPFreeTxRxRingMemory(pAd); + +err1: + +#ifdef DOT11_N_SUPPORT + if(pAd->mpdu_blk_pool.mem) + os_free_mem(pAd, pAd->mpdu_blk_pool.mem); // free BA pool +#endif // DOT11_N_SUPPORT // + + // shall not set priv to NULL here because the priv didn't been free yet. + //net_dev->priv = 0; +#ifdef INF_AMAZON_SE +err0: +#endif // INF_AMAZON_SE // +#ifdef ST +err0: +#endif // ST // + + DBGPRINT(RT_DEBUG_ERROR, ("!!! rt28xx Initialized fail !!!\n")); + return FALSE; +} + + +/* End of rtmp_init_inf.c */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_mcu.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_mcu.c new file mode 100644 index 000000000..241ccadec --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_mcu.c @@ -0,0 +1,570 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_mcu.c + + Abstract: + Miniport generic portion header file + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + + +#include "rt_config.h" +#include "firmware.h" + +//#define BIN_IN_FILE /* use *.bin firmware */ + + +// New 8k byte firmware size for RT3071/RT3072 +#define FIRMWAREIMAGE_MAX_LENGTH 0x2000 +#define FIRMWAREIMAGE_LENGTH (sizeof (FirmwareImage) / sizeof(UCHAR)) +#define FIRMWARE_MAJOR_VERSION 0 + +#define FIRMWAREIMAGEV1_LENGTH 0x1000 +#define FIRMWAREIMAGEV2_LENGTH 0x1000 + +#ifdef RTMP_MAC_PCI +#define FIRMWARE_MINOR_VERSION 2 +#endif // RTMP_MAC_PCI // + +const unsigned short ccitt_16Table[] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, + 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, + 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, + 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, + 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, + 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, + 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, + 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, + 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, + 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, + 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, + 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, + 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, + 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, + 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, + 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, + 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, + 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, + 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, + 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, + 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, + 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 +}; +#define ByteCRC16(v, crc) \ + (unsigned short)((crc << 8) ^ ccitt_16Table[((crc >> 8) ^ (v)) & 255]) + +unsigned char BitReverse(unsigned char x) +{ + int i; + unsigned char Temp=0; + for(i=0; ; i++) + { + if(x & 0x80) Temp |= 0x80; + if(i==7) break; + x <<= 1; + Temp >>= 1; + } + return Temp; +} + + +/* + ======================================================================== + + Routine Description: + erase 8051 firmware image in MAC ASIC + + Arguments: + Adapter Pointer to our adapter + + IRQL = PASSIVE_LEVEL + + ======================================================================== +*/ +INT RtmpAsicEraseFirmware( + IN PRTMP_ADAPTER pAd) +{ + ULONG i; + + for(i=0; i<MAX_FIRMWARE_IMAGE_SIZE; i+=4) + RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, 0); + + return 0; +} + +/* + ======================================================================== + + Routine Description: + Load 8051 firmware file into MAC ASIC + + Arguments: + Adapter Pointer to our adapter + + Return Value: + NDIS_STATUS_SUCCESS firmware image load ok + NDIS_STATUS_FAILURE image not found + + IRQL = PASSIVE_LEVEL + + ======================================================================== +*/ +NDIS_STATUS RtmpAsicLoadFirmware( + IN PRTMP_ADAPTER pAd) +{ +#ifdef BIN_IN_FILE +#define NICLF_DEFAULT_USE() \ + flg_default_firm_use = TRUE; \ + DBGPRINT(RT_DEBUG_OFF, ("%s - Use default firmware!\n", __FUNCTION__)); + + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + PUCHAR src; + RTMP_OS_FD srcf; + INT retval, i; + PUCHAR pFirmwareImage; + INT FileLength = 0; + UINT32 MacReg; + ULONG Index; + ULONG firm; + BOOLEAN flg_default_firm_use = FALSE; + RTMP_OS_FS_INFO osFSInfo; + + DBGPRINT(RT_DEBUG_TRACE, ("===> %s\n", __FUNCTION__)); + + /* init */ + pFirmwareImage = NULL; + src = RTMP_FIRMWARE_FILE_NAME; + + RtmpOSFSInfoChange(&osFSInfo, TRUE); + + pAd->FirmwareVersion = (FIRMWARE_MAJOR_VERSION << 8) + \ + FIRMWARE_MINOR_VERSION; + + + /* allocate firmware buffer */ + pFirmwareImage = kmalloc(MAX_FIRMWARE_IMAGE_SIZE, MEM_ALLOC_FLAG); + if (pFirmwareImage == NULL) + { + /* allocate fail, use default firmware array in firmware.h */ + DBGPRINT(RT_DEBUG_ERROR, ("%s - Allocate memory fail!\n", __FUNCTION__)); + NICLF_DEFAULT_USE(); + } + else + { + /* allocate ok! zero the firmware buffer */ + memset(pFirmwareImage, 0x00, MAX_FIRMWARE_IMAGE_SIZE); + } /* End of if */ + + + /* if ok, read firmware file from *.bin file */ + if (flg_default_firm_use == FALSE) + { + do + { + /* open the bin file */ + srcf = RtmpOSFileOpen(src, O_RDONLY, 0); + + if (IS_FILE_OPEN_ERR(srcf)) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s - Error opening file %s\n", __FUNCTION__, src)); + NICLF_DEFAULT_USE(); + break; + } + + + /* read the firmware from the file *.bin */ + FileLength = RtmpOSFileRead(srcf, pFirmwareImage, MAX_FIRMWARE_IMAGE_SIZE); + if (FileLength != MAX_FIRMWARE_IMAGE_SIZE) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: error file length (=%d) in RT2860AP.BIN\n", + __FUNCTION__, FileLength)); + NICLF_DEFAULT_USE(); + break; + } + else + { + PUCHAR ptr = pFirmwareImage; + USHORT crc = 0xffff; + + + /* calculate firmware CRC */ + for(i=0; i<(MAX_FIRMWARE_IMAGE_SIZE-2); i++, ptr++) + crc = ByteCRC16(BitReverse(*ptr), crc); + /* End of for */ + + if ((pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-2] != \ + (UCHAR)BitReverse((UCHAR)(crc>>8))) || + (pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-1] != \ + (UCHAR)BitReverse((UCHAR)crc))) + { + /* CRC fail */ + DBGPRINT(RT_DEBUG_ERROR, ("%s: CRC = 0x%02x 0x%02x " + "error, should be 0x%02x 0x%02x\n", + __FUNCTION__, + pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-2], + pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-1], + (UCHAR)(crc>>8), (UCHAR)(crc))); + NICLF_DEFAULT_USE(); + break; + } + else + { + /* firmware is ok */ + pAd->FirmwareVersion = \ + (pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-4] << 8) + + pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-3]; + + /* check if firmware version of the file is too old */ + if ((pAd->FirmwareVersion) < \ + ((FIRMWARE_MAJOR_VERSION << 8) + + FIRMWARE_MINOR_VERSION)) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: firmware version too old!\n", __FUNCTION__)); + NICLF_DEFAULT_USE(); + break; + } /* End of if */ + } /* End of if */ + + DBGPRINT(RT_DEBUG_TRACE, + ("NICLoadFirmware: CRC ok, ver=%d.%d\n", + pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-4], + pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-3])); + } /* End of if (FileLength == MAX_FIRMWARE_IMAGE_SIZE) */ + break; + } while(TRUE); + + /* close firmware file */ + if (IS_FILE_OPEN_ERR(srcf)) + ; + else + { + retval = RtmpOSFileClose(srcf); + if (retval) + { + DBGPRINT(RT_DEBUG_ERROR, ("--> Error %d closing %s\n", -retval, src)); + } + } + } + + + /* write firmware to ASIC */ + if (flg_default_firm_use == TRUE) + { + /* use default fimeware, free allocated buffer */ + if (pFirmwareImage != NULL) + kfree(pFirmwareImage); + /* End of if */ + + /* use default *.bin array */ + pFirmwareImage = FirmwareImage; + FileLength = sizeof(FirmwareImage); + } /* End of if */ + + /* enable Host program ram write selection */ + RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x10000); + + for(i=0; i<FileLength; i+=4) + { + firm = pFirmwareImage[i] + + (pFirmwareImage[i+3] << 24) + + (pFirmwareImage[i+2] << 16) + + (pFirmwareImage[i+1] << 8); + + RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, firm); + } /* End of for */ + + RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x00000); + RTMP_IO_WRITE32(pAd, PBF_SYS_CTRL, 0x00001); + + /* initialize BBP R/W access agent */ + RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, 0); + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, 0); + + if (flg_default_firm_use == FALSE) + { + /* use file firmware, free allocated buffer */ + if (pFirmwareImage != NULL) + kfree(pFirmwareImage); + /* End of if */ + } /* End of if */ + + RtmpOSFSInfoChange(&osFSInfo, FALSE); +#else + + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + PUCHAR pFirmwareImage; + ULONG FileLength, Index; + //ULONG firm; + UINT32 MacReg = 0; + UINT32 Version = (pAd->MACVersion >> 16); + + pFirmwareImage = FirmwareImage; + FileLength = sizeof(FirmwareImage); + + // New 8k byte firmware size for RT3071/RT3072 + //DBGPRINT(RT_DEBUG_TRACE, ("Usb Chip\n")); + if (FIRMWAREIMAGE_LENGTH == FIRMWAREIMAGE_MAX_LENGTH) + //The firmware image consists of two parts. One is the origianl and the other is the new. + //Use Second Part + { +#ifdef RTMP_MAC_PCI + if ((Version == 0x2860) || (Version == 0x3572) || IS_RT3090(pAd)||IS_RT3390(pAd)) + { + pFirmwareImage = FirmwareImage; + FileLength = FIRMWAREIMAGE_LENGTH; + } +#endif // RTMP_MAC_PCI // + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("KH: bin file should be 8KB.\n")); + Status = NDIS_STATUS_FAILURE; + } + + + RTMP_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength); + +#endif + + /* check if MCU is ready */ + Index = 0; + do + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return NDIS_STATUS_FAILURE; + + RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg); + + if (MacReg & 0x80) + break; + + RTMPusecDelay(1000); + } while (Index++ < 1000); + + if (Index >= 1000) + { + DBGPRINT(RT_DEBUG_ERROR, ("NICLoadFirmware: MCU is not ready\n\n\n")); + Status = NDIS_STATUS_FAILURE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("<=== %s (status=%d)\n", __FUNCTION__, Status)); + + return Status; +} + + +INT RtmpAsicSendCommandToMcu( + IN PRTMP_ADAPTER pAd, + IN UCHAR Command, + IN UCHAR Token, + IN UCHAR Arg0, + IN UCHAR Arg1) +{ + HOST_CMD_CSR_STRUC H2MCmd; + H2M_MAILBOX_STRUC H2MMailbox; + ULONG i = 0; +#ifdef RTMP_MAC_PCI +#ifdef RALINK_ATE + static UINT32 j = 0; +#endif // RALINK_ATE // +#endif // RTMP_MAC_PCI // +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + // 3090F power solution 3 has hw limitation that needs to ban all mcu command + // when firmware is in radio state. For other chip doesn't have this limitation. + if (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) && IS_VERSION_AFTER_F(pAd)) && IS_VERSION_AFTER_F(pAd) + && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3) + && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE)) + { + RTMP_SEM_LOCK(&pAd->McuCmdLock); + if ((pAd->brt30xxBanMcuCmd == TRUE) + && (Command != WAKE_MCU_CMD) && (Command != RFOFF_MCU_CMD)) + { + RTMP_SEM_UNLOCK(&pAd->McuCmdLock); + DBGPRINT(RT_DEBUG_TRACE, (" Ban Mcu Cmd %x in sleep mode\n", Command)); + return FALSE; + } + else if ((Command == SLEEP_MCU_CMD) + ||(Command == RFOFF_MCU_CMD)) + { + pAd->brt30xxBanMcuCmd = TRUE; + } + else if (Command != WAKE_MCU_CMD) + { + pAd->brt30xxBanMcuCmd = FALSE; + } + + RTMP_SEM_UNLOCK(&pAd->McuCmdLock); + + } + if (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) && IS_VERSION_AFTER_F(pAd)) && IS_VERSION_AFTER_F(pAd) + && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3) + && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + && (Command == WAKE_MCU_CMD)) + { + + do + { + RTMP_IO_FORCE_READ32(pAd, H2M_MAILBOX_CSR, &H2MMailbox.word); + if (H2MMailbox.field.Owner == 0) + break; + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return FALSE; + + RTMPusecDelay(2); + DBGPRINT(RT_DEBUG_INFO, ("AsicSendCommanToMcu::Mail box is busy\n")); + } while(i++ < 100); + + if (i >= 100) + { + DBGPRINT_ERR(("H2M_MAILBOX still hold by MCU. command fail\n")); + return FALSE; + } + + H2MMailbox.field.Owner = 1; // pass ownership to MCU + H2MMailbox.field.CmdToken = Token; + H2MMailbox.field.HighByte = Arg1; + H2MMailbox.field.LowByte = Arg0; + RTMP_IO_FORCE_WRITE32(pAd, H2M_MAILBOX_CSR, H2MMailbox.word); + + H2MCmd.word = 0; + H2MCmd.field.HostCommand = Command; + RTMP_IO_FORCE_WRITE32(pAd, HOST_CMD_CSR, H2MCmd.word); + + + } + else +#endif // CONFIG_STA_SUPPORT // +#endif // PCIE_PS_SUPPORT // + { + do + { + RTMP_IO_READ32(pAd, H2M_MAILBOX_CSR, &H2MMailbox.word); + if (H2MMailbox.field.Owner == 0) + break; + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) + return FALSE; + + RTMPusecDelay(2); + } while(i++ < 100); + + if (i >= 100) + { +#ifdef RTMP_MAC_PCI +#ifdef RALINK_ATE + if (pAd->ate.bFWLoading == TRUE) + { + /* reloading firmware when received iwpriv cmd "ATE=ATESTOP" */ + if (j > 0) + { + if (j % 64 != 0) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("#")); + } + else + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("\n")); + } + ++j; + } + else if (j == 0) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Loading firmware. Please wait for a moment...\n")); + ++j; + } + } + else +#endif // RALINK_ATE // +#endif // RTMP_MAC_PCI // + { + DBGPRINT_ERR(("H2M_MAILBOX still hold by MCU. command fail\n")); + } + return FALSE; + } + +#ifdef RTMP_MAC_PCI +#ifdef RALINK_ATE + else if (pAd->ate.bFWLoading == TRUE) + { + /* reloading of firmware is completed */ + pAd->ate.bFWLoading = FALSE; + ATEDBGPRINT(RT_DEBUG_ERROR, ("\n")); + j = 0; + } +#endif // RALINK_ATE // +#endif // RTMP_MAC_PCI // + + H2MMailbox.field.Owner = 1; // pass ownership to MCU + H2MMailbox.field.CmdToken = Token; + H2MMailbox.field.HighByte = Arg1; + H2MMailbox.field.LowByte = Arg0; + RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, H2MMailbox.word); + + H2MCmd.word = 0; + H2MCmd.field.HostCommand = Command; + RTMP_IO_WRITE32(pAd, HOST_CMD_CSR, H2MCmd.word); + + if (Command != 0x80) + { + } +} +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + // 3090 MCU Wakeup command needs more time to be stable. + // Before stable, don't issue other MCU command to prevent from firmware error. + if (((IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) && IS_VERSION_AFTER_F(pAd)) && IS_VERSION_AFTER_F(pAd) + && (pAd->StaCfg.PSControl.field.rt30xxPowerMode == 3) + && (pAd->StaCfg.PSControl.field.EnableNewPS == TRUE) + && (Command == WAKE_MCU_CMD)) + { + RTMPusecDelay(2000); + //Put this is after RF programming. + //NdisAcquireSpinLock(&pAd->McuCmdLock); + //pAd->brt30xxBanMcuCmd = FALSE; + //NdisReleaseSpinLock(&pAd->McuCmdLock); + } +#endif // CONFIG_STA_SUPPORT // +#endif // PCIE_PS_SUPPORT // + + return TRUE; +} diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_timer.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_timer.c new file mode 100644 index 000000000..147285f4e --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/rtmp_timer.c @@ -0,0 +1,334 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_timer.c + + Abstract: + task for timer handling + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs + Shiang Tu 08-28-2008 init version + +*/ + +#include "rt_config.h" + + +BUILD_TIMER_FUNCTION(MlmePeriodicExec); +//BUILD_TIMER_FUNCTION(MlmeRssiReportExec); +BUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout); +BUILD_TIMER_FUNCTION(APSDPeriodicExec); +BUILD_TIMER_FUNCTION(AsicRfTuningExec); + +#ifdef CONFIG_STA_SUPPORT +BUILD_TIMER_FUNCTION(BeaconTimeout); +BUILD_TIMER_FUNCTION(ScanTimeout); +BUILD_TIMER_FUNCTION(AuthTimeout); +BUILD_TIMER_FUNCTION(AssocTimeout); +BUILD_TIMER_FUNCTION(ReassocTimeout); +BUILD_TIMER_FUNCTION(DisassocTimeout); +BUILD_TIMER_FUNCTION(LinkDownExec); +BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec); +BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc); +#ifdef PCIE_PS_SUPPORT +BUILD_TIMER_FUNCTION(PsPollWakeExec); +BUILD_TIMER_FUNCTION(RadioOnExec); +#endif // PCIE_PS_SUPPORT // +#ifdef QOS_DLS_SUPPORT +BUILD_TIMER_FUNCTION(DlsTimeoutAction); +#endif // QOS_DLS_SUPPORT // + + + + + +#endif // CONFIG_STA_SUPPORT // + + + +#if defined(AP_LED) || defined(STA_LED) +extern void LedCtrlMain( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); +BUILD_TIMER_FUNCTION(LedCtrlMain); +#endif + + +#ifdef RT2883_TEMP_PATCH +BUILD_TIMER_FUNCTION(eTxBfProbeTimerExec); +#endif // RT2883_TEMP_PATCH // + +#ifdef RTMP_TIMER_TASK_SUPPORT +static void RtmpTimerQHandle(RTMP_ADAPTER *pAd) +{ +#ifndef KTHREAD_SUPPORT + int status; +#endif + RALINK_TIMER_STRUCT *pTimer; + RTMP_TIMER_TASK_ENTRY *pEntry; + unsigned long irqFlag; + RTMP_OS_TASK *pTask; + + + pTask = &pAd->timerTask; + while(!pTask->task_killed) + { + pTimer = NULL; + +#ifdef KTHREAD_SUPPORT + RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask); +#else + RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status); +#endif + + if (pAd->TimerQ.status == RTMP_TASK_STAT_STOPED) + break; + + // event happened. + while(pAd->TimerQ.pQHead) + { + RTMP_INT_LOCK(&pAd->TimerQLock, irqFlag); + pEntry = pAd->TimerQ.pQHead; + if (pEntry) + { + pTimer = pEntry->pRaTimer; + + // update pQHead + pAd->TimerQ.pQHead = pEntry->pNext; + if (pEntry == pAd->TimerQ.pQTail) + pAd->TimerQ.pQTail = NULL; + + // return this queue entry to timerQFreeList. + pEntry->pNext = pAd->TimerQ.pQPollFreeList; + pAd->TimerQ.pQPollFreeList = pEntry; + } + RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlag); + + if (pTimer) + { + if ((pTimer->handle != NULL) && (!pAd->PM_FlgSuspend)) + pTimer->handle(NULL, (PVOID) pTimer->cookie, NULL, pTimer); + if ((pTimer->Repeat) && (pTimer->State == FALSE)) + RTMP_OS_Add_Timer(&pTimer->TimerObj, pTimer->TimerValue); + } + } + +#ifndef KTHREAD_SUPPORT + if (status != 0) + { + pAd->TimerQ.status = RTMP_TASK_STAT_STOPED; + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); + break; + } +#endif + } +} + + +INT RtmpTimerQThread( + IN ULONG Context) +{ + RTMP_OS_TASK *pTask; + PRTMP_ADAPTER pAd; + + + pTask = (RTMP_OS_TASK *)Context; + pAd = (PRTMP_ADAPTER)pTask->priv; + + RtmpOSTaskCustomize(pTask); + + RtmpTimerQHandle(pAd); + + DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__FUNCTION__)); +#ifndef KTHREAD_SUPPORT + pTask->taskPID = THREAD_PID_INIT_VALUE; +#endif + /* 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(). + */ + RtmpOSTaskNotifyToExit(pTask); + + return 0; + +} + + +RTMP_TIMER_TASK_ENTRY *RtmpTimerQInsert( + IN RTMP_ADAPTER *pAd, + IN RALINK_TIMER_STRUCT *pTimer) +{ + RTMP_TIMER_TASK_ENTRY *pQNode = NULL, *pQTail; + unsigned long irqFlags; + RTMP_OS_TASK *pTask = &pAd->timerTask; + + RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags); + if (pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT) + { + if(pAd->TimerQ.pQPollFreeList) + { + pQNode = pAd->TimerQ.pQPollFreeList; + pAd->TimerQ.pQPollFreeList = pQNode->pNext; + + pQNode->pRaTimer = pTimer; + pQNode->pNext = NULL; + + pQTail = pAd->TimerQ.pQTail; + if (pAd->TimerQ.pQTail != NULL) + pQTail->pNext = pQNode; + pAd->TimerQ.pQTail = pQNode; + if (pAd->TimerQ.pQHead == NULL) + pAd->TimerQ.pQHead = pQNode; + } + } + RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags); + + if (pQNode) + { +#ifdef KTHREAD_SUPPORT + WAKE_UP(pTask); +#else + RTMP_SEM_EVENT_UP(&pTask->taskSema); +#endif + } + + return pQNode; +} + + +BOOLEAN RtmpTimerQRemove( + IN RTMP_ADAPTER *pAd, + IN RALINK_TIMER_STRUCT *pTimer) +{ + RTMP_TIMER_TASK_ENTRY *pNode, *pPrev = NULL; + unsigned long irqFlags; + + RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags); + if (pAd->TimerQ.status >= RTMP_TASK_STAT_INITED) + { + pNode = pAd->TimerQ.pQHead; + while (pNode) + { + if (pNode->pRaTimer == pTimer) + break; + pPrev = pNode; + pNode = pNode->pNext; + } + + // Now move it to freeList queue. + if (pNode) + { + if (pNode == pAd->TimerQ.pQHead) + pAd->TimerQ.pQHead = pNode->pNext; + if (pNode == pAd->TimerQ.pQTail) + pAd->TimerQ.pQTail = pPrev; + if (pPrev != NULL) + pPrev->pNext = pNode->pNext; + + // return this queue entry to timerQFreeList. + pNode->pNext = pAd->TimerQ.pQPollFreeList; + pAd->TimerQ.pQPollFreeList = pNode; + } + } + RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags); + + return TRUE; +} + + +void RtmpTimerQExit(RTMP_ADAPTER *pAd) +{ + RTMP_TIMER_TASK_ENTRY *pTimerQ; + unsigned long irqFlags; + + RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags); + while (pAd->TimerQ.pQHead) + { + pTimerQ = pAd->TimerQ.pQHead; + pAd->TimerQ.pQHead = pTimerQ->pNext; + // remove the timeQ + } + pAd->TimerQ.pQPollFreeList = NULL; + os_free_mem(pAd, pAd->TimerQ.pTimerQPoll); + pAd->TimerQ.pQTail = NULL; + pAd->TimerQ.pQHead = NULL; +#ifndef KTHREAD_SUPPORT + pAd->TimerQ.status = RTMP_TASK_STAT_STOPED; +#endif + RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags); + +} + + +void RtmpTimerQInit(RTMP_ADAPTER *pAd) +{ + int i; + RTMP_TIMER_TASK_ENTRY *pQNode, *pEntry; + unsigned long irqFlags; + + NdisAllocateSpinLock(&pAd->TimerQLock); + + NdisZeroMemory(&pAd->TimerQ, sizeof(pAd->TimerQ)); + + os_alloc_mem(pAd, &pAd->TimerQ.pTimerQPoll, sizeof(RTMP_TIMER_TASK_ENTRY) * TIMER_QUEUE_SIZE_MAX); + if (pAd->TimerQ.pTimerQPoll) + { + pEntry = NULL; + pQNode = (RTMP_TIMER_TASK_ENTRY *)pAd->TimerQ.pTimerQPoll; + NdisZeroMemory(pAd->TimerQ.pTimerQPoll, sizeof(RTMP_TIMER_TASK_ENTRY) * TIMER_QUEUE_SIZE_MAX); + + RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags); + for (i = 0 ;i <TIMER_QUEUE_SIZE_MAX; i++) + { + pQNode->pNext = pEntry; + pEntry = pQNode; + pQNode++; + } + pAd->TimerQ.pQPollFreeList = pEntry; + pAd->TimerQ.pQHead = NULL; + pAd->TimerQ.pQTail = NULL; + pAd->TimerQ.status = RTMP_TASK_STAT_INITED; + RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags); + } +} +#endif // RTMP_TIMER_TASK_SUPPORT // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/spectrum.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/spectrum.c new file mode 100644 index 000000000..7249da9a8 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/spectrum.c @@ -0,0 +1,2298 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + action.c + + Abstract: + Handle association related requests either from WSTA or from local MLME + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + Fonchi Wu 2008 created for 802.11h + */ + +#include "rt_config.h" +#include "action.h" + + +/* The regulatory information in the USA (US) */ +DOT11_REGULATORY_INFORMATION USARegulatoryInfo[] = +{ +/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */ + {0, {0, 0, {0}}}, // Invlid entry + {1, {4, 16, {36, 40, 44, 48}}}, + {2, {4, 23, {52, 56, 60, 64}}}, + {3, {4, 29, {149, 153, 157, 161}}}, + {4, {11, 23, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}}}, + {5, {5, 30, {149, 153, 157, 161, 165}}}, + {6, {10, 14, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}}, + {7, {10, 27, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}}, + {8, {5, 17, {11, 13, 15, 17, 19}}}, + {9, {5, 30, {11, 13, 15, 17, 19}}}, + {10, {2, 20, {21, 25}}}, + {11, {2, 33, {21, 25}}}, + {12, {11, 30, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}} +}; +#define USA_REGULATORY_INFO_SIZE (sizeof(USARegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION)) + + +/* The regulatory information in Europe */ +DOT11_REGULATORY_INFORMATION EuropeRegulatoryInfo[] = +{ +/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */ + {0, {0, 0, {0}}}, // Invalid entry + {1, {4, 20, {36, 40, 44, 48}}}, + {2, {4, 20, {52, 56, 60, 64}}}, + {3, {11, 30, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}}}, + {4, {13, 20, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}}} +}; +#define EU_REGULATORY_INFO_SIZE (sizeof(EuropeRegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION)) + + +/* The regulatory information in Japan */ +DOT11_REGULATORY_INFORMATION JapanRegulatoryInfo[] = +{ +/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */ + {0, {0, 0, {0}}}, // Invalid entry + {1, {4, 22, {34, 38, 42, 46}}}, + {2, {3, 24, {8, 12, 16}}}, + {3, {3, 24, {8, 12, 16}}}, + {4, {3, 24, {8, 12, 16}}}, + {5, {3, 24, {8, 12, 16}}}, + {6, {3, 22, {8, 12, 16}}}, + {7, {4, 24, {184, 188, 192, 196}}}, + {8, {4, 24, {184, 188, 192, 196}}}, + {9, {4, 24, {184, 188, 192, 196}}}, + {10, {4, 24, {184, 188, 192, 196}}}, + {11, {4, 22, {184, 188, 192, 196}}}, + {12, {4, 24, {7, 8, 9, 11}}}, + {13, {4, 24, {7, 8, 9, 11}}}, + {14, {4, 24, {7, 8, 9, 11}}}, + {15, {4, 24, {7, 8, 9, 11}}}, + {16, {6, 24, {183, 184, 185, 187, 188, 189}}}, + {17, {6, 24, {183, 184, 185, 187, 188, 189}}}, + {18, {6, 24, {183, 184, 185, 187, 188, 189}}}, + {19, {6, 24, {183, 184, 185, 187, 188, 189}}}, + {20, {6, 17, {183, 184, 185, 187, 188, 189}}}, + {21, {6, 24, {6, 7, 8, 9, 10, 11}}}, + {22, {6, 24, {6, 7, 8, 9, 10, 11}}}, + {23, {6, 24, {6, 7, 8, 9, 10, 11}}}, + {24, {6, 24, {6, 7, 8, 9, 10, 11}}}, + {25, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}}}, + {26, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}}}, + {27, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}}}, + {28, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}}}, + {29, {8, 17, {182, 183, 184, 185, 186, 187, 188, 189}}}, + {30, {13, 23, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}}}, + {31, {1, 23, {14}}}, + {32, {4, 22, {52, 56, 60, 64}}} +}; +#define JP_REGULATORY_INFO_SIZE (sizeof(JapanRegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION)) + + +UINT8 GetRegulatoryMaxTxPwr( + IN PRTMP_ADAPTER pAd, + IN UINT8 channel) +{ + ULONG RegulatoryClassLoop, ChIdx; + UINT8 RegulatoryClass; + UINT8 MaxRegulatoryClassNum; + PDOT11_REGULATORY_INFORMATION pRegulatoryClass; + PSTRING pCountry = pAd->CommonCfg.CountryCode; + + + if (strncmp(pCountry, "US", 2) == 0) + { + MaxRegulatoryClassNum = USA_REGULATORY_INFO_SIZE; + pRegulatoryClass = &USARegulatoryInfo[0]; + } + else if (strncmp(pCountry, "JP", 2) == 0) + { + MaxRegulatoryClassNum = JP_REGULATORY_INFO_SIZE; + pRegulatoryClass = &JapanRegulatoryInfo[0]; + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: Unknow Country (%s)\n", + __FUNCTION__, pCountry)); + return 0xff; + } + + for (RegulatoryClassLoop = 0; + RegulatoryClassLoop<MAX_NUM_OF_REGULATORY_CLASS; + RegulatoryClassLoop++) + { + PDOT11_CHANNEL_SET pChannelSet; + + RegulatoryClass = pAd->CommonCfg.RegulatoryClass[RegulatoryClassLoop]; + if (RegulatoryClass >= MaxRegulatoryClassNum) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: %c%c Unknow Requlatory class (%d)\n", + __FUNCTION__, pCountry[0], pCountry[1], RegulatoryClass)); + return 0xff; + } + pChannelSet = &pRegulatoryClass[RegulatoryClass].ChannelSet; + for (ChIdx=0; ChIdx<pChannelSet->NumberOfChannels; ChIdx++) + { + if (channel == pChannelSet->ChannelList[ChIdx]) + return pChannelSet->MaxTxPwr; + + } + if (ChIdx == pChannelSet->NumberOfChannels) + return 0xff; + } + + return 0xff; +} + +CHAR RTMP_GetTxPwr( + IN PRTMP_ADAPTER pAd, + IN HTTRANSMIT_SETTING HTTxMode) +{ +typedef struct __TX_PWR_CFG +{ + UINT8 Mode; + UINT8 MCS; + UINT16 req; + UINT8 shift; + UINT32 BitMask; +} TX_PWR_CFG; + + UINT32 Value; + INT Idx; + UINT8 PhyMode; + CHAR CurTxPwr; + UINT8 TxPwrRef = 0; + CHAR DaltaPwr; + ULONG TxPwr[5]; + + + TX_PWR_CFG TxPwrCfg[] = { + {MODE_CCK, 0, 0, 4, 0x000000f0}, + {MODE_CCK, 1, 0, 0, 0x0000000f}, + {MODE_CCK, 2, 0, 12, 0x0000f000}, + {MODE_CCK, 3, 0, 8, 0x00000f00}, + + {MODE_OFDM, 0, 0, 20, 0x00f00000}, + {MODE_OFDM, 1, 0, 16, 0x000f0000}, + {MODE_OFDM, 2, 0, 28, 0xf0000000}, + {MODE_OFDM, 3, 0, 24, 0x0f000000}, + {MODE_OFDM, 4, 1, 4, 0x000000f0}, + {MODE_OFDM, 5, 1, 0, 0x0000000f}, + {MODE_OFDM, 6, 1, 12, 0x0000f000}, + {MODE_OFDM, 7, 1, 8, 0x00000f00} +#ifdef DOT11_N_SUPPORT + ,{MODE_HTMIX, 0, 1, 20, 0x00f00000}, + {MODE_HTMIX, 1, 1, 16, 0x000f0000}, + {MODE_HTMIX, 2, 1, 28, 0xf0000000}, + {MODE_HTMIX, 3, 1, 24, 0x0f000000}, + {MODE_HTMIX, 4, 2, 4, 0x000000f0}, + {MODE_HTMIX, 5, 2, 0, 0x0000000f}, + {MODE_HTMIX, 6, 2, 12, 0x0000f000}, + {MODE_HTMIX, 7, 2, 8, 0x00000f00}, + {MODE_HTMIX, 8, 2, 20, 0x00f00000}, + {MODE_HTMIX, 9, 2, 16, 0x000f0000}, + {MODE_HTMIX, 10, 2, 28, 0xf0000000}, + {MODE_HTMIX, 11, 2, 24, 0x0f000000}, + {MODE_HTMIX, 12, 3, 4, 0x000000f0}, + {MODE_HTMIX, 13, 3, 0, 0x0000000f}, + {MODE_HTMIX, 14, 3, 12, 0x0000f000}, + {MODE_HTMIX, 15, 3, 8, 0x00000f00} +#endif // DOT11_N_SUPPORT // + }; +#define MAX_TXPWR_TAB_SIZE (sizeof(TxPwrCfg) / sizeof(TX_PWR_CFG)) + +#ifdef SINGLE_SKU + CurTxPwr = pAd->CommonCfg.DefineMaxTxPwr; +#else + CurTxPwr = 19; +#endif + + /* check Tx Power setting from UI. */ + if (pAd->CommonCfg.TxPowerPercentage > 90) + ; + else if (pAd->CommonCfg.TxPowerPercentage > 60) /* reduce Pwr for 1 dB. */ + CurTxPwr -= 1; + else if (pAd->CommonCfg.TxPowerPercentage > 30) /* reduce Pwr for 3 dB. */ + CurTxPwr -= 3; + else if (pAd->CommonCfg.TxPowerPercentage > 15) /* reduce Pwr for 6 dB. */ + CurTxPwr -= 6; + else if (pAd->CommonCfg.TxPowerPercentage > 9) /* reduce Pwr for 9 dB. */ + CurTxPwr -= 9; + else /* reduce Pwr for 12 dB. */ + CurTxPwr -= 12; + + if (pAd->CommonCfg.BBPCurrentBW == BW_40) + { + if (pAd->CommonCfg.CentralChannel > 14) + { + TxPwr[0] = pAd->Tx40MPwrCfgABand[0]; + TxPwr[1] = pAd->Tx40MPwrCfgABand[1]; + TxPwr[2] = pAd->Tx40MPwrCfgABand[2]; + TxPwr[3] = pAd->Tx40MPwrCfgABand[3]; + TxPwr[4] = pAd->Tx40MPwrCfgABand[4]; + } + else + { + TxPwr[0] = pAd->Tx40MPwrCfgGBand[0]; + TxPwr[1] = pAd->Tx40MPwrCfgGBand[1]; + TxPwr[2] = pAd->Tx40MPwrCfgGBand[2]; + TxPwr[3] = pAd->Tx40MPwrCfgGBand[3]; + TxPwr[4] = pAd->Tx40MPwrCfgGBand[4]; + } + } + else + { + if (pAd->CommonCfg.Channel > 14) + { + TxPwr[0] = pAd->Tx20MPwrCfgABand[0]; + TxPwr[1] = pAd->Tx20MPwrCfgABand[1]; + TxPwr[2] = pAd->Tx20MPwrCfgABand[2]; + TxPwr[3] = pAd->Tx20MPwrCfgABand[3]; + TxPwr[4] = pAd->Tx20MPwrCfgABand[4]; + } + else + { + TxPwr[0] = pAd->Tx20MPwrCfgGBand[0]; + TxPwr[1] = pAd->Tx20MPwrCfgGBand[1]; + TxPwr[2] = pAd->Tx20MPwrCfgGBand[2]; + TxPwr[3] = pAd->Tx20MPwrCfgGBand[3]; + TxPwr[4] = pAd->Tx20MPwrCfgGBand[4]; + } + } + + + switch(HTTxMode.field.MODE) + { + case MODE_CCK: + case MODE_OFDM: + Value = TxPwr[1]; + TxPwrRef = (Value & 0x00000f00) >> 8; + + break; + +#ifdef DOT11_N_SUPPORT + case MODE_HTMIX: + case MODE_HTGREENFIELD: + if (pAd->CommonCfg.TxStream == 1) + { + Value = TxPwr[2]; + TxPwrRef = (Value & 0x00000f00) >> 8; + } + else if (pAd->CommonCfg.TxStream == 2) + { + Value = TxPwr[3]; + TxPwrRef = (Value & 0x00000f00) >> 8; + } + break; +#endif // DOT11_N_SUPPORT // + } + + PhyMode = +#ifdef DOT11_N_SUPPORT + (HTTxMode.field.MODE == MODE_HTGREENFIELD) + ? MODE_HTMIX : +#endif // DOT11_N_SUPPORT // + HTTxMode.field.MODE; + + for (Idx = 0; Idx < MAX_TXPWR_TAB_SIZE; Idx++) + { + if ((TxPwrCfg[Idx].Mode == PhyMode) + && (TxPwrCfg[Idx].MCS == HTTxMode.field.MCS)) + { + Value = TxPwr[TxPwrCfg[Idx].req]; + DaltaPwr = TxPwrRef - (CHAR)((Value & TxPwrCfg[Idx].BitMask) + >> TxPwrCfg[Idx].shift); + CurTxPwr -= DaltaPwr; + break; + } + } + + return CurTxPwr; +} + + +NDIS_STATUS MeasureReqTabInit( + IN PRTMP_ADAPTER pAd) +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + NdisAllocateSpinLock(&pAd->CommonCfg.MeasureReqTabLock); + + pAd->CommonCfg.pMeasureReqTab = kmalloc(sizeof(MEASURE_REQ_TAB), GFP_ATOMIC); + if (pAd->CommonCfg.pMeasureReqTab) + NdisZeroMemory(pAd->CommonCfg.pMeasureReqTab, sizeof(MEASURE_REQ_TAB)); + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s Fail to alloc memory for pAd->CommonCfg.pMeasureReqTab.\n", __FUNCTION__)); + Status = NDIS_STATUS_FAILURE; + } + + return Status; +} + +VOID MeasureReqTabExit( + IN PRTMP_ADAPTER pAd) +{ + NdisFreeSpinLock(&pAd->CommonCfg.MeasureReqTabLock); + + if (pAd->CommonCfg.pMeasureReqTab) + kfree(pAd->CommonCfg.pMeasureReqTab); + pAd->CommonCfg.pMeasureReqTab = NULL; + + return; +} + +PMEASURE_REQ_ENTRY MeasureReqLookUp( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken) +{ + UINT HashIdx; + PMEASURE_REQ_TAB pTab = pAd->CommonCfg.pMeasureReqTab; + PMEASURE_REQ_ENTRY pEntry = NULL; + PMEASURE_REQ_ENTRY pPrevEntry = NULL; + + if (pTab == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: pMeasureReqTab doesn't exist.\n", __FUNCTION__)); + return NULL; + } + + RTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock); + + HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(DialogToken); + pEntry = pTab->Hash[HashIdx]; + + while (pEntry) + { + if (pEntry->DialogToken == DialogToken) + break; + else + { + pPrevEntry = pEntry; + pEntry = pEntry->pNext; + } + } + + RTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock); + + return pEntry; +} + +PMEASURE_REQ_ENTRY MeasureReqInsert( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken) +{ + INT i; + ULONG HashIdx; + PMEASURE_REQ_TAB pTab = pAd->CommonCfg.pMeasureReqTab; + PMEASURE_REQ_ENTRY pEntry = NULL, pCurrEntry; + ULONG Now; + + if(pTab == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: pMeasureReqTab doesn't exist.\n", __FUNCTION__)); + return NULL; + } + + pEntry = MeasureReqLookUp(pAd, DialogToken); + if (pEntry == NULL) + { + RTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock); + for (i = 0; i < MAX_MEASURE_REQ_TAB_SIZE; i++) + { + NdisGetSystemUpTime(&Now); + pEntry = &pTab->Content[i]; + + if ((pEntry->Valid == TRUE) + && RTMP_TIME_AFTER((unsigned long)Now, (unsigned long)(pEntry->lastTime + MQ_REQ_AGE_OUT))) + { + PMEASURE_REQ_ENTRY pPrevEntry = NULL; + ULONG HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken); + PMEASURE_REQ_ENTRY pProbeEntry = pTab->Hash[HashIdx]; + + // update Hash list + do + { + if (pProbeEntry == pEntry) + { + if (pPrevEntry == NULL) + { + pTab->Hash[HashIdx] = pEntry->pNext; + } + else + { + pPrevEntry->pNext = pEntry->pNext; + } + break; + } + + pPrevEntry = pProbeEntry; + pProbeEntry = pProbeEntry->pNext; + } while (pProbeEntry); + + NdisZeroMemory(pEntry, sizeof(MEASURE_REQ_ENTRY)); + pTab->Size--; + + break; + } + + if (pEntry->Valid == FALSE) + break; + } + + if (i < MAX_MEASURE_REQ_TAB_SIZE) + { + NdisGetSystemUpTime(&Now); + pEntry->lastTime = Now; + pEntry->Valid = TRUE; + pEntry->DialogToken = DialogToken; + pTab->Size++; + } + else + { + pEntry = NULL; + DBGPRINT(RT_DEBUG_ERROR, ("%s: pMeasureReqTab tab full.\n", __FUNCTION__)); + } + + // add this Neighbor entry into HASH table + if (pEntry) + { + HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(DialogToken); + if (pTab->Hash[HashIdx] == NULL) + { + pTab->Hash[HashIdx] = pEntry; + } + else + { + pCurrEntry = pTab->Hash[HashIdx]; + while (pCurrEntry->pNext != NULL) + pCurrEntry = pCurrEntry->pNext; + pCurrEntry->pNext = pEntry; + } + } + + RTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock); + } + + return pEntry; +} + +VOID MeasureReqDelete( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken) +{ + PMEASURE_REQ_TAB pTab = pAd->CommonCfg.pMeasureReqTab; + PMEASURE_REQ_ENTRY pEntry = NULL; + + if(pTab == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: pMeasureReqTab doesn't exist.\n", __FUNCTION__)); + return; + } + + // if empty, return + if (pTab->Size == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("pMeasureReqTab empty.\n")); + return; + } + + pEntry = MeasureReqLookUp(pAd, DialogToken); + if (pEntry != NULL) + { + PMEASURE_REQ_ENTRY pPrevEntry = NULL; + ULONG HashIdx = MQ_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken); + PMEASURE_REQ_ENTRY pProbeEntry = pTab->Hash[HashIdx]; + + RTMP_SEM_LOCK(&pAd->CommonCfg.MeasureReqTabLock); + // update Hash list + do + { + if (pProbeEntry == pEntry) + { + if (pPrevEntry == NULL) + { + pTab->Hash[HashIdx] = pEntry->pNext; + } + else + { + pPrevEntry->pNext = pEntry->pNext; + } + break; + } + + pPrevEntry = pProbeEntry; + pProbeEntry = pProbeEntry->pNext; + } while (pProbeEntry); + + NdisZeroMemory(pEntry, sizeof(MEASURE_REQ_ENTRY)); + pTab->Size--; + + RTMP_SEM_UNLOCK(&pAd->CommonCfg.MeasureReqTabLock); + } + + return; +} + +NDIS_STATUS TpcReqTabInit( + IN PRTMP_ADAPTER pAd) +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + NdisAllocateSpinLock(&pAd->CommonCfg.TpcReqTabLock); + + pAd->CommonCfg.pTpcReqTab = kmalloc(sizeof(TPC_REQ_TAB), GFP_ATOMIC); + if (pAd->CommonCfg.pTpcReqTab) + NdisZeroMemory(pAd->CommonCfg.pTpcReqTab, sizeof(TPC_REQ_TAB)); + else + { + DBGPRINT(RT_DEBUG_ERROR, ("%s Fail to alloc memory for pAd->CommonCfg.pTpcReqTab.\n", __FUNCTION__)); Status = NDIS_STATUS_FAILURE; + } + + return Status; +} + +VOID TpcReqTabExit( + IN PRTMP_ADAPTER pAd) +{ + NdisFreeSpinLock(&pAd->CommonCfg.TpcReqTabLock); + + if (pAd->CommonCfg.pTpcReqTab) + kfree(pAd->CommonCfg.pTpcReqTab); + pAd->CommonCfg.pTpcReqTab = NULL; + + return; +} + +static PTPC_REQ_ENTRY TpcReqLookUp( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken) +{ + UINT HashIdx; + PTPC_REQ_TAB pTab = pAd->CommonCfg.pTpcReqTab; + PTPC_REQ_ENTRY pEntry = NULL; + PTPC_REQ_ENTRY pPrevEntry = NULL; + + if (pTab == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: pTpcReqTab doesn't exist.\n", __FUNCTION__)); + return NULL; + } + + RTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock); + + HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(DialogToken); + pEntry = pTab->Hash[HashIdx]; + + while (pEntry) + { + if (pEntry->DialogToken == DialogToken) + break; + else + { + pPrevEntry = pEntry; + pEntry = pEntry->pNext; + } + } + + RTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock); + + return pEntry; +} + + +static PTPC_REQ_ENTRY TpcReqInsert( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken) +{ + INT i; + ULONG HashIdx; + PTPC_REQ_TAB pTab = pAd->CommonCfg.pTpcReqTab; + PTPC_REQ_ENTRY pEntry = NULL, pCurrEntry; + ULONG Now; + + if(pTab == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: pTpcReqTab doesn't exist.\n", __FUNCTION__)); + return NULL; + } + + pEntry = TpcReqLookUp(pAd, DialogToken); + if (pEntry == NULL) + { + RTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock); + for (i = 0; i < MAX_TPC_REQ_TAB_SIZE; i++) + { + NdisGetSystemUpTime(&Now); + pEntry = &pTab->Content[i]; + + if ((pEntry->Valid == TRUE) + && RTMP_TIME_AFTER((unsigned long)Now, (unsigned long)(pEntry->lastTime + TPC_REQ_AGE_OUT))) + { + PTPC_REQ_ENTRY pPrevEntry = NULL; + ULONG HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken); + PTPC_REQ_ENTRY pProbeEntry = pTab->Hash[HashIdx]; + + // update Hash list + do + { + if (pProbeEntry == pEntry) + { + if (pPrevEntry == NULL) + { + pTab->Hash[HashIdx] = pEntry->pNext; + } + else + { + pPrevEntry->pNext = pEntry->pNext; + } + break; + } + + pPrevEntry = pProbeEntry; + pProbeEntry = pProbeEntry->pNext; + } while (pProbeEntry); + + NdisZeroMemory(pEntry, sizeof(TPC_REQ_ENTRY)); + pTab->Size--; + + break; + } + + if (pEntry->Valid == FALSE) + break; + } + + if (i < MAX_TPC_REQ_TAB_SIZE) + { + NdisGetSystemUpTime(&Now); + pEntry->lastTime = Now; + pEntry->Valid = TRUE; + pEntry->DialogToken = DialogToken; + pTab->Size++; + } + else + { + pEntry = NULL; + DBGPRINT(RT_DEBUG_ERROR, ("%s: pTpcReqTab tab full.\n", __FUNCTION__)); + } + + // add this Neighbor entry into HASH table + if (pEntry) + { + HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(DialogToken); + if (pTab->Hash[HashIdx] == NULL) + { + pTab->Hash[HashIdx] = pEntry; + } + else + { + pCurrEntry = pTab->Hash[HashIdx]; + while (pCurrEntry->pNext != NULL) + pCurrEntry = pCurrEntry->pNext; + pCurrEntry->pNext = pEntry; + } + } + + RTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock); + } + + return pEntry; +} + +static VOID TpcReqDelete( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken) +{ + PTPC_REQ_TAB pTab = pAd->CommonCfg.pTpcReqTab; + PTPC_REQ_ENTRY pEntry = NULL; + + if(pTab == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: pTpcReqTab doesn't exist.\n", __FUNCTION__)); + return; + } + + // if empty, return + if (pTab->Size == 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("pTpcReqTab empty.\n")); + return; + } + + pEntry = TpcReqLookUp(pAd, DialogToken); + if (pEntry != NULL) + { + PTPC_REQ_ENTRY pPrevEntry = NULL; + ULONG HashIdx = TPC_DIALOGTOKEN_HASH_INDEX(pEntry->DialogToken); + PTPC_REQ_ENTRY pProbeEntry = pTab->Hash[HashIdx]; + + RTMP_SEM_LOCK(&pAd->CommonCfg.TpcReqTabLock); + // update Hash list + do + { + if (pProbeEntry == pEntry) + { + if (pPrevEntry == NULL) + { + pTab->Hash[HashIdx] = pEntry->pNext; + } + else + { + pPrevEntry->pNext = pEntry->pNext; + } + break; + } + + pPrevEntry = pProbeEntry; + pProbeEntry = pProbeEntry->pNext; + } while (pProbeEntry); + + NdisZeroMemory(pEntry, sizeof(TPC_REQ_ENTRY)); + pTab->Size--; + + RTMP_SEM_UNLOCK(&pAd->CommonCfg.TpcReqTabLock); + } + + return; +} + +/* + ========================================================================== + Description: + Get Current TimeS tamp. + + Parametrs: + + Return : Current Time Stamp. + ========================================================================== + */ +static UINT64 GetCurrentTimeStamp( + IN PRTMP_ADAPTER pAd) +{ + // get current time stamp. + return 0; +} + +/* + ========================================================================== + Description: + Get Current Transmit Power. + + Parametrs: + + Return : Current Time Stamp. + ========================================================================== + */ +static UINT8 GetCurTxPwr( + IN PRTMP_ADAPTER pAd, + IN UINT8 Wcid) +{ + return 16; /* 16 dBm */ +} + +/* + ========================================================================== + Description: + Get Current Transmit Power. + + Parametrs: + + Return : Current Time Stamp. + ========================================================================== + */ +VOID InsertChannelRepIE( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN PSTRING pCountry, + IN UINT8 RegulatoryClass) +{ + ULONG TempLen; + UINT8 Len; + UINT8 IEId = IE_AP_CHANNEL_REPORT; + PUCHAR pChListPtr = NULL; + PDOT11_CHANNEL_SET pChannelSet = NULL; + + Len = 1; + if (strncmp(pCountry, "US", 2) == 0) + { + if (RegulatoryClass >= USA_REGULATORY_INFO_SIZE) + { + DBGPRINT(RT_DEBUG_INFO, ("%s: USA Unknow Requlatory class (%d)\n", + __FUNCTION__, RegulatoryClass)); + return; + } + pChannelSet = &USARegulatoryInfo[RegulatoryClass].ChannelSet; + } + else if (strncmp(pCountry, "JP", 2) == 0) + { + if (RegulatoryClass >= JP_REGULATORY_INFO_SIZE) + { + DBGPRINT(RT_DEBUG_INFO, ("%s: JP Unknow Requlatory class (%d)\n", + __FUNCTION__, RegulatoryClass)); + return; + } + + pChannelSet = &JapanRegulatoryInfo[RegulatoryClass].ChannelSet; + } + else + { + DBGPRINT(RT_DEBUG_INFO, ("%s: Unknow Country (%s)\n", + __FUNCTION__, pCountry)); + return; + } + + /* no match channel set. */ + if (pChannelSet == NULL) + return; + + /* empty channel set. */ + if (pChannelSet->NumberOfChannels == 0) + return; + + Len += pChannelSet->NumberOfChannels; + pChListPtr = pChannelSet->ChannelList; + + if (Len > 1) + { + MakeOutgoingFrame(pFrameBuf, &TempLen, + 1, &IEId, + 1, &Len, + 1, &RegulatoryClass, + Len -1, pChListPtr, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + } + return; +} + +/* + ========================================================================== + Description: + Insert Dialog Token into frame. + + Parametrs: + 1. frame buffer pointer. + 2. frame length. + 3. Dialog token. + + Return : None. + ========================================================================== + */ +VOID InsertDialogToken( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN UINT8 DialogToken) +{ + ULONG TempLen; + MakeOutgoingFrame(pFrameBuf, &TempLen, + 1, &DialogToken, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + + return; +} + +/* + ========================================================================== + Description: + Insert TPC Request IE into frame. + + Parametrs: + 1. frame buffer pointer. + 2. frame length. + + Return : None. + ========================================================================== + */ + static VOID InsertTpcReqIE( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen) +{ + ULONG TempLen; + ULONG Len = 0; + UINT8 ElementID = IE_TPC_REQUEST; + + MakeOutgoingFrame(pFrameBuf, &TempLen, + 1, &ElementID, + 1, &Len, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + + return; +} + +/* + ========================================================================== + Description: + Insert TPC Report IE into frame. + + Parametrs: + 1. frame buffer pointer. + 2. frame length. + 3. Transmit Power. + 4. Link Margin. + + Return : None. + ========================================================================== + */ +VOID InsertTpcReportIE( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN UINT8 TxPwr, + IN UINT8 LinkMargin) +{ + ULONG TempLen; + ULONG Len = sizeof(TPC_REPORT_INFO); + UINT8 ElementID = IE_TPC_REPORT; + TPC_REPORT_INFO TpcReportIE; + + TpcReportIE.TxPwr = TxPwr; + TpcReportIE.LinkMargin = LinkMargin; + + MakeOutgoingFrame(pFrameBuf, &TempLen, + 1, &ElementID, + 1, &Len, + Len, &TpcReportIE, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + + + return; +} + +/* + ========================================================================== + Description: + Insert Channel Switch Announcement IE into frame. + + Parametrs: + 1. frame buffer pointer. + 2. frame length. + 3. channel switch announcement mode. + 4. new selected channel. + 5. channel switch announcement count. + + Return : None. + ========================================================================== + */ +static VOID InsertChSwAnnIE( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN UINT8 ChSwMode, + IN UINT8 NewChannel, + IN UINT8 ChSwCnt) +{ + ULONG TempLen; + ULONG Len = sizeof(CH_SW_ANN_INFO); + UINT8 ElementID = IE_CHANNEL_SWITCH_ANNOUNCEMENT; + CH_SW_ANN_INFO ChSwAnnIE; + + ChSwAnnIE.ChSwMode = ChSwMode; + ChSwAnnIE.Channel = NewChannel; + ChSwAnnIE.ChSwCnt = ChSwCnt; + + MakeOutgoingFrame(pFrameBuf, &TempLen, + 1, &ElementID, + 1, &Len, + Len, &ChSwAnnIE, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + + + return; +} + +/* + ========================================================================== + Description: + Insert Measure Request IE into frame. + + Parametrs: + 1. frame buffer pointer. + 2. frame length. + 3. Measure Token. + 4. Measure Request Mode. + 5. Measure Request Type. + 6. Measure Channel. + 7. Measure Start time. + 8. Measure Duration. + + + Return : None. + ========================================================================== + */ +static VOID InsertMeasureReqIE( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN UINT8 Len, + IN PMEASURE_REQ_INFO pMeasureReqIE) +{ + ULONG TempLen; + UINT8 ElementID = IE_MEASUREMENT_REQUEST; + + MakeOutgoingFrame(pFrameBuf, &TempLen, + 1, &ElementID, + 1, &Len, + sizeof(MEASURE_REQ_INFO), pMeasureReqIE, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + + return; +} + +/* + ========================================================================== + Description: + Insert Measure Report IE into frame. + + Parametrs: + 1. frame buffer pointer. + 2. frame length. + 3. Measure Token. + 4. Measure Request Mode. + 5. Measure Request Type. + 6. Length of Report Infomation + 7. Pointer of Report Infomation Buffer. + + Return : None. + ========================================================================== + */ +static VOID InsertMeasureReportIE( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN PMEASURE_REPORT_INFO pMeasureReportIE, + IN UINT8 ReportLnfoLen, + IN PUINT8 pReportInfo) +{ + ULONG TempLen; + ULONG Len; + UINT8 ElementID = IE_MEASUREMENT_REPORT; + + Len = sizeof(MEASURE_REPORT_INFO) + ReportLnfoLen; + + MakeOutgoingFrame(pFrameBuf, &TempLen, + 1, &ElementID, + 1, &Len, + Len, pMeasureReportIE, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + + if ((ReportLnfoLen > 0) && (pReportInfo != NULL)) + { + MakeOutgoingFrame(pFrameBuf + *pFrameLen, &TempLen, + ReportLnfoLen, pReportInfo, + END_OF_ARGS); + + *pFrameLen = *pFrameLen + TempLen; + } + return; +} + +/* + ========================================================================== + Description: + Prepare Measurement request action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + + Return : None. + ========================================================================== + */ +VOID MakeMeasurementReqFrame( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pOutBuffer, + OUT PULONG pFrameLen, + IN UINT8 TotalLen, + IN UINT8 Category, + IN UINT8 Action, + IN UINT8 MeasureToken, + IN UINT8 MeasureReqMode, + IN UINT8 MeasureReqType, + IN UINT16 NumOfRepetitions) +{ + ULONG TempLen; + MEASURE_REQ_INFO MeasureReqIE; + + InsertActField(pAd, (pOutBuffer + *pFrameLen), pFrameLen, Category, Action); + + // fill Dialog Token + InsertDialogToken(pAd, (pOutBuffer + *pFrameLen), pFrameLen, MeasureToken); + + /* fill Number of repetitions. */ + if (Category == CATEGORY_RM) + { + MakeOutgoingFrame((pOutBuffer+*pFrameLen), &TempLen, + 2, &NumOfRepetitions, + END_OF_ARGS); + + *pFrameLen += TempLen; + } + + // prepare Measurement IE. + NdisZeroMemory(&MeasureReqIE, sizeof(MEASURE_REQ_INFO)); + MeasureReqIE.Token = MeasureToken; + MeasureReqIE.ReqMode.word = MeasureReqMode; + MeasureReqIE.ReqType = MeasureReqType; + InsertMeasureReqIE(pAd, (pOutBuffer+*pFrameLen), pFrameLen, + TotalLen, &MeasureReqIE); + + return; +} + +/* + ========================================================================== + Description: + Prepare Measurement report action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + + Return : None. + ========================================================================== + */ +VOID EnqueueMeasurementRep( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN UINT8 DialogToken, + IN UINT8 MeasureToken, + IN UINT8 MeasureReqMode, + IN UINT8 MeasureReqType, + IN UINT8 ReportInfoLen, + IN PUINT8 pReportInfo) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen; + HEADER_802_11 ActHdr; + MEASURE_REPORT_INFO MeasureRepIE; + + // build action frame header. + MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA, + pAd->CurrentAddress); + + NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__)); + return; + } + NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11)); + FrameLen = sizeof(HEADER_802_11); + + InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_MRP); + + // fill Dialog Token + InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken); + + // prepare Measurement IE. + NdisZeroMemory(&MeasureRepIE, sizeof(MEASURE_REPORT_INFO)); + MeasureRepIE.Token = MeasureToken; + MeasureRepIE.ReportMode = MeasureReqMode; + MeasureRepIE.ReportType = MeasureReqType; + InsertMeasureReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen, &MeasureRepIE, ReportInfoLen, pReportInfo); + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + return; +} + +/* + ========================================================================== + Description: + Prepare TPC Request action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + + Return : None. + ========================================================================== + */ +VOID EnqueueTPCReq( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN UCHAR DialogToken) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen; + + HEADER_802_11 ActHdr; + + // build action frame header. + MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA, + pAd->CurrentAddress); + + NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__)); + return; + } + NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11)); + FrameLen = sizeof(HEADER_802_11); + + InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_TPCRQ); + + // fill Dialog Token + InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken); + + // Insert TPC Request IE. + InsertTpcReqIE(pAd, (pOutBuffer + FrameLen), &FrameLen); + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + return; +} + +/* + ========================================================================== + Description: + Prepare TPC Report action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + + Return : None. + ========================================================================== + */ +VOID EnqueueTPCRep( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN UINT8 DialogToken, + IN UINT8 TxPwr, + IN UINT8 LinkMargin) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen; + + HEADER_802_11 ActHdr; + + // build action frame header. + MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA, + pAd->CurrentAddress); + + NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__)); + return; + } + NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11)); + FrameLen = sizeof(HEADER_802_11); + + InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_TPCRP); + + // fill Dialog Token + InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, DialogToken); + + // Insert TPC Request IE. + InsertTpcReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen, TxPwr, LinkMargin); + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + return; +} + +/* + ========================================================================== + Description: + Prepare Channel Switch Announcement action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + 2. Channel switch announcement mode. + 2. a New selected channel. + + Return : None. + ========================================================================== + */ +VOID EnqueueChSwAnn( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN UINT8 ChSwMode, + IN UINT8 NewCh) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen; + + HEADER_802_11 ActHdr; + + // build action frame header. + MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA, + pAd->CurrentAddress); + + NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__)); + return; + } + NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11)); + FrameLen = sizeof(HEADER_802_11); + + InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_CHANNEL_SWITCH); + + InsertChSwAnnIE(pAd, (pOutBuffer + FrameLen), &FrameLen, ChSwMode, NewCh, 0); + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + return; +} + +static BOOLEAN DfsRequirementCheck( + IN PRTMP_ADAPTER pAd, + IN UINT8 Channel) +{ + BOOLEAN Result = FALSE; + INT i; + + do + { + // check DFS procedure is running. + // make sure DFS procedure won't start twice. + if (pAd->CommonCfg.RadarDetect.RDMode != RD_NORMAL_MODE) + { + Result = FALSE; + break; + } + + // check the new channel carried from Channel Switch Announcemnet is valid. + for (i=0; i<pAd->ChannelListNum; i++) + { + if ((Channel == pAd->ChannelList[i].Channel) + &&(pAd->ChannelList[i].RemainingTimeForUse == 0)) + { + // found radar signal in the channel. the channel can't use at least for 30 minutes. + pAd->ChannelList[i].RemainingTimeForUse = 1800;//30 min = 1800 sec + Result = TRUE; + break; + } + } + } while(FALSE); + + return Result; +} + +VOID NotifyChSwAnnToPeerAPs( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pRA, + IN PUCHAR pTA, + IN UINT8 ChSwMode, + IN UINT8 Channel) +{ +#ifdef WDS_SUPPORT + if (!((pRA[0] & 0xff) == 0xff)) // is pRA a broadcase address. + { + INT i; + // info neighbor APs that Radar signal found throgh WDS link. + for (i = 0; i < MAX_WDS_ENTRY; i++) + { + if (ValidWdsEntry(pAd, i)) + { + PUCHAR pDA = pAd->WdsTab.WdsEntry[i].PeerWdsAddr; + + // DA equal to SA. have no necessary orignal AP which found Radar signal. + if (MAC_ADDR_EQUAL(pTA, pDA)) + continue; + + // send Channel Switch Action frame to info Neighbro APs. + EnqueueChSwAnn(pAd, pDA, ChSwMode, Channel); + } + } + } +#endif // WDS_SUPPORT // +} + +static VOID StartDFSProcedure( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel, + IN UINT8 ChSwMode) +{ + // start DFS procedure + pAd->CommonCfg.Channel = Channel; +#ifdef DOT11_N_SUPPORT + N_ChannelCheck(pAd); +#endif // DOT11_N_SUPPORT // + pAd->CommonCfg.RadarDetect.RDMode = RD_SWITCHING_MODE; + pAd->CommonCfg.RadarDetect.CSCount = 0; +} + +/* + ========================================================================== + Description: + Channel Switch Announcement action frame sanity check. + + Parametrs: + 1. MLME message containing the received frame + 2. message length. + 3. Channel switch announcement infomation buffer. + + + Return : None. + ========================================================================== + */ + +/* + Channel Switch Announcement IE. + +----+-----+-----------+------------+-----------+ + | ID | Len |Ch Sw Mode | New Ch Num | Ch Sw Cnt | + +----+-----+-----------+------------+-----------+ + 1 1 1 1 1 +*/ +static BOOLEAN PeerChSwAnnSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PCH_SW_ANN_INFO pChSwAnnInfo) +{ + PFRAME_802_11 Fr = (PFRAME_802_11)pMsg; + PUCHAR pFramePtr = Fr->Octet; + BOOLEAN result = FALSE; + PEID_STRUCT eid_ptr; + + // skip 802.11 header. + MsgLen -= sizeof(HEADER_802_11); + + // skip category and action code. + pFramePtr += 2; + MsgLen -= 2; + + if (pChSwAnnInfo == NULL) + return result; + + eid_ptr = (PEID_STRUCT)pFramePtr; + while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen)) + { + switch(eid_ptr->Eid) + { + case IE_CHANNEL_SWITCH_ANNOUNCEMENT: + NdisMoveMemory(&pChSwAnnInfo->ChSwMode, eid_ptr->Octet, 1); + NdisMoveMemory(&pChSwAnnInfo->Channel, eid_ptr->Octet + 1, 1); + NdisMoveMemory(&pChSwAnnInfo->ChSwCnt, eid_ptr->Octet + 2, 1); + + result = TRUE; + break; + + default: + break; + } + eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len); + } + + return result; +} + +/* + ========================================================================== + Description: + Measurement request action frame sanity check. + + Parametrs: + 1. MLME message containing the received frame + 2. message length. + 3. Measurement request infomation buffer. + + Return : None. + ========================================================================== + */ +static BOOLEAN PeerMeasureReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PUINT8 pDialogToken, + OUT PMEASURE_REQ_INFO pMeasureReqInfo, + OUT PMEASURE_REQ pMeasureReq) +{ + PFRAME_802_11 Fr = (PFRAME_802_11)pMsg; + PUCHAR pFramePtr = Fr->Octet; + BOOLEAN result = FALSE; + PEID_STRUCT eid_ptr; + PUCHAR ptr; + UINT64 MeasureStartTime; + UINT16 MeasureDuration; + + // skip 802.11 header. + MsgLen -= sizeof(HEADER_802_11); + + // skip category and action code. + pFramePtr += 2; + MsgLen -= 2; + + if (pMeasureReqInfo == NULL) + return result; + + NdisMoveMemory(pDialogToken, pFramePtr, 1); + pFramePtr += 1; + MsgLen -= 1; + + eid_ptr = (PEID_STRUCT)pFramePtr; + while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen)) + { + switch(eid_ptr->Eid) + { + case IE_MEASUREMENT_REQUEST: + NdisMoveMemory(&pMeasureReqInfo->Token, eid_ptr->Octet, 1); + NdisMoveMemory(&pMeasureReqInfo->ReqMode.word, eid_ptr->Octet + 1, 1); + NdisMoveMemory(&pMeasureReqInfo->ReqType, eid_ptr->Octet + 2, 1); + ptr = (PUCHAR)(eid_ptr->Octet + 3); + NdisMoveMemory(&pMeasureReq->ChNum, ptr, 1); + NdisMoveMemory(&MeasureStartTime, ptr + 1, 8); + pMeasureReq->MeasureStartTime = SWAP64(MeasureStartTime); + NdisMoveMemory(&MeasureDuration, ptr + 9, 2); + pMeasureReq->MeasureDuration = SWAP16(MeasureDuration); + + result = TRUE; + break; + + default: + break; + } + eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len); + } + + return result; +} + +/* + ========================================================================== + Description: + Measurement report action frame sanity check. + + Parametrs: + 1. MLME message containing the received frame + 2. message length. + 3. Measurement report infomation buffer. + 4. basic report infomation buffer. + + Return : None. + ========================================================================== + */ + +/* + Measurement Report IE. + +----+-----+-------+-------------+--------------+----------------+ + | ID | Len | Token | Report Mode | Measure Type | Measure Report | + +----+-----+-------+-------------+--------------+----------------+ + 1 1 1 1 1 variable + + Basic Report. + +--------+------------+----------+-----+ + | Ch Num | Start Time | Duration | Map | + +--------+------------+----------+-----+ + 1 8 2 1 + + Map Field Bit Format. + +-----+---------------+---------------------+-------+------------+----------+ + | Bss | OFDM Preamble | Unidentified signal | Radar | Unmeasured | Reserved | + +-----+---------------+---------------------+-------+------------+----------+ + 0 1 2 3 4 5-7 +*/ +static BOOLEAN PeerMeasureReportSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PUINT8 pDialogToken, + OUT PMEASURE_REPORT_INFO pMeasureReportInfo, + OUT PUINT8 pReportBuf) +{ + PFRAME_802_11 Fr = (PFRAME_802_11)pMsg; + PUCHAR pFramePtr = Fr->Octet; + BOOLEAN result = FALSE; + PEID_STRUCT eid_ptr; + PUCHAR ptr; + + // skip 802.11 header. + MsgLen -= sizeof(HEADER_802_11); + + // skip category and action code. + pFramePtr += 2; + MsgLen -= 2; + + if (pMeasureReportInfo == NULL) + return result; + + NdisMoveMemory(pDialogToken, pFramePtr, 1); + pFramePtr += 1; + MsgLen -= 1; + + eid_ptr = (PEID_STRUCT)pFramePtr; + while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen)) + { + switch(eid_ptr->Eid) + { + case IE_MEASUREMENT_REPORT: + NdisMoveMemory(&pMeasureReportInfo->Token, eid_ptr->Octet, 1); + NdisMoveMemory(&pMeasureReportInfo->ReportMode, eid_ptr->Octet + 1, 1); + NdisMoveMemory(&pMeasureReportInfo->ReportType, eid_ptr->Octet + 2, 1); + if (pMeasureReportInfo->ReportType == RM_BASIC) + { + PMEASURE_BASIC_REPORT pReport = (PMEASURE_BASIC_REPORT)pReportBuf; + ptr = (PUCHAR)(eid_ptr->Octet + 3); + NdisMoveMemory(&pReport->ChNum, ptr, 1); + NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8); + NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2); + NdisMoveMemory(&pReport->Map, ptr + 11, 1); + + } + else if (pMeasureReportInfo->ReportType == RM_CCA) + { + PMEASURE_CCA_REPORT pReport = (PMEASURE_CCA_REPORT)pReportBuf; + ptr = (PUCHAR)(eid_ptr->Octet + 3); + NdisMoveMemory(&pReport->ChNum, ptr, 1); + NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8); + NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2); + NdisMoveMemory(&pReport->CCA_Busy_Fraction, ptr + 11, 1); + + } + else if (pMeasureReportInfo->ReportType == RM_RPI_HISTOGRAM) + { + PMEASURE_RPI_REPORT pReport = (PMEASURE_RPI_REPORT)pReportBuf; + ptr = (PUCHAR)(eid_ptr->Octet + 3); + NdisMoveMemory(&pReport->ChNum, ptr, 1); + NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8); + NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2); + NdisMoveMemory(&pReport->RPI_Density, ptr + 11, 8); + } + result = TRUE; + break; + + default: + break; + } + eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len); + } + + return result; +} + +/* + ========================================================================== + Description: + TPC Request action frame sanity check. + + Parametrs: + 1. MLME message containing the received frame + 2. message length. + 3. Dialog Token. + + Return : None. + ========================================================================== + */ +static BOOLEAN PeerTpcReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PUINT8 pDialogToken) +{ + PFRAME_802_11 Fr = (PFRAME_802_11)pMsg; + PUCHAR pFramePtr = Fr->Octet; + BOOLEAN result = FALSE; + PEID_STRUCT eid_ptr; + + MsgLen -= sizeof(HEADER_802_11); + + // skip category and action code. + pFramePtr += 2; + MsgLen -= 2; + + if (pDialogToken == NULL) + return result; + + NdisMoveMemory(pDialogToken, pFramePtr, 1); + pFramePtr += 1; + MsgLen -= 1; + + eid_ptr = (PEID_STRUCT)pFramePtr; + while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen)) + { + switch(eid_ptr->Eid) + { + case IE_TPC_REQUEST: + result = TRUE; + break; + + default: + break; + } + eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len); + } + + return result; +} + +/* + ========================================================================== + Description: + TPC Report action frame sanity check. + + Parametrs: + 1. MLME message containing the received frame + 2. message length. + 3. Dialog Token. + 4. TPC Report IE. + + Return : None. + ========================================================================== + */ +static BOOLEAN PeerTpcRepSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PUINT8 pDialogToken, + OUT PTPC_REPORT_INFO pTpcRepInfo) +{ + PFRAME_802_11 Fr = (PFRAME_802_11)pMsg; + PUCHAR pFramePtr = Fr->Octet; + BOOLEAN result = FALSE; + PEID_STRUCT eid_ptr; + + MsgLen -= sizeof(HEADER_802_11); + + // skip category and action code. + pFramePtr += 2; + MsgLen -= 2; + + if (pDialogToken == NULL) + return result; + + NdisMoveMemory(pDialogToken, pFramePtr, 1); + pFramePtr += 1; + MsgLen -= 1; + + eid_ptr = (PEID_STRUCT)pFramePtr; + while (((UCHAR*)eid_ptr + eid_ptr->Len + 1) < ((PUCHAR)pFramePtr + MsgLen)) + { + switch(eid_ptr->Eid) + { + case IE_TPC_REPORT: + NdisMoveMemory(&pTpcRepInfo->TxPwr, eid_ptr->Octet, 1); + NdisMoveMemory(&pTpcRepInfo->LinkMargin, eid_ptr->Octet + 1, 1); + result = TRUE; + break; + + default: + break; + } + eid_ptr = (PEID_STRUCT)((UCHAR*)eid_ptr + 2 + eid_ptr->Len); + } + + return result; +} + +/* + ========================================================================== + Description: + Channel Switch Announcement action frame handler. + + Parametrs: + Elme - MLME message containing the received frame + + Return : None. + ========================================================================== + */ +static VOID PeerChSwAnnAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + CH_SW_ANN_INFO ChSwAnnInfo; + PFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg; +#ifdef CONFIG_STA_SUPPORT + UCHAR index = 0, Channel = 0, NewChannel = 0; + ULONG Bssidx = 0; +#endif // CONFIG_STA_SUPPORT // + + NdisZeroMemory(&ChSwAnnInfo, sizeof(CH_SW_ANN_INFO)); + if (! PeerChSwAnnSanity(pAd, Elem->Msg, Elem->MsgLen, &ChSwAnnInfo)) + { + DBGPRINT(RT_DEBUG_TRACE, ("Invalid Channel Switch Action Frame.\n")); + return; + } + + +#ifdef CONFIG_STA_SUPPORT + if (pAd->OpMode == OPMODE_STA) + { + Bssidx = BssTableSearch(&pAd->ScanTab, pFr->Hdr.Addr3, pAd->CommonCfg.Channel); + if (Bssidx == BSS_NOT_FOUND) + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerChSwAnnAction - Bssidx is not found\n")); + return; + } + + DBGPRINT(RT_DEBUG_TRACE, ("\n****Bssidx is %d, Channel = %d\n", index, pAd->ScanTab.BssEntry[Bssidx].Channel)); + hex_dump("SSID",pAd->ScanTab.BssEntry[Bssidx].Bssid ,6); + + Channel = pAd->CommonCfg.Channel; + NewChannel = ChSwAnnInfo.Channel; + + if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0) && (Channel != NewChannel)) + { + // Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection). + // In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results. + AsicSwitchChannel(pAd, 1, FALSE); + AsicLockChannel(pAd, 1); + LinkDown(pAd, FALSE); + MlmeQueueInit(&pAd->Mlme.Queue); + BssTableInit(&pAd->ScanTab); + RTMPusecDelay(1000000); // use delay to prevent STA do reassoc + + // channel sanity check + for (index = 0 ; index < pAd->ChannelListNum; index++) + { + if (pAd->ChannelList[index].Channel == NewChannel) + { + pAd->ScanTab.BssEntry[Bssidx].Channel = NewChannel; + pAd->CommonCfg.Channel = NewChannel; + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + DBGPRINT(RT_DEBUG_TRACE, ("&&&&&&&&&&&&&&&&PeerChSwAnnAction - STA receive channel switch announcement IE (New Channel =%d)\n", NewChannel)); + break; + } + } + + if (index >= pAd->ChannelListNum) + { + DBGPRINT_ERR(("&&&&&&&&&&&&&&&&&&&&&&&&&&PeerChSwAnnAction(can not find New Channel=%d in ChannelList[%d]\n", pAd->CommonCfg.Channel, pAd->ChannelListNum)); + } + } + } +#endif // CONFIG_STA_SUPPORT // + + return; +} + + +/* + ========================================================================== + Description: + Measurement Request action frame handler. + + Parametrs: + Elme - MLME message containing the received frame + + Return : None. + ========================================================================== + */ +static VOID PeerMeasureReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg; + UINT8 DialogToken; + MEASURE_REQ_INFO MeasureReqInfo; + MEASURE_REQ MeasureReq; + MEASURE_REPORT_MODE ReportMode; + + if(PeerMeasureReqSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &MeasureReqInfo, &MeasureReq)) + { + ReportMode.word = 0; + ReportMode.field.Incapable = 1; + EnqueueMeasurementRep(pAd, pFr->Hdr.Addr2, DialogToken, MeasureReqInfo.Token, ReportMode.word, MeasureReqInfo.ReqType, 0, NULL); + } + + return; +} + +/* + ========================================================================== + Description: + Measurement Report action frame handler. + + Parametrs: + Elme - MLME message containing the received frame + + Return : None. + ========================================================================== + */ +static VOID PeerMeasureReportAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + MEASURE_REPORT_INFO MeasureReportInfo; + PFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg; + UINT8 DialogToken; + PUINT8 pMeasureReportInfo; + +// if (pAd->CommonCfg.bIEEE80211H != TRUE) +// return; + + if ((pMeasureReportInfo = kmalloc(sizeof(MEASURE_RPI_REPORT), GFP_ATOMIC)) == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s unable to alloc memory for measure report buffer (size=%d).\n", __FUNCTION__, sizeof(MEASURE_RPI_REPORT))); + return; + } + + NdisZeroMemory(&MeasureReportInfo, sizeof(MEASURE_REPORT_INFO)); + NdisZeroMemory(pMeasureReportInfo, sizeof(MEASURE_RPI_REPORT)); + if (PeerMeasureReportSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &MeasureReportInfo, pMeasureReportInfo)) + { + do { + PMEASURE_REQ_ENTRY pEntry = NULL; + + // Not a autonomous measure report. + // check the dialog token field. drop it if the dialog token doesn't match. + if ((DialogToken != 0) + && ((pEntry = MeasureReqLookUp(pAd, DialogToken)) == NULL)) + break; + + if (pEntry != NULL) + MeasureReqDelete(pAd, pEntry->DialogToken); + + if (MeasureReportInfo.ReportType == RM_BASIC) + { + PMEASURE_BASIC_REPORT pBasicReport = (PMEASURE_BASIC_REPORT)pMeasureReportInfo; + if ((pBasicReport->Map.field.Radar) + && (DfsRequirementCheck(pAd, pBasicReport->ChNum) == TRUE)) + { + NotifyChSwAnnToPeerAPs(pAd, pFr->Hdr.Addr1, pFr->Hdr.Addr2, 1, pBasicReport->ChNum); + StartDFSProcedure(pAd, pBasicReport->ChNum, 1); + } + } + } while (FALSE); + } + else + DBGPRINT(RT_DEBUG_TRACE, ("Invalid Measurement Report Frame.\n")); + + kfree(pMeasureReportInfo); + + return; +} + +/* + ========================================================================== + Description: + TPC Request action frame handler. + + Parametrs: + Elme - MLME message containing the received frame + + Return : None. + ========================================================================== + */ +static VOID PeerTpcReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg; + PUCHAR pFramePtr = pFr->Octet; + UINT8 DialogToken; + UINT8 TxPwr = GetCurTxPwr(pAd, Elem->Wcid); + UINT8 LinkMargin = 0; + CHAR RealRssi; + + // link margin: Ratio of the received signal power to the minimum desired by the station (STA). The + // STA may incorporate rate information and channel conditions, including interference, into its computation + // of link margin. + + RealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), + ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), + ConvertToRssi(pAd, Elem->Rssi2, RSSI_2)); + + // skip Category and action code. + pFramePtr += 2; + + // Dialog token. + NdisMoveMemory(&DialogToken, pFramePtr, 1); + + LinkMargin = (RealRssi / MIN_RCV_PWR); + if (PeerTpcReqSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken)) + EnqueueTPCRep(pAd, pFr->Hdr.Addr2, DialogToken, TxPwr, LinkMargin); + + return; +} + +/* + ========================================================================== + Description: + TPC Report action frame handler. + + Parametrs: + Elme - MLME message containing the received frame + + Return : None. + ========================================================================== + */ +static VOID PeerTpcRepAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UINT8 DialogToken; + TPC_REPORT_INFO TpcRepInfo; + PTPC_REQ_ENTRY pEntry = NULL; + + NdisZeroMemory(&TpcRepInfo, sizeof(TPC_REPORT_INFO)); + if (PeerTpcRepSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &TpcRepInfo)) + { + if ((pEntry = TpcReqLookUp(pAd, DialogToken)) != NULL) + { + TpcReqDelete(pAd, pEntry->DialogToken); + DBGPRINT(RT_DEBUG_TRACE, ("%s: DialogToken=%x, TxPwr=%d, LinkMargin=%d\n", + __FUNCTION__, DialogToken, TpcRepInfo.TxPwr, TpcRepInfo.LinkMargin)); + } + } + + return; +} + +/* + ========================================================================== + Description: + Spectrun action frames Handler such as channel switch annoucement, + measurement report, measurement request actions frames. + + Parametrs: + Elme - MLME message containing the received frame + + Return : None. + ========================================================================== + */ +VOID PeerSpectrumAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + + UCHAR Action = Elem->Msg[LENGTH_802_11+1]; + + if (pAd->CommonCfg.bIEEE80211H != TRUE) + return; + + switch(Action) + { + case SPEC_MRQ: + // current rt2860 unable do such measure specified in Measurement Request. + // reject all measurement request. + PeerMeasureReqAction(pAd, Elem); + break; + + case SPEC_MRP: + PeerMeasureReportAction(pAd, Elem); + break; + + case SPEC_TPCRQ: + PeerTpcReqAction(pAd, Elem); + break; + + case SPEC_TPCRP: + PeerTpcRepAction(pAd, Elem); + break; + + case SPEC_CHANNEL_SWITCH: + +#ifdef DOT11N_DRAFT3 + { + SEC_CHA_OFFSET_IE Secondary; + CHA_SWITCH_ANNOUNCE_IE ChannelSwitch; + + // 802.11h only has Channel Switch Announcement IE. + RTMPMoveMemory(&ChannelSwitch, &Elem->Msg[LENGTH_802_11+4], sizeof (CHA_SWITCH_ANNOUNCE_IE)); + + // 802.11n D3.03 adds secondary channel offset element in the end. + if (Elem->MsgLen == (LENGTH_802_11 + 2 + sizeof (CHA_SWITCH_ANNOUNCE_IE) + sizeof (SEC_CHA_OFFSET_IE))) + { + RTMPMoveMemory(&Secondary, &Elem->Msg[LENGTH_802_11+9], sizeof (SEC_CHA_OFFSET_IE)); + } + else + { + Secondary.SecondaryChannelOffset = 0; + } + + if ((Elem->Msg[LENGTH_802_11+2] == IE_CHANNEL_SWITCH_ANNOUNCEMENT) && (Elem->Msg[LENGTH_802_11+3] == 3)) + { + ChannelSwitchAction(pAd, Elem->Wcid, ChannelSwitch.NewChannel, Secondary.SecondaryChannelOffset); + } + } +#endif // DOT11N_DRAFT3 // + + PeerChSwAnnAction(pAd, Elem); + break; + } + + return; +} + +/* + ========================================================================== + Description: + + Parametrs: + + Return : None. + ========================================================================== + */ +INT Set_MeasureReq_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT Aid = 1; + UINT ArgIdx; + PSTRING thisChar; + + MEASURE_REQ_MODE MeasureReqMode; + UINT8 MeasureReqToken = RandomByte(pAd); + UINT8 MeasureReqType = RM_BASIC; + UINT8 MeasureCh = 1; + UINT64 MeasureStartTime = GetCurrentTimeStamp(pAd); + MEASURE_REQ MeasureReq; + UINT8 TotalLen; + + HEADER_802_11 ActHdr; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen; + + NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __FUNCTION__)); + goto END_OF_MEASURE_REQ; + } + + ArgIdx = 1; + while ((thisChar = strsep((char **)&arg, "-")) != NULL) + { + switch(ArgIdx) + { + case 1: // Aid. + Aid = (UINT8) simple_strtol(thisChar, 0, 16); + break; + + case 2: // Measurement Request Type. + MeasureReqType = simple_strtol(thisChar, 0, 16); + if (MeasureReqType > 3) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: unknow MeasureReqType(%d)\n", __FUNCTION__, MeasureReqType)); + goto END_OF_MEASURE_REQ; + } + break; + + case 3: // Measurement channel. + MeasureCh = (UINT8) simple_strtol(thisChar, 0, 16); + break; + } + ArgIdx++; + } + + DBGPRINT(RT_DEBUG_TRACE, ("%s::Aid = %d, MeasureReqType=%d MeasureCh=%d\n", __FUNCTION__, Aid, MeasureReqType, MeasureCh)); + if (!VALID_WCID(Aid)) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: unknow sta of Aid(%d)\n", __FUNCTION__, Aid)); + goto END_OF_MEASURE_REQ; + } + + MeasureReqMode.word = 0; + MeasureReqMode.field.Enable = 1; + + MeasureReqInsert(pAd, MeasureReqToken); + + // build action frame header. + MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pAd->MacTab.Content[Aid].Addr, + pAd->CurrentAddress); + + NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11)); + FrameLen = sizeof(HEADER_802_11); + + TotalLen = sizeof(MEASURE_REQ_INFO) + sizeof(MEASURE_REQ); + + MakeMeasurementReqFrame(pAd, pOutBuffer, &FrameLen, + sizeof(MEASURE_REQ_INFO), CATEGORY_RM, RM_BASIC, + MeasureReqToken, MeasureReqMode.word, + MeasureReqType, 1); + + MeasureReq.ChNum = MeasureCh; + MeasureReq.MeasureStartTime = cpu2le64(MeasureStartTime); + MeasureReq.MeasureDuration = cpu2le16(2000); + + { + ULONG TempLen; + MakeOutgoingFrame( pOutBuffer+FrameLen, &TempLen, + sizeof(MEASURE_REQ), &MeasureReq, + END_OF_ARGS); + FrameLen += TempLen; + } + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, (UINT)FrameLen); + +END_OF_MEASURE_REQ: + MlmeFreeMemory(pAd, pOutBuffer); + + return TRUE; +} + +INT Set_TpcReq_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT Aid; + + UINT8 TpcReqToken = RandomByte(pAd); + + Aid = (UINT) simple_strtol(arg, 0, 16); + + DBGPRINT(RT_DEBUG_TRACE, ("%s::Aid = %d\n", __FUNCTION__, Aid)); + if (!VALID_WCID(Aid)) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s: unknow sta of Aid(%d)\n", __FUNCTION__, Aid)); + return TRUE; + } + + TpcReqInsert(pAd, TpcReqToken); + + EnqueueTPCReq(pAd, pAd->MacTab.Content[Aid].Addr, TpcReqToken); + + return TRUE; +} + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/vr_ikans.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/vr_ikans.c new file mode 100644 index 000000000..ef030e882 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/common/vr_ikans.c @@ -0,0 +1,335 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + vr_ikans.c + + Abstract: + Only for IKANOS Vx160 or Vx180 platform. + + The fast path will check IP address/ IP port, etc. NOT only check MAC. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Sample Lin 01-28-2008 Created + + */ + +#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 void *pRxParam, + IN struct sk_buff *pSkb, + IN UINT32 Length) +{ + apPreHeader_t *apBuf; + + + apBuf = (apPreHeader_t *)(translateMbuf2Apbuf(pSkb, 0)); + + apBuf->flags1 = 1 << AP_FLAG1_IS_ETH_BIT; + apBuf->specInfoElement = RTMP_GET_PACKET_NET_DEVICE(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 */ + + +/* +======================================================================== +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_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + IfIdx = MAIN_MBSSID; + } +#endif // CONFIG_STA_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 */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/dkms.conf b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/dkms.conf new file mode 100644 index 000000000..41e9a05e2 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/dkms.conf @@ -0,0 +1,11 @@ +MAKE="make all" +INCLUDEDIR="/lib/modules/$kernelver/build/include" +DEST_MODULE_LOCATION="/kernel/drivers/net/wireless/" +BUILT_MODULE_NAME="rt3562sta" +BUILT_MODULE_LOCATION="os/linux/" +PACKAGE_NAME="lepregao712010" +PACKAGE_VERSION="2.3.0.0-Alpha-v2" +REMAKE_INITRD="yes" +MODULE_NAME="rt3562sta.o" +CLEAN="make clean" +AUTOINSTALL=yes diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/action.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/action.h new file mode 100644 index 000000000..a9b50844b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/action.h @@ -0,0 +1,68 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + aironet.h + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs + Paul Lin 04-06-15 Initial +*/ + +#ifndef __ACTION_H__ +#define __ACTION_H__ + +typedef struct GNU_PACKED __HT_INFO_OCTET +{ +#ifdef RT_BIG_ENDIAN + UCHAR Reserved:5; + UCHAR STA_Channel_Width:1; + UCHAR Forty_MHz_Intolerant:1; + UCHAR Request:1; +#else + UCHAR Request:1; + UCHAR Forty_MHz_Intolerant:1; + UCHAR STA_Channel_Width:1; + UCHAR Reserved:5; +#endif +} HT_INFORMATION_OCTET; + + +typedef struct GNU_PACKED __FRAME_HT_INFO +{ + HEADER_802_11 Hdr; + UCHAR Category; + UCHAR Action; + HT_INFORMATION_OCTET HT_Info; +} FRAME_HT_INFO, *PFRAME_HT_INFO; + +#endif /* __ACTION_H__ */ + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/ap.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/ap.h new file mode 100644 index 000000000..72b79f592 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/ap.h @@ -0,0 +1,533 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + ap.h + + Abstract: + Miniport generic portion header file + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Paul Lin 08-01-2002 created + James Tan 09-06-2002 modified (Revise NTCRegTable) + John Chang 12-22-2004 modified for RT2561/2661. merge with STA driver +*/ +#ifndef __AP_H__ +#define __AP_H__ + + +// ============================================================= +// Function Prototypes +// ============================================================= + +// ap_data.c + +BOOLEAN APBridgeToWirelessSta( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHeader, + IN UINT HdrLen, + IN PUCHAR pData, + IN UINT DataLen, + IN ULONG fromwdsidx); + +VOID RTMP_BASetup( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pMacEntry, + IN UINT8 UserPriority); + +VOID APSendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET ppPacketArray, + IN UINT NumberOfPackets); + +NDIS_STATUS APSendPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket); + + +NDIS_STATUS APHardTransmit( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN UCHAR QueIdx); + +VOID APRxEAPOLFrameIndicate( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); + +NDIS_STATUS APCheckRxError( + IN PRTMP_ADAPTER pAd, + IN PRT28XX_RXD_STRUC pRxD, + IN UCHAR Wcid); + +BOOLEAN APCheckClass2Class3Error( + IN PRTMP_ADAPTER pAd, + IN ULONG Wcid, + IN PHEADER_802_11 pHeader); + +VOID APHandleRxPsPoll( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN USHORT Aid, + IN BOOLEAN isActive); + +VOID RTMPDescriptorEndianChange( + IN PUCHAR pData, + IN ULONG DescriptorType); + +VOID RTMPFrameEndianChange( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pData, + IN ULONG Dir, + IN BOOLEAN FromRxDoneInt); + +// ap_assoc.c + +VOID APAssocStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID APPeerAssocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APPeerReassocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APPeerDisassocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MbssKickOutStas( + IN PRTMP_ADAPTER pAd, + IN INT apidx, + IN USHORT Reason); + +VOID APMlmeKickOutSta( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pStaAddr, + IN UCHAR Wcid, + IN USHORT Reason); + +VOID APMlmeDisassocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APCls3errAction( + IN PRTMP_ADAPTER pAd, + IN ULONG Wcid, + IN PHEADER_802_11 pHeader); + + +USHORT APBuildAssociation( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN USHORT CapabilityInfo, + IN UCHAR MaxSupportedRateIn500Kbps, + IN UCHAR *RSN, + IN UCHAR *pRSNLen, + IN BOOLEAN bWmmCapable, + IN ULONG RalinkIe, + IN EXT_CAP_INFO_ELEMENT ExtCapInfo, + IN HT_CAPABILITY_IE *pHtCapability, + IN UCHAR HtCapabilityLen, + OUT USHORT *pAid); + +/* +VOID RTMPAddClientSec( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIdx, + IN UCHAR KeyIdx, + IN UCHAR CipherAlg, + IN PUCHAR pKey, + IN PUCHAR pTxMic, + IN PUCHAR pRxMic, + IN MAC_TABLE_ENTRY *pEntry); +*/ + +// ap_auth.c + +void APAuthStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID APCls2errAction( + IN PRTMP_ADAPTER pAd, + IN ULONG Wcid, + IN PHEADER_802_11 pHeader); + +// ap_connect.c + + +VOID APMakeBssBeacon( + IN PRTMP_ADAPTER pAd, + IN INT apidx); + +VOID APUpdateBeaconFrame( + IN PRTMP_ADAPTER pAd, + IN INT apidx); + +VOID APMakeAllBssBeacon( + IN PRTMP_ADAPTER pAd); + +VOID APUpdateAllBeaconFrame( + IN PRTMP_ADAPTER pAd); + + +// ap_sync.c + +VOID APSyncStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID APScanTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID APInvalidStateWhenScan( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APScanTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APPeerProbeReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APPeerBeaconAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APMlmeScanReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APPeerBeaconAtScanAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID APScanCnclAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID ApSiteSurvey( + IN PRTMP_ADAPTER pAd, + IN PNDIS_802_11_SSID pSsid, + IN UCHAR ScanType); + +VOID SupportRate( + IN PUCHAR SupRate, + IN UCHAR SupRateLen, + IN PUCHAR ExtRate, + IN UCHAR ExtRateLen, + OUT PUCHAR *Rates, + OUT PUCHAR RatesLen, + OUT PUCHAR pMaxSupportRate); + + +BOOLEAN ApScanRunning( + IN PRTMP_ADAPTER pAd); + +#ifdef DOT11N_DRAFT3 +VOID APOverlappingBSSScan( + IN RTMP_ADAPTER *pAd); + +INT GetBssCoexEffectedChRange( + IN RTMP_ADAPTER *pAd, + IN BSS_COEX_CH_RANGE *pCoexChRange); + +#endif // DOT11N_DRAFT3 // + +// ap_wpa.c +VOID WpaStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]); + +// ap_mlme.c +VOID APMlmePeriodicExec( + IN PRTMP_ADAPTER pAd); + +VOID APMlmeSelectTxRateTable( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PUCHAR *ppTable, + IN PUCHAR pTableSize, + IN PUCHAR pInitTxRateIdx); + +VOID APMlmeSetTxRate( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PRTMP_TX_RATE_SWITCH pTxRate); + +VOID APMlmeDynamicTxRateSwitching( + IN PRTMP_ADAPTER pAd); + +VOID APQuickResponeForRateUpExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +BOOLEAN APMsgTypeSubst( + IN PRTMP_ADAPTER pAd, + IN PFRAME_802_11 pFrame, + OUT INT *Machine, + OUT INT *MsgType); + +VOID APQuickResponeForRateUpExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + + + +VOID RTMPSetPiggyBack( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bPiggyBack); + +VOID APAsicEvaluateRxAnt( + IN PRTMP_ADAPTER pAd); + +VOID APAsicRxAntEvalTimeout( + IN PRTMP_ADAPTER pAd); + +// ap.c + +VOID APSwitchChannel( + IN PRTMP_ADAPTER pAd, + IN INT Channel); + +NDIS_STATUS APInitialize( + IN PRTMP_ADAPTER pAd); + +VOID APShutdown( + IN PRTMP_ADAPTER pAd); + +VOID APStartUp( + IN PRTMP_ADAPTER pAd); + +VOID APStop( + IN PRTMP_ADAPTER pAd); + +VOID APCleanupPsQueue( + IN PRTMP_ADAPTER pAd, + IN PQUEUE_HEADER pQueue); + +VOID MacTableReset( + IN PRTMP_ADAPTER pAd); + +MAC_TABLE_ENTRY *MacTableInsertEntry( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN UCHAR apidx, + IN BOOLEAN CleanAll); + +BOOLEAN MacTableDeleteEntry( + IN PRTMP_ADAPTER pAd, + IN USHORT wcid, + IN PUCHAR pAddr); + +MAC_TABLE_ENTRY *MacTableLookup( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr); + +VOID MacTableMaintenance( + IN PRTMP_ADAPTER pAd); + +UINT32 MacTableAssocStaNumGet( + IN PRTMP_ADAPTER pAd); + +MAC_TABLE_ENTRY *APSsPsInquiry( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + OUT SST *Sst, + OUT USHORT *Aid, + OUT UCHAR *PsMode, + OUT UCHAR *Rate); + +BOOLEAN APPsIndicate( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN ULONG Wcid, + IN UCHAR Psm); + +#ifdef SYSTEM_LOG_SUPPORT +VOID ApLogEvent( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN USHORT Event); +#else +#define ApLogEvent(_pAd, _pAddr, _Event) +#endif // SYSTEM_LOG_SUPPORT // + +#ifdef DOT11_N_SUPPORT +VOID APUpdateOperationMode( + IN PRTMP_ADAPTER pAd); +#endif // DOT11_N_SUPPORT // + +VOID APUpdateCapabilityAndErpIe( + IN PRTMP_ADAPTER pAd); + +BOOLEAN ApCheckAccessControlList( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN UCHAR Apidx); + +VOID ApUpdateAccessControlList( + IN PRTMP_ADAPTER pAd, + IN UCHAR Apidx); + +VOID ApEnqueueNullFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN UCHAR TxRate, + IN UCHAR PID, + IN UCHAR apidx, + IN BOOLEAN bQosNull, + IN BOOLEAN bEOSP, + IN UCHAR OldUP); + +VOID ApSendFrame( + IN PRTMP_ADAPTER pAd, + IN PVOID pBuffer, + IN ULONG Length, + IN UCHAR TxRate, + IN UCHAR PID); + +VOID ApEnqueueAckFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN UCHAR TxRate, + IN UCHAR apidx); + +// ap_sanity.c + + +BOOLEAN PeerAssocReqCmmSanity( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN isRessoc, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT USHORT *pCapabilityInfo, + OUT USHORT *pListenInterval, + OUT PUCHAR pApAddr, + OUT UCHAR *pSsidLen, + OUT char *Ssid, + OUT UCHAR *pRatesLen, + OUT UCHAR Rates[], + OUT UCHAR *RSN, + OUT UCHAR *pRSNLen, + OUT BOOLEAN *pbWmmCapable, + OUT ULONG *pRalinkIe, + OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo, + OUT UCHAR *pHtCapabilityLen, + OUT HT_CAPABILITY_IE *pHtCapability); + + +BOOLEAN PeerDisassocReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT UINT16 *SeqNum, + OUT USHORT *Reason); + +BOOLEAN PeerDeauthReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT UINT16 *SeqNum, + OUT USHORT *Reason); + +BOOLEAN APPeerAuthSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr1, + OUT PUCHAR pAddr2, + OUT USHORT *Alg, + OUT USHORT *Seq, + OUT USHORT *Status, + OUT CHAR *ChlgText + ); + + +BOOLEAN APPeerBeaconAndProbeRspSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT PUCHAR pBssid, + OUT CHAR Ssid[], + OUT UCHAR *SsidLen, + OUT UCHAR *BssType, + OUT USHORT *BeaconPeriod, + OUT UCHAR *Channel, + OUT LARGE_INTEGER *Timestamp, + OUT USHORT *CapabilityInfo, + OUT UCHAR Rate[], + OUT UCHAR *RateLen, + OUT BOOLEAN *ExtendedRateIeExist, + OUT UCHAR *Erp); + +/* ap_cfg.h */ +INT Set_OwnIPAddr_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_EAPIfName_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_PreAuthIfName_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#ifdef DOT11_N_SUPPORT +#ifdef GREENAP_SUPPORT +VOID EnableAPMIMOPS( + IN PRTMP_ADAPTER pAd); + +VOID DisableAPMIMOPS( + IN PRTMP_ADAPTER pAd); +#endif // GREENAP_SUPPORT // +#endif // DOT11_N_SUPPORT // +#endif // __AP_H__ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/cfg80211.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/cfg80211.h new file mode 100644 index 000000000..c6293c313 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/cfg80211.h @@ -0,0 +1,265 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + +/**************************************************************************** + + Abstract: + + All MAC80211/CFG80211 Related Structure & Definition. + +***************************************************************************/ + +#ifdef RT_CFG80211_SUPPORT + +#include <linux/ieee80211.h> + + +/* +======================================================================== +Routine Description: + Register MAC80211 Module. + +Arguments: + pAdCB - WLAN control block pointer + pDev - Generic device interface + pNetDev - Network device + +Return Value: + NONE + +Note: + pDev != pNetDev + #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev)) + + Can not use pNetDev to replace pDev; Or kernel panic. +======================================================================== +*/ +VOID CFG80211_Register( + IN VOID *pAdCB, + IN struct device *pDev, + IN struct net_device *pNetDev); + +/* +======================================================================== +Routine Description: + UnRegister MAC80211 Module. + +Arguments: + pAd - WLAN control block pointer + pNetDev - Network device + +Return Value: + NONE + +Note: +======================================================================== +*/ +VOID CFG80211_UnRegister( + IN PRTMP_ADAPTER pAd, + IN struct net_device *pNetDev); + +/* +======================================================================== +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); + +/* +======================================================================== +Routine Description: + Hint to the wireless core a regulatory domain from driver. + +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_RegHint( + IN VOID *pAdCB, + IN UCHAR *pCountryIe, + IN ULONG CountryIeLen); + +/* +======================================================================== +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: +======================================================================== +*/ +VOID CFG80211_RegHint11D( + IN VOID *pAdCB, + IN UCHAR *pCountryIe, + IN ULONG CountryIeLen); + +/* +======================================================================== +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. +======================================================================== +*/ +VOID CFG80211_RegRuleApply( + IN VOID *pAdCB, + IN struct wiphy *pWiphy, + IN UCHAR *pAlpha2); + +/* +======================================================================== +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, + IN INT32 MemFlag); + +/* +======================================================================== +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); + +/* +======================================================================== +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); + +/* +======================================================================== +Routine Description: + Inform CFG80211 about association status. + +Arguments: + pAd - 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); + +#endif // RT_CFG80211_SUPPORT // + +/* End of cfg80211.h */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/cfg80211extr.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/cfg80211extr.h new file mode 100644 index 000000000..2a0697dd0 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/cfg80211extr.h @@ -0,0 +1,156 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + +/**************************************************************************** + + Abstract: + + All MAC80211/CFG80211 Function Prototype. + +***************************************************************************/ + +#ifdef RT_CFG80211_SUPPORT + + +#define RT_CFG80211_API_INIT(__pAd) \ + __pAd->CFG80211_BeaconCountryRegionParse = CFG80211_BeaconCountryRegionParse;\ + __pAd->CFG80211_RegHint = CFG80211_RegHint; \ + __pAd->CFG80211_RegHint11D = CFG80211_RegHint11D; \ + __pAd->CFG80211_RegRuleApply = CFG80211_RegRuleApply; \ + __pAd->CFG80211_Scaning = CFG80211_Scaning; \ + __pAd->CFG80211_ScanEnd = CFG80211_ScanEnd; \ + __pAd->CFG80211_SupBandReInit = CFG80211_SupBandReInit; \ + __pAd->CFG80211_ConnectResultInform = CFG80211_ConnectResultInform + +#define RT_CFG80211_REGISTER(__pAd, __pDev, __pNetDev) \ +do { \ + if (__pAd->CFG80211_Register != NULL) \ + __pAd->CFG80211_Register((VOID *)__pAd, __pDev, __pNetDev); \ +} while(0); + +#define RT_CFG80211_BEACON_CR_PARSE(__pAd, __pVIE, __LenVIE) \ +do { \ + if ((__pAd->pCfg80211_CB != NULL) && \ + (__pAd->CFG80211_BeaconCountryRegionParse != NULL)) \ + __pAd->CFG80211_BeaconCountryRegionParse((VOID *)__pAd, __pVIE, __LenVIE);\ +} while(0); + +#define RT_CFG80211_CRDA_REG_HINT(__pAd, __pCountryIe, __CountryIeLen) \ +do { \ + if ((__pAd->pCfg80211_CB != NULL) && \ + (__pAd->CFG80211_RegHint != NULL)) \ + __pAd->CFG80211_RegHint((VOID *)__pAd, __pCountryIe, __CountryIeLen); \ +} while(0); + +#define RT_CFG80211_CRDA_REG_HINT11D(__pAd, __pCountryIe, __CountryIeLen) \ +do { \ + if ((__pAd->pCfg80211_CB != NULL) && \ + (__pAd->CFG80211_RegHint11D != NULL)) \ + __pAd->CFG80211_RegHint11D((VOID *)__pAd, __pCountryIe, __CountryIeLen);\ +} while(0); + +#define RT_CFG80211_CRDA_REG_RULE_APPLY(__pAd) \ +do { \ + if ((__pAd->pCfg80211_CB != NULL) && \ + (__pAd->CFG80211_RegHint != NULL)) \ + __pAd->CFG80211_RegRuleApply((VOID *)__pAd, NULL, __pAd->Cfg80211_Alpha2);\ +} while(0); + +#define RT_CFG80211_SCANNING_INFORM(__pAd, __BssIdx, __ChanId, __pFrame, \ + __FrameLen, __RSSI, __MemFlag) \ +do { \ + if ((__pAd->pCfg80211_CB != NULL) && \ + (__pAd->CFG80211_Scaning != NULL)) \ + __pAd->CFG80211_Scaning((VOID *)__pAd, __BssIdx, __ChanId, __pFrame, \ + __FrameLen, __RSSI, __MemFlag); \ +} while(0); + +#define RT_CFG80211_SCAN_END(__pAd, __FlgIsAborted) \ +do { \ + if ((__pAd->pCfg80211_CB != NULL) && \ + (__pAd->CFG80211_ScanEnd != NULL)) \ + __pAd->CFG80211_ScanEnd((VOID *)__pAd, __FlgIsAborted); \ +} while(0); + +#define RT_CFG80211_REINIT(__pAd) \ +do { \ + if ((__pAd->pCfg80211_CB != NULL) && \ + (__pAd->CFG80211_SupBandReInit != NULL)) \ + __pAd->CFG80211_SupBandReInit((VOID *)__pAd); \ +} while(0); + +#define RT_CFG80211_CONN_RESULT_INFORM(__pAd, __pBSSID, __pReqIe, __ReqIeLen, \ + __pRspIe, __RspIeLen, __FlgIsSuccess) \ +do { \ + if ((__pAd->pCfg80211_CB != NULL) && \ + (__pAd->CFG80211_ConnectResultInform != NULL)) \ + __pAd->CFG80211_ConnectResultInform((VOID *)__pAd, __pBSSID, \ + __pReqIe, __ReqIeLen, __pRspIe, __RspIeLen, __FlgIsSuccess); \ +} while(0); + + +#define CFG80211_FUNC_OPS \ + VOID (*CFG80211_BeaconCountryRegionParse)( \ + IN VOID *pAd, \ + IN NDIS_802_11_VARIABLE_IEs *pVIE, \ + IN UINT16 LenVIE); \ + VOID (*CFG80211_RegHint)( \ + IN VOID *pAd, \ + IN UCHAR *pCountryIe, \ + IN ULONG CountryIeLen); \ + VOID (*CFG80211_RegHint11D)( \ + IN VOID *pAd, \ + IN UCHAR *pCountryIe, \ + IN ULONG CountryIeLen); \ + VOID (*CFG80211_RegRuleApply)( \ + IN VOID *pAd, \ + IN struct wiphy *pWiphy, \ + IN UCHAR *pAlpha2); \ + VOID (*CFG80211_Scaning)( \ + IN VOID *pAd, \ + IN UINT32 BssIdx, \ + IN UINT32 ChanId, \ + IN UCHAR *pFrame, \ + IN UINT32 FrameLen, \ + IN INT32 RSSI, \ + IN INT32 MemFlag); \ + VOID (*CFG80211_ScanEnd)( \ + IN VOID *pAd, \ + IN BOOLEAN FlgIsAborted); \ + BOOLEAN (*CFG80211_SupBandReInit)( \ + IN VOID *pAd); \ + VOID (*CFG80211_ConnectResultInform)( \ + IN VOID *pAd, \ + IN UCHAR *pBSSID, \ + IN UCHAR *pReqIe, \ + IN UINT32 ReqIeLen, \ + IN UCHAR *pRspIe, \ + IN UINT32 RspIeLen, \ + IN UCHAR FlgIsSuccess) + +#endif // RT_CFG80211_SUPPORT // + +/* End of cfg80211extr.h */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/mac_pci.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/mac_pci.h new file mode 100644 index 000000000..e020d139b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/mac_pci.h @@ -0,0 +1,465 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + mac_pci.h + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + +#ifndef __MAC_PCI_H__ +#define __MAC_PCI_H__ + +#include "rtmp_type.h" +#include "chip/rtmp_mac.h" +#include "chip/rtmp_phy.h" +#include "rtmp_iface.h" +#include "rtmp_dot11.h" + + +// +// Device ID & Vendor ID related definitions, +// NOTE: you should not add the new VendorID/DeviceID here unless you not sure it belongs to what chip. +// +#define NIC_PCI_VENDOR_ID 0x1814 +#define PCIBUS_INTEL_VENDOR 0x8086 + +#if !defined(PCI_CAP_ID_EXP) +#define PCI_CAP_ID_EXP 0x10 +#endif +#if !defined(PCI_EXP_LNKCTL) +#define PCI_EXP_LNKCTL 0x10 +#endif +#if !defined(PCI_CLASS_BRIDGE_PCI) +#define PCI_CLASS_BRIDGE_PCI 0x0604 +#endif + + + + + +#define TXINFO_SIZE 0 +#define RTMP_PKT_TAIL_PADDING 0 +#define fRTMP_ADAPTER_NEED_STOP_TX 0 + +#define AUX_CTRL 0x10c + +// +// TX descriptor format, Tx ring, Mgmt Ring +// +#ifdef RT_BIG_ENDIAN +typedef struct GNU_PACKED _TXD_STRUC { + // Word 0 + UINT32 SDPtr0; + // Word 1 + UINT32 DMADONE:1; + UINT32 LastSec0:1; + UINT32 SDLen0:14; + UINT32 Burst:1; + UINT32 LastSec1:1; + UINT32 SDLen1:14; + // Word 2 + UINT32 SDPtr1; + // Word 3 + UINT32 ICO:1; + UINT32 UCO:1; + UINT32 TCO:1; + UINT32 rsv:2; + UINT32 QSEL:2; // select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA + UINT32 WIV:1; // Wireless Info Valid. 1 if Driver already fill WI, o if DMA needs to copy WI to correctposition + UINT32 rsv2:24; +} TXD_STRUC, *PTXD_STRUC; +#else +typedef struct GNU_PACKED _TXD_STRUC { + // Word 0 + UINT32 SDPtr0; + // Word 1 + UINT32 SDLen1:14; + UINT32 LastSec1:1; + UINT32 Burst:1; + UINT32 SDLen0:14; + UINT32 LastSec0:1; + UINT32 DMADONE:1; + //Word2 + UINT32 SDPtr1; + //Word3 + UINT32 rsv2:24; + UINT32 WIV:1; // Wireless Info Valid. 1 if Driver already fill WI, o if DMA needs to copy WI to correctposition + UINT32 QSEL:2; // select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA + UINT32 rsv:2; + UINT32 TCO:1; // + UINT32 UCO:1; // + UINT32 ICO:1; // +} TXD_STRUC, *PTXD_STRUC; +#endif + + +// +// Rx descriptor format, Rx Ring +// +#ifdef RT_BIG_ENDIAN +typedef struct GNU_PACKED _RXD_STRUC{ + // Word 0 + UINT32 SDP0; + // Word 1 + UINT32 DDONE:1; + UINT32 LS0:1; + UINT32 SDL0:14; + UINT32 Rsv:2; + UINT32 SDL1:14; + // Word 2 + UINT32 SDP1; + // Word 3 + UINT32 Rsv1:13; + UINT32 PlcpRssil:1;// To be moved + UINT32 PlcpSignal:1; // To be moved + UINT32 Decrypted:1; // this frame is being decrypted. + UINT32 AMPDU:1; + UINT32 L2PAD:1; + UINT32 RSSI:1; + UINT32 HTC:1; + UINT32 AMSDU:1; // rx with 802.3 header, not 802.11 header. obsolete. + UINT32 CipherErr:2; // 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid + UINT32 Crc:1; // 1: CRC error + UINT32 MyBss:1; // 1: this frame belongs to the same BSSID + UINT32 Bcast:1; // 1: this is a broadcast frame + UINT32 Mcast:1; // 1: this is a multicast frame + UINT32 U2M:1; // 1: this RX frame is unicast to me + UINT32 FRAG:1; + UINT32 NULLDATA:1; + UINT32 DATA:1; + UINT32 BA:1; + +} RXD_STRUC, *PRXD_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC; +#else +typedef struct GNU_PACKED _RXD_STRUC{ + // Word 0 + UINT32 SDP0; + // Word 1 + UINT32 SDL1:14; + UINT32 Rsv:2; + UINT32 SDL0:14; + UINT32 LS0:1; + UINT32 DDONE:1; + // Word 2 + UINT32 SDP1; + // Word 3 + UINT32 BA:1; + UINT32 DATA:1; + UINT32 NULLDATA:1; + UINT32 FRAG:1; + UINT32 U2M:1; // 1: this RX frame is unicast to me + UINT32 Mcast:1; // 1: this is a multicast frame + UINT32 Bcast:1; // 1: this is a broadcast frame + UINT32 MyBss:1; // 1: this frame belongs to the same BSSID + UINT32 Crc:1; // 1: CRC error + UINT32 CipherErr:2; // 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid + UINT32 AMSDU:1; // rx with 802.3 header, not 802.11 header. + UINT32 HTC:1; + UINT32 RSSI:1; + UINT32 L2PAD:1; + UINT32 AMPDU:1; + UINT32 Decrypted:1; // this frame is being decrypted. + UINT32 PlcpSignal:1; // To be moved + UINT32 PlcpRssil:1;// To be moved + UINT32 Rsv1:13; +} RXD_STRUC, *PRXD_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC; +#endif + +#ifdef BIG_ENDIAN +typedef union _TX_ATTENUATION_CTRL_STRUC +{ + struct + { + ULONG Reserve1:20; + ULONG PCIE_PHY_TX_ATTEN_EN:1; + ULONG PCIE_PHY_TX_ATTEN_VALUE:3; + ULONG Reserve2:7; + ULONG RF_ISOLATION_ENABLE:1; + } field; + + ULONG word; +} TX_ATTENUATION_CTRL_STRUC, *PTX_ATTENUATION_CTRL_STRUC; +#else +typedef union _TX_ATTENUATION_CTRL_STRUC { + struct + { + ULONG RF_ISOLATION_ENABLE:1; + ULONG Reserve2:7; + ULONG PCIE_PHY_TX_ATTEN_VALUE:3; + ULONG PCIE_PHY_TX_ATTEN_EN:1; + ULONG Reserve1:20; + } field; + + ULONG word; +} TX_ATTENUATION_CTRL_STRUC, *PTX_ATTENUATION_CTRL_STRUC; +#endif +/* ----------------- EEPROM Related MACRO ----------------- */ + +// 8051 firmware image for RT2860 - base address = 0x4000 +#define FIRMWARE_IMAGE_BASE 0x2000 +#define MAX_FIRMWARE_IMAGE_SIZE 0x2000 // 8kbyte + + +/* ----------------- Frimware Related MACRO ----------------- */ +#define RTMP_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen) \ + do{ \ + ULONG _i, _firm; \ + RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x10000); \ + \ + for(_i=0; _i<_FwLen; _i+=4) \ + { \ + _firm = _pFwImage[_i] + \ + (_pFwImage[_i+3] << 24) + \ + (_pFwImage[_i+2] << 16) + \ + (_pFwImage[_i+1] << 8); \ + RTMP_IO_WRITE32(_pAd, FIRMWARE_IMAGE_BASE + _i, _firm); \ + } \ + RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00000); \ + RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00001); \ + \ + /* initialize BBP R/W access agent */ \ + RTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, 0); \ + RTMP_IO_WRITE32(_pAd, H2M_MAILBOX_CSR, 0); \ + }while(0) + + +/* ----------------- TX Related MACRO ----------------- */ +#define RTMP_START_DEQUEUE(pAd, QueIdx, irqFlags) do{}while(0) +#define RTMP_STOP_DEQUEUE(pAd, QueIdx, irqFlags) do{}while(0) + + +#define RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \ + ((freeNum) >= (ULONG)(pTxBlk->TotalFragNum + RTMP_GET_PACKET_FRAGMENTS(pPacket) + 3)) /* rough estimate we will use 3 more descriptor. */ +#define RTMP_RELEASE_DESC_RESOURCE(pAd, QueIdx) \ + do{}while(0) + +#define NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, freeNum, _TxFrameType) \ + (((freeNum != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 0)) || (freeNum<3)) + //(((freeNum) != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 1 /*0*/)) + + +#define HAL_KickOutMgmtTx(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen) \ + RtmpPCIMgmtKickOut(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen) + +#define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) \ + /* RtmpPCI_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)*/ + +#define HAL_WriteTxResource(pAd, pTxBlk,bIsLast, pFreeNumber) \ + RtmpPCI_WriteSingleTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) + +#define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \ + RtmpPCI_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) + +#define HAL_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber) \ + RtmpPCI_WriteMultiTxResource(pAd, pTxBlk, frameNum, pFreeNumber) + +#define HAL_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx) \ + RtmpPCI_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx) + +#define HAL_LastTxIdx(_pAd, _QueIdx,_LastTxIdx) \ + /*RtmpPCIDataLastTxIdx(_pAd, _QueIdx,_LastTxIdx)*/ + +#define HAL_KickOutTx(_pAd, _pTxBlk, _QueIdx) \ + RTMP_IO_WRITE32((_pAd), TX_CTX_IDX0+((_QueIdx)*0x10), (_pAd)->TxRing[(_QueIdx)].TxCpuIdx) +/* RtmpPCIDataKickOut(_pAd, _pTxBlk, _QueIdx)*/ + +#define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen) \ + MiniportMMRequest(_pAd, _QueIdx, _pNullFrame, _frameLen) + +#define GET_TXRING_FREENO(_pAd, _QueIdx) \ + (_pAd->TxRing[_QueIdx].TxSwFreeIdx > _pAd->TxRing[_QueIdx].TxCpuIdx) ? \ + (_pAd->TxRing[_QueIdx].TxSwFreeIdx - _pAd->TxRing[_QueIdx].TxCpuIdx - 1) \ + : \ + (_pAd->TxRing[_QueIdx].TxSwFreeIdx + TX_RING_SIZE - _pAd->TxRing[_QueIdx].TxCpuIdx - 1); + + +#define GET_MGMTRING_FREENO(_pAd) \ + (_pAd->MgmtRing.TxSwFreeIdx > _pAd->MgmtRing.TxCpuIdx) ? \ + (_pAd->MgmtRing.TxSwFreeIdx - _pAd->MgmtRing.TxCpuIdx - 1) \ + : \ + (_pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - _pAd->MgmtRing.TxCpuIdx - 1); + + +/* ----------------- RX Related MACRO ----------------- */ + + +/* ----------------- ASIC Related MACRO ----------------- */ +// reset MAC of a station entry to 0x000000000000 +#define RTMP_STA_ENTRY_MAC_RESET(pAd, Wcid) \ + AsicDelWcidTab(pAd, Wcid); + +// add this entry into ASIC RX WCID search table +#define RTMP_STA_ENTRY_ADD(pAd, pEntry) \ + AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr); + +// add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet +// Set MAC register value according operation mode +#define RTMP_UPDATE_PROTECT(pAd) \ + AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT), TRUE, 0); +// end johnli + +// Insert the BA bitmap to ASIC for the Wcid entry +#define RTMP_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID) \ + do{ \ + UINT32 _Value = 0, _Offset; \ + _Offset = MAC_WCID_BASE + (_Aid) * HW_WCID_ENTRY_SIZE + 4; \ + RTMP_IO_READ32((_pAd), _Offset, &_Value);\ + _Value |= (0x10000<<(_TID)); \ + RTMP_IO_WRITE32((_pAd), _Offset, _Value);\ + }while(0) + + +// Remove the BA bitmap from ASIC for the Wcid entry +// bitmap field starts at 0x10000 in ASIC WCID table +#define RTMP_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID) \ + do{ \ + UINT32 _Value = 0, _Offset; \ + _Offset = MAC_WCID_BASE + (_Wcid) * HW_WCID_ENTRY_SIZE + 4; \ + RTMP_IO_READ32((_pAd), _Offset, &_Value); \ + _Value &= (~(0x10000 << (_TID))); \ + RTMP_IO_WRITE32((_pAd), _Offset, _Value); \ + }while(0) + + +/* ----------------- Interface Related MACRO ----------------- */ + +// +// Enable & Disable NIC interrupt via writing interrupt mask register +// Since it use ADAPTER structure, it have to be put after structure definition. +// +#define RTMP_ASIC_INTERRUPT_DISABLE(_pAd) \ + do{ \ + RTMP_IO_WRITE32((_pAd), INT_MASK_CSR, 0x0); /* 0: disable */ \ + RTMP_CLEAR_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \ + }while(0) + +#define RTMP_ASIC_INTERRUPT_ENABLE(_pAd)\ + do{ \ + RTMP_IO_WRITE32((_pAd), INT_MASK_CSR, (_pAd)->int_enable_reg /*DELAYINTMASK*/); /* 1:enable */ \ + RTMP_SET_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \ + }while(0) + + +#define RTMP_IRQ_INIT(pAd) \ + { pAd->int_enable_reg = ((DELAYINTMASK) | \ + (RxINT|TxDataInt|TxMgmtInt)) & ~(0x03); \ + pAd->int_disable_mask = 0; \ + pAd->int_pending = 0; } + +#define RTMP_IRQ_ENABLE(pAd) \ + { /* clear garbage ints */ \ + RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff);\ + RTMP_ASIC_INTERRUPT_ENABLE(pAd); } + + +/* ----------------- MLME Related MACRO ----------------- */ +#define RTMP_MLME_HANDLER(pAd) MlmeHandler(pAd) + +#define RTMP_MLME_PRE_SANITY_CHECK(pAd) + +#define RTMP_MLME_STA_QUICK_RSP_WAKE_UP(pAd) \ + RTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, 100); + +#define RTMP_MLME_RESET_STATE_MACHINE(pAd) \ + MlmeRestartStateMachine(pAd) + +#define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry)\ + HandleCounterMeasure(_pAd, _pEntry) + +/* ----------------- Power Save Related MACRO ----------------- */ +#define RTMP_PS_POLL_ENQUEUE(pAd) EnqueuePsPoll(pAd) + + +// For RTMPPCIePowerLinkCtrlRestore () function +#define RESTORE_HALT 1 +#define RESTORE_WAKEUP 2 +#define RESTORE_CLOSE 3 + +#define PowerSafeCID 1 +#define PowerRadioOffCID 2 +#define PowerWakeCID 3 +#define CID0MASK 0x000000ff +#define CID1MASK 0x0000ff00 +#define CID2MASK 0x00ff0000 +#define CID3MASK 0xff000000 + + +#ifdef CONFIG_STA_SUPPORT +#define RTMP_STA_FORCE_WAKEUP(pAd, bFromTx) \ + RT28xxPciStaAsicForceWakeup(pAd, bFromTx); + +#define RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \ + RT28xxPciStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp); + +#define RTMP_SET_PSM_BIT(_pAd, _val) \ + MlmeSetPsmBit(_pAd, _val); +#endif // CONFIG_STA_SUPPORT // + +#define RTMP_MLME_RADIO_ON(pAd) \ + RT28xxPciMlmeRadioOn(pAd); + +#define RTMP_MLME_RADIO_OFF(pAd) \ + RT28xxPciMlmeRadioOFF(pAd); + +/* ----------------- Security Related MACRO ----------------- */ + +/* Set Asic WCID Attribute table */ +#define RTMP_SET_WCID_SEC_INFO(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag) \ + RTMPSetWcidSecurityInfo(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag) + +/* Set Asic WCID IV/EIV table */ +#define RTMP_ASIC_WCID_IVEIV_TABLE(_pAd, _Wcid, _uIV, _uEIV) \ + AsicUpdateWCIDIVEIV(_pAd, _Wcid, _uIV, _uEIV) + +/* Set Asic WCID Attribute table (offset:0x6800) */ +#define RTMP_ASIC_WCID_ATTR_TABLE(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag)\ + AsicUpdateWcidAttributeEntry(_pAd, _BssIdx, _KeyIdx, _CipherAlg, _Wcid, _KeyTabFlag) + +/* Set Asic Pairwise key table */ +#define RTMP_ASIC_PAIRWISE_KEY_TABLE(_pAd, _WCID, _pCipherKey) \ + AsicAddPairwiseKeyEntry(_pAd, _WCID, _pCipherKey) + +/* Set Asic Shared key table */ +#define RTMP_ASIC_SHARED_KEY_TABLE(_pAd, _BssIndex, _KeyIdx, _pCipherKey) \ + AsicAddSharedKeyEntry(_pAd, _BssIndex, _KeyIdx, _pCipherKey) + +#ifdef CONFIG_STA_SUPPORT +/* Set Port Secured */ +#define RTMP_SET_PORT_SECURED(_pAd) \ + STA_PORT_SECURED(_pAd); +#endif // CONFIG_STA_SUPPORT // + +/* Remove Pairwise Key table */ +#define RTMP_REMOVE_PAIRWISE_KEY_ENTRY(_pAd, _Wcid)\ + AsicRemovePairwiseKeyEntry(_pAd, _Wcid) + +#endif //__MAC_PCI_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt2860.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt2860.h new file mode 100644 index 000000000..345096bb1 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt2860.h @@ -0,0 +1,67 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt2860.h + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + +#ifndef __RT2860_H__ +#define __RT2860_H__ + +#ifdef RT2860 +#include "chip/mac_pci.h" + +#ifndef RTMP_PCI_SUPPORT +#error "For RT2860, you should define the compile flag -DRTMP_PCI_SUPPORT" +#endif + +#ifndef RTMP_MAC_PCI +#error "For RT2880, you should define the compile flag -DRTMP_MAC_PCI" +#endif + +// +// Device ID & Vendor ID, these values should match EEPROM value +// +#define NIC2860_PCI_DEVICE_ID 0x0601 +#define NIC2860_PCIe_DEVICE_ID 0x0681 +#define NIC2760_PCI_DEVICE_ID 0x0701 // 1T/2R Cardbus ??? +#define NIC2790_PCIe_DEVICE_ID 0x0781 // 1T/2R miniCard + + +#define VEN_AWT_PCIe_DEVICE_ID 0x1059 +#define VEN_AWT_PCI_VENDOR_ID 0x1A3B + +#define EDIMAX_PCI_VENDOR_ID 0x1432 + +#endif // RT2860 // + +#endif //__RT2860_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt30xx.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt30xx.h new file mode 100644 index 000000000..9fb10104a --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt30xx.h @@ -0,0 +1,49 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt30xx.h + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + +#ifndef __RT30XX_H__ +#define __RT30XX_H__ + +#ifdef RT30xx +#include "rtmp_type.h" + +extern REG_PAIR RT30xx_RFRegTable[]; +extern UCHAR NUM_RF_REG_PARMS; + +#endif // RT30xx // + +#endif //__RT30XX_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt35xx.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt35xx.h new file mode 100644 index 000000000..ca359c7e2 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rt35xx.h @@ -0,0 +1,65 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt35xx.h + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + +#ifndef __RT35XX_H__ +#define __RT35XX_H__ + +#ifdef RT35xx + + +#ifdef RTMP_PCI_SUPPORT +#include "chip/mac_pci.h" +#endif + +#ifndef RTMP_RF_RW_SUPPORT +#error "For RT3062/3562/3572/3592, you should define the compile flag -DRTMP_RF_RW_SUPPORT" +#endif + +#include "chip/rt30xx.h" + +extern REG_PAIR RF3572_RFRegTable[]; + +// +// Device ID & Vendor ID, these values should match EEPROM value +// +#define NIC3062_PCI_DEVICE_ID 0x3062 // 2T/2R miniCard +#define NIC3562_PCI_DEVICE_ID 0x3562 // 2T/2R miniCard +#define NIC3060_PCI_DEVICE_ID 0x3060 // 1T/1R miniCard + +#endif // RT35xx // + +#endif //__RT35XX_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rtmp_mac.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rtmp_mac.h new file mode 100644 index 000000000..d1ac44387 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rtmp_mac.h @@ -0,0 +1,2304 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_mac.h + + Abstract: + Ralink Wireless Chip MAC related definition & structures + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#ifndef __RTMP_MAC_H__ +#define __RTMP_MAC_H__ + + + +// ================================================================================= +// TX / RX ring descriptor format +// ================================================================================= + +// the first 24-byte in TXD is called TXINFO and will be DMAed to MAC block through TXFIFO. +// MAC block use this TXINFO to control the transmission behavior of this frame. +#define FIFO_MGMT 0 +#define FIFO_HCCA 1 +#define FIFO_EDCA 2 + + +// +// TXD Wireless Information format for Tx ring and Mgmt Ring +// +//txop : for txop mode +// 0:txop for the MPDU frame will be handles by ASIC by register +// 1/2/3:the MPDU frame is send after PIFS/backoff/SIFS +#ifdef RT_BIG_ENDIAN +typedef struct GNU_PACKED _TXWI_STRUC { + // Word 0 + UINT32 PHYMODE:2; + UINT32 rsv2:2; + UINT32 Ifs:1; + UINT32 STBC:2; //channel bandwidth 20MHz or 40 MHz + UINT32 ShortGI:1; + UINT32 BW:1; //channel bandwidth 20MHz or 40 MHz + UINT32 MCS:7; + + UINT32 rsv:6; + UINT32 txop:2; //tx back off mode 0:HT TXOP rule , 1:PIFS TX ,2:Backoff, 3:sifs only when previous frame exchange is successful. + UINT32 MpduDensity:3; + UINT32 AMPDU:1; + + UINT32 TS:1; + UINT32 CFACK:1; + UINT32 MIMOps:1; // the remote peer is in dynamic MIMO-PS mode + UINT32 FRAG:1; // 1 to inform TKIP engine this is a fragment. + // Word 1 + UINT32 PacketId:4; + UINT32 MPDUtotalByteCount:12; + UINT32 WirelessCliID:8; + UINT32 BAWinSize:6; + UINT32 NSEQ:1; + UINT32 ACK:1; + // Word 2 + UINT32 IV; + // Word 3 + UINT32 EIV; +} TXWI_STRUC, *PTXWI_STRUC; +#else +typedef struct GNU_PACKED _TXWI_STRUC { + // Word 0 + // ex: 00 03 00 40 means txop = 3, PHYMODE = 1 + UINT32 FRAG:1; // 1 to inform TKIP engine this is a fragment. + UINT32 MIMOps:1; // the remote peer is in dynamic MIMO-PS mode + UINT32 CFACK:1; + UINT32 TS:1; + + UINT32 AMPDU:1; + UINT32 MpduDensity:3; + UINT32 txop:2; //FOR "THIS" frame. 0:HT TXOP rule , 1:PIFS TX ,2:Backoff, 3:sifs only when previous frame exchange is successful. + UINT32 rsv:6; + + UINT32 MCS:7; + UINT32 BW:1; //channel bandwidth 20MHz or 40 MHz + UINT32 ShortGI:1; + UINT32 STBC:2; // 1: STBC support MCS =0-7, 2,3 : RESERVE + UINT32 Ifs:1; + UINT32 rsv2:2; //channel bandwidth 20MHz or 40 MHz + UINT32 PHYMODE:2; + // Word1 + // ex: 1c ff 38 00 means ACK=0, BAWinSize=7, MPDUtotalByteCount = 0x38 + UINT32 ACK:1; + UINT32 NSEQ:1; + UINT32 BAWinSize:6; + UINT32 WirelessCliID:8; + UINT32 MPDUtotalByteCount:12; + UINT32 PacketId:4; + //Word2 + UINT32 IV; + //Word3 + UINT32 EIV; +} TXWI_STRUC, *PTXWI_STRUC; +#endif + + +// +// RXWI wireless information format, in PBF. invisible in driver. +// +#ifdef RT_BIG_ENDIAN +typedef struct GNU_PACKED _RXWI_STRUC { + // Word 0 + UINT32 TID:4; + UINT32 MPDUtotalByteCount:12; + UINT32 UDF:3; + UINT32 BSSID:3; + UINT32 KeyIndex:2; + UINT32 WirelessCliID:8; + // Word 1 + UINT32 PHYMODE:2; // 1: this RX frame is unicast to me + UINT32 rsv:3; + UINT32 STBC:2; + UINT32 ShortGI:1; + UINT32 BW:1; + UINT32 MCS:7; + UINT32 SEQUENCE:12; + UINT32 FRAG:4; + // Word 2 + UINT32 rsv1:8; + UINT32 RSSI2:8; + UINT32 RSSI1:8; + UINT32 RSSI0:8; + // Word 3 + /*UINT32 rsv2:16;*/ + UINT32 rsv2:8; + UINT32 FOFFSET:8; // RT35xx + UINT32 SNR1:8; + UINT32 SNR0:8; +} RXWI_STRUC, *PRXWI_STRUC; +#else +typedef struct GNU_PACKED _RXWI_STRUC { + // Word 0 + UINT32 WirelessCliID:8; + UINT32 KeyIndex:2; + UINT32 BSSID:3; + UINT32 UDF:3; + UINT32 MPDUtotalByteCount:12; + UINT32 TID:4; + // Word 1 + UINT32 FRAG:4; + UINT32 SEQUENCE:12; + UINT32 MCS:7; + UINT32 BW:1; + UINT32 ShortGI:1; + UINT32 STBC:2; + UINT32 rsv:3; + UINT32 PHYMODE:2; // 1: this RX frame is unicast to me + //Word2 + UINT32 RSSI0:8; + UINT32 RSSI1:8; + UINT32 RSSI2:8; + UINT32 rsv1:8; + //Word3 + UINT32 SNR0:8; + UINT32 SNR1:8; + UINT32 FOFFSET:8; // RT35xx + UINT32 rsv2:8; + /*UINT32 rsv2:16;*/ +} RXWI_STRUC, *PRXWI_STRUC; +#endif + + +// ================================================================================= +// Register format +// ================================================================================= + + +// +// SCH/DMA registers - base address 0x0200 +// +// INT_SOURCE_CSR: Interrupt source register. Write one to clear corresponding bit +// +#define DMA_CSR0 0x200 +#define INT_SOURCE_CSR 0x200 +#ifdef RT_BIG_ENDIAN +typedef union _INT_SOURCE_CSR_STRUC { + struct { +#ifdef TONE_RADAR_DETECT_SUPPORT + UINT32 :11; + UINT32 RadarINT:1; + UINT32 rsv:2; +#else // original source code + UINT32 :14; +#endif // TONE_RADAR_DETECT_SUPPORT // + UINT32 TxCoherent:1; + UINT32 RxCoherent:1; + UINT32 GPTimer:1; + UINT32 AutoWakeup:1;//bit14 + UINT32 TXFifoStatusInt:1;//FIFO Statistics is full, sw should read 0x171c + UINT32 PreTBTT:1; + UINT32 TBTTInt:1; + UINT32 RxTxCoherent:1; + UINT32 MCUCommandINT:1; + UINT32 MgmtDmaDone:1; + UINT32 HccaDmaDone:1; + UINT32 Ac3DmaDone:1; + UINT32 Ac2DmaDone:1; + UINT32 Ac1DmaDone:1; + UINT32 Ac0DmaDone:1; + UINT32 RxDone:1; + UINT32 TxDelayINT:1; //delayed interrupt, not interrupt until several int or time limit hit + UINT32 RxDelayINT:1; //dealyed interrupt + } field; + UINT32 word; +} INT_SOURCE_CSR_STRUC, *PINT_SOURCE_CSR_STRUC; +#else +typedef union _INT_SOURCE_CSR_STRUC { + struct { + UINT32 RxDelayINT:1; + UINT32 TxDelayINT:1; + UINT32 RxDone:1; + UINT32 Ac0DmaDone:1;//4 + UINT32 Ac1DmaDone:1; + UINT32 Ac2DmaDone:1; + UINT32 Ac3DmaDone:1; + UINT32 HccaDmaDone:1; // bit7 + UINT32 MgmtDmaDone:1; + UINT32 MCUCommandINT:1;//bit 9 + UINT32 RxTxCoherent:1; + UINT32 TBTTInt:1; + UINT32 PreTBTT:1; + UINT32 TXFifoStatusInt:1;//FIFO Statistics is full, sw should read 0x171c + UINT32 AutoWakeup:1;//bit14 + UINT32 GPTimer:1; + UINT32 RxCoherent:1;//bit16 + UINT32 TxCoherent:1; +#ifdef TONE_RADAR_DETECT_SUPPORT + UINT32 rsv:2; + UINT32 RadarINT:1; + UINT32 :11; +#else + UINT32 :14; +#endif // TONE_RADAR_DETECT_SUPPORT // + } field; + UINT32 word; +} INT_SOURCE_CSR_STRUC, *PINT_SOURCE_CSR_STRUC; +#endif + +// +// INT_MASK_CSR: Interrupt MASK register. 1: the interrupt is mask OFF +// +#define INT_MASK_CSR 0x204 +#ifdef RT_BIG_ENDIAN +typedef union _INT_MASK_CSR_STRUC { + struct { + UINT32 TxCoherent:1; + UINT32 RxCoherent:1; +#ifdef TONE_RADAR_DETECT_SUPPORT + UINT32 :9; + UINT32 RadarINT:1; + UINT32 rsv:10; +#else + UINT32 :20; +#endif // TONE_RADAR_DETECT_SUPPORT // + UINT32 MCUCommandINT:1; + UINT32 MgmtDmaDone:1; + UINT32 HccaDmaDone:1; + UINT32 Ac3DmaDone:1; + UINT32 Ac2DmaDone:1; + UINT32 Ac1DmaDone:1; + UINT32 Ac0DmaDone:1; + UINT32 RxDone:1; + UINT32 TxDelay:1; + UINT32 RXDelay_INT_MSK:1; + } field; + UINT32 word; +}INT_MASK_CSR_STRUC, *PINT_MASK_CSR_STRUC; +#else +typedef union _INT_MASK_CSR_STRUC { + struct { + UINT32 RXDelay_INT_MSK:1; + UINT32 TxDelay:1; + UINT32 RxDone:1; + UINT32 Ac0DmaDone:1; + UINT32 Ac1DmaDone:1; + UINT32 Ac2DmaDone:1; + UINT32 Ac3DmaDone:1; + UINT32 HccaDmaDone:1; + UINT32 MgmtDmaDone:1; + UINT32 MCUCommandINT:1; +#ifdef TONE_RADAR_DETECT_SUPPORT + UINT32 rsv:10; + UINT32 RadarINT:1; + UINT32 :9; +#else + UINT32 :20; +#endif // TONE_RADAR_DETECT_SUPPORT // + UINT32 RxCoherent:1; + UINT32 TxCoherent:1; + } field; + UINT32 word; +} INT_MASK_CSR_STRUC, *PINT_MASK_CSR_STRUC; +#endif + +#define WPDMA_GLO_CFG 0x208 +#ifdef RT_BIG_ENDIAN +typedef union _WPDMA_GLO_CFG_STRUC { + struct { + UINT32 HDR_SEG_LEN:16; + UINT32 RXHdrScater:8; + UINT32 BigEndian:1; + UINT32 EnTXWriteBackDDONE:1; + UINT32 WPDMABurstSIZE:2; + UINT32 RxDMABusy:1; + UINT32 EnableRxDMA:1; + UINT32 TxDMABusy:1; + UINT32 EnableTxDMA:1; + } field; + UINT32 word; +}WPDMA_GLO_CFG_STRUC, *PWPDMA_GLO_CFG_STRUC; +#else +typedef union _WPDMA_GLO_CFG_STRUC { + struct { + UINT32 EnableTxDMA:1; + UINT32 TxDMABusy:1; + UINT32 EnableRxDMA:1; + UINT32 RxDMABusy:1; + UINT32 WPDMABurstSIZE:2; + UINT32 EnTXWriteBackDDONE:1; + UINT32 BigEndian:1; + UINT32 RXHdrScater:8; + UINT32 HDR_SEG_LEN:16; + } field; + UINT32 word; +} WPDMA_GLO_CFG_STRUC, *PWPDMA_GLO_CFG_STRUC; +#endif + +#define WPDMA_RST_IDX 0x20c +#ifdef RT_BIG_ENDIAN +typedef union _WPDMA_RST_IDX_STRUC { + struct { + UINT32 :15; + UINT32 RST_DRX_IDX0:1; + UINT32 rsv:10; + UINT32 RST_DTX_IDX5:1; + UINT32 RST_DTX_IDX4:1; + UINT32 RST_DTX_IDX3:1; + UINT32 RST_DTX_IDX2:1; + UINT32 RST_DTX_IDX1:1; + UINT32 RST_DTX_IDX0:1; + } field; + UINT32 word; +}WPDMA_RST_IDX_STRUC, *PWPDMA_RST_IDX_STRUC; +#else +typedef union _WPDMA_RST_IDX_STRUC { + struct { + UINT32 RST_DTX_IDX0:1; + UINT32 RST_DTX_IDX1:1; + UINT32 RST_DTX_IDX2:1; + UINT32 RST_DTX_IDX3:1; + UINT32 RST_DTX_IDX4:1; + UINT32 RST_DTX_IDX5:1; + UINT32 rsv:10; + UINT32 RST_DRX_IDX0:1; + UINT32 :15; + } field; + UINT32 word; +} WPDMA_RST_IDX_STRUC, *PWPDMA_RST_IDX_STRUC; +#endif +#define DELAY_INT_CFG 0x0210 +#ifdef RT_BIG_ENDIAN +typedef union _DELAY_INT_CFG_STRUC { + struct { + UINT32 TXDLY_INT_EN:1; + UINT32 TXMAX_PINT:7; + UINT32 TXMAX_PTIME:8; + UINT32 RXDLY_INT_EN:1; + UINT32 RXMAX_PINT:7; + UINT32 RXMAX_PTIME:8; + } field; + UINT32 word; +}DELAY_INT_CFG_STRUC, *PDELAY_INT_CFG_STRUC; +#else +typedef union _DELAY_INT_CFG_STRUC { + struct { + UINT32 RXMAX_PTIME:8; + UINT32 RXMAX_PINT:7; + UINT32 RXDLY_INT_EN:1; + UINT32 TXMAX_PTIME:8; + UINT32 TXMAX_PINT:7; + UINT32 TXDLY_INT_EN:1; + } field; + UINT32 word; +} DELAY_INT_CFG_STRUC, *PDELAY_INT_CFG_STRUC; +#endif +#define WMM_AIFSN_CFG 0x0214 +#ifdef RT_BIG_ENDIAN +typedef union _AIFSN_CSR_STRUC { + struct { + UINT32 Rsv:16; + UINT32 Aifsn3:4; // for AC_VO + UINT32 Aifsn2:4; // for AC_VI + UINT32 Aifsn1:4; // for AC_BK + UINT32 Aifsn0:4; // for AC_BE + } field; + UINT32 word; +} AIFSN_CSR_STRUC, *PAIFSN_CSR_STRUC; +#else +typedef union _AIFSN_CSR_STRUC { + struct { + UINT32 Aifsn0:4; // for AC_BE + UINT32 Aifsn1:4; // for AC_BK + UINT32 Aifsn2:4; // for AC_VI + UINT32 Aifsn3:4; // for AC_VO + UINT32 Rsv:16; + } field; + UINT32 word; +} AIFSN_CSR_STRUC, *PAIFSN_CSR_STRUC; +#endif +// +// CWMIN_CSR: CWmin for each EDCA AC +// +#define WMM_CWMIN_CFG 0x0218 +#ifdef RT_BIG_ENDIAN +typedef union _CWMIN_CSR_STRUC { + struct { + UINT32 Rsv:16; + UINT32 Cwmin3:4; // for AC_VO + UINT32 Cwmin2:4; // for AC_VI + UINT32 Cwmin1:4; // for AC_BK + UINT32 Cwmin0:4; // for AC_BE + } field; + UINT32 word; +} CWMIN_CSR_STRUC, *PCWMIN_CSR_STRUC; +#else +typedef union _CWMIN_CSR_STRUC { + struct { + UINT32 Cwmin0:4; // for AC_BE + UINT32 Cwmin1:4; // for AC_BK + UINT32 Cwmin2:4; // for AC_VI + UINT32 Cwmin3:4; // for AC_VO + UINT32 Rsv:16; + } field; + UINT32 word; +} CWMIN_CSR_STRUC, *PCWMIN_CSR_STRUC; +#endif + +// +// CWMAX_CSR: CWmin for each EDCA AC +// +#define WMM_CWMAX_CFG 0x021c +#ifdef RT_BIG_ENDIAN +typedef union _CWMAX_CSR_STRUC { + struct { + UINT32 Rsv:16; + UINT32 Cwmax3:4; // for AC_VO + UINT32 Cwmax2:4; // for AC_VI + UINT32 Cwmax1:4; // for AC_BK + UINT32 Cwmax0:4; // for AC_BE + } field; + UINT32 word; +} CWMAX_CSR_STRUC, *PCWMAX_CSR_STRUC; +#else +typedef union _CWMAX_CSR_STRUC { + struct { + UINT32 Cwmax0:4; // for AC_BE + UINT32 Cwmax1:4; // for AC_BK + UINT32 Cwmax2:4; // for AC_VI + UINT32 Cwmax3:4; // for AC_VO + UINT32 Rsv:16; + } field; + UINT32 word; +} CWMAX_CSR_STRUC, *PCWMAX_CSR_STRUC; +#endif + + +// +// AC_TXOP_CSR0: AC_BK/AC_BE TXOP register +// +#define WMM_TXOP0_CFG 0x0220 +#ifdef RT_BIG_ENDIAN +typedef union _AC_TXOP_CSR0_STRUC { + struct { + USHORT Ac1Txop; // for AC_BE, in unit of 32us + USHORT Ac0Txop; // for AC_BK, in unit of 32us + } field; + UINT32 word; +} AC_TXOP_CSR0_STRUC, *PAC_TXOP_CSR0_STRUC; +#else +typedef union _AC_TXOP_CSR0_STRUC { + struct { + USHORT Ac0Txop; // for AC_BK, in unit of 32us + USHORT Ac1Txop; // for AC_BE, in unit of 32us + } field; + UINT32 word; +} AC_TXOP_CSR0_STRUC, *PAC_TXOP_CSR0_STRUC; +#endif + +// +// AC_TXOP_CSR1: AC_VO/AC_VI TXOP register +// +#define WMM_TXOP1_CFG 0x0224 +#ifdef RT_BIG_ENDIAN +typedef union _AC_TXOP_CSR1_STRUC { + struct { + USHORT Ac3Txop; // for AC_VO, in unit of 32us + USHORT Ac2Txop; // for AC_VI, in unit of 32us + } field; + UINT32 word; +} AC_TXOP_CSR1_STRUC, *PAC_TXOP_CSR1_STRUC; +#else +typedef union _AC_TXOP_CSR1_STRUC { + struct { + USHORT Ac2Txop; // for AC_VI, in unit of 32us + USHORT Ac3Txop; // for AC_VO, in unit of 32us + } field; + UINT32 word; +} AC_TXOP_CSR1_STRUC, *PAC_TXOP_CSR1_STRUC; +#endif + + +#define RINGREG_DIFF 0x10 +#define GPIO_CTRL_CFG 0x0228 //MAC_CSR13 +#define MCU_CMD_CFG 0x022c +#define TX_BASE_PTR0 0x0230 //AC_BK base address +#define TX_MAX_CNT0 0x0234 +#define TX_CTX_IDX0 0x0238 +#define TX_DTX_IDX0 0x023c +#define TX_BASE_PTR1 0x0240 //AC_BE base address +#define TX_MAX_CNT1 0x0244 +#define TX_CTX_IDX1 0x0248 +#define TX_DTX_IDX1 0x024c +#define TX_BASE_PTR2 0x0250 //AC_VI base address +#define TX_MAX_CNT2 0x0254 +#define TX_CTX_IDX2 0x0258 +#define TX_DTX_IDX2 0x025c +#define TX_BASE_PTR3 0x0260 //AC_VO base address +#define TX_MAX_CNT3 0x0264 +#define TX_CTX_IDX3 0x0268 +#define TX_DTX_IDX3 0x026c +#define TX_BASE_PTR4 0x0270 //HCCA base address +#define TX_MAX_CNT4 0x0274 +#define TX_CTX_IDX4 0x0278 +#define TX_DTX_IDX4 0x027c +#define TX_BASE_PTR5 0x0280 //MGMT base address +#define TX_MAX_CNT5 0x0284 +#define TX_CTX_IDX5 0x0288 +#define TX_DTX_IDX5 0x028c +#define TX_MGMTMAX_CNT TX_MAX_CNT5 +#define TX_MGMTCTX_IDX TX_CTX_IDX5 +#define TX_MGMTDTX_IDX TX_DTX_IDX5 +#define RX_BASE_PTR 0x0290 //RX base address +#define RX_MAX_CNT 0x0294 +#define RX_CRX_IDX 0x0298 +#define RX_DRX_IDX 0x029c + + +#define USB_DMA_CFG 0x02a0 +#ifdef RT_BIG_ENDIAN +typedef union _USB_DMA_CFG_STRUC { + struct { + UINT32 TxBusy:1; //USB DMA TX FSM busy . debug only + UINT32 RxBusy:1; //USB DMA RX FSM busy . debug only + UINT32 EpoutValid:6; //OUT endpoint data valid. debug only + UINT32 TxBulkEn:1; //Enable USB DMA Tx + UINT32 RxBulkEn:1; //Enable USB DMA Rx + UINT32 RxBulkAggEn:1; //Enable Rx Bulk Aggregation + UINT32 TxopHalt:1; //Halt TXOP count down when TX buffer is full. + UINT32 TxClear:1; //Clear USB DMA TX path + UINT32 rsv:2; + UINT32 phyclear:1; //phy watch dog enable. write 1 + UINT32 RxBulkAggLmt:8; //Rx Bulk Aggregation Limit in unit of 1024 bytes + UINT32 RxBulkAggTOut:8; //Rx Bulk Aggregation TimeOut in unit of 33ns + } field; + UINT32 word; +} USB_DMA_CFG_STRUC, *PUSB_DMA_CFG_STRUC; +#else +typedef union _USB_DMA_CFG_STRUC { + struct { + UINT32 RxBulkAggTOut:8; //Rx Bulk Aggregation TimeOut in unit of 33ns + UINT32 RxBulkAggLmt:8; //Rx Bulk Aggregation Limit in unit of 256 bytes + UINT32 phyclear:1; //phy watch dog enable. write 1 + UINT32 rsv:2; + UINT32 TxClear:1; //Clear USB DMA TX path + UINT32 TxopHalt:1; //Halt TXOP count down when TX buffer is full. + UINT32 RxBulkAggEn:1; //Enable Rx Bulk Aggregation + UINT32 RxBulkEn:1; //Enable USB DMA Rx + UINT32 TxBulkEn:1; //Enable USB DMA Tx + UINT32 EpoutValid:6; //OUT endpoint data valid + UINT32 RxBusy:1; //USB DMA RX FSM busy + UINT32 TxBusy:1; //USB DMA TX FSM busy + } field; + UINT32 word; +} USB_DMA_CFG_STRUC, *PUSB_DMA_CFG_STRUC; +#endif + + +// +// 3 PBF registers +// +// +// Most are for debug. Driver doesn't touch PBF register. +#define PBF_SYS_CTRL 0x0400 +#define PBF_CFG 0x0408 +#define PBF_MAX_PCNT 0x040C +#define PBF_CTRL 0x0410 +#define PBF_INT_STA 0x0414 +#define PBF_INT_ENA 0x0418 +#define TXRXQ_PCNT 0x0438 +#define PBF_DBG 0x043c +#define PBF_CAP_CTRL 0x0440 + +#ifdef RT30xx +#ifdef RTMP_EFUSE_SUPPORT +// eFuse registers +#define EFUSE_CTRL 0x0580 +#define EFUSE_DATA0 0x0590 +#define EFUSE_DATA1 0x0594 +#define EFUSE_DATA2 0x0598 +#define EFUSE_DATA3 0x059c +#endif // RTMP_EFUSE_SUPPORT // +#endif // RT30xx // + +#define OSC_CTRL 0x5a4 +#define PCIE_PHY_TX_ATTENUATION_CTRL 0x05C8 +#define LDO_CFG0 0x05d4 +#define GPIO_SWITCH 0x05dc + + +// +// 4 MAC registers +// +// +// 4.1 MAC SYSTEM configuration registers (offset:0x1000) +// +#define MAC_CSR0 0x1000 +#ifdef RT_BIG_ENDIAN +typedef union _ASIC_VER_ID_STRUC { + struct { + USHORT ASICVer; // version : 2860 + USHORT ASICRev; // reversion : 0 + } field; + UINT32 word; +} ASIC_VER_ID_STRUC, *PASIC_VER_ID_STRUC; +#else +typedef union _ASIC_VER_ID_STRUC { + struct { + USHORT ASICRev; // reversion : 0 + USHORT ASICVer; // version : 2860 + } field; + UINT32 word; +} ASIC_VER_ID_STRUC, *PASIC_VER_ID_STRUC; +#endif +#define MAC_SYS_CTRL 0x1004 //MAC_CSR1 +#define MAC_ADDR_DW0 0x1008 // MAC ADDR DW0 +#define MAC_ADDR_DW1 0x100c // MAC ADDR DW1 +// +// MAC_CSR2: STA MAC register 0 +// +#ifdef RT_BIG_ENDIAN +typedef union _MAC_DW0_STRUC { + struct { + UCHAR Byte3; // MAC address byte 3 + UCHAR Byte2; // MAC address byte 2 + UCHAR Byte1; // MAC address byte 1 + UCHAR Byte0; // MAC address byte 0 + } field; + UINT32 word; +} MAC_DW0_STRUC, *PMAC_DW0_STRUC; +#else +typedef union _MAC_DW0_STRUC { + struct { + UCHAR Byte0; // MAC address byte 0 + UCHAR Byte1; // MAC address byte 1 + UCHAR Byte2; // MAC address byte 2 + UCHAR Byte3; // MAC address byte 3 + } field; + UINT32 word; +} MAC_DW0_STRUC, *PMAC_DW0_STRUC; +#endif + +// +// MAC_CSR3: STA MAC register 1 +// +#ifdef RT_BIG_ENDIAN +typedef union _MAC_DW1_STRUC { + struct { + UCHAR Rsvd1; + UCHAR U2MeMask; + UCHAR Byte5; // MAC address byte 5 + UCHAR Byte4; // MAC address byte 4 + } field; + UINT32 word; +} MAC_DW1_STRUC, *PMAC_DW1_STRUC; +#else +typedef union _MAC_DW1_STRUC { + struct { + UCHAR Byte4; // MAC address byte 4 + UCHAR Byte5; // MAC address byte 5 + UCHAR U2MeMask; + UCHAR Rsvd1; + } field; + UINT32 word; +} MAC_DW1_STRUC, *PMAC_DW1_STRUC; +#endif + +#define MAC_BSSID_DW0 0x1010 // MAC BSSID DW0 +#define MAC_BSSID_DW1 0x1014 // MAC BSSID DW1 + +// +// MAC_CSR5: BSSID register 1 +// +#ifdef RT_BIG_ENDIAN +typedef union _MAC_CSR5_STRUC { + struct { + USHORT Rsvd:11; + USHORT MBssBcnNum:3; + USHORT BssIdMode:2; // 0: one BSSID, 10: 4 BSSID, 01: 2 BSSID , 11: 8BSSID + UCHAR Byte5; // BSSID byte 5 + UCHAR Byte4; // BSSID byte 4 + } field; + UINT32 word; +} MAC_CSR5_STRUC, *PMAC_CSR5_STRUC; +#else +typedef union _MAC_CSR5_STRUC { + struct { + UCHAR Byte4; // BSSID byte 4 + UCHAR Byte5; // BSSID byte 5 + USHORT BssIdMask:2; // 0: one BSSID, 10: 4 BSSID, 01: 2 BSSID , 11: 8BSSID + USHORT MBssBcnNum:3; + USHORT Rsvd:11; + } field; + UINT32 word; +} MAC_CSR5_STRUC, *PMAC_CSR5_STRUC; +#endif + +#define MAX_LEN_CFG 0x1018 // rt2860b max 16k bytes. bit12:13 Maximum PSDU length (power factor) 0:2^13, 1:2^14, 2:2^15, 3:2^16 +#define BBP_CSR_CFG 0x101c // +// +// BBP_CSR_CFG: BBP serial control register +// +#ifdef RT_BIG_ENDIAN +typedef union _BBP_CSR_CFG_STRUC { + struct { + UINT32 :12; + UINT32 BBP_RW_MODE:1; // 0: use serial mode 1:parallel + UINT32 BBP_PAR_DUR:1; // 0: 4 MAC clock cycles 1: 8 MAC clock cycles + UINT32 Busy:1; // 1: ASIC is busy execute BBP programming. + UINT32 fRead:1; // 0: Write BBP, 1: Read BBP + UINT32 RegNum:8; // Selected BBP register + UINT32 Value:8; // Register value to program into BBP + } field; + UINT32 word; +} BBP_CSR_CFG_STRUC, *PBBP_CSR_CFG_STRUC; +#else +typedef union _BBP_CSR_CFG_STRUC { + struct { + UINT32 Value:8; // Register value to program into BBP + UINT32 RegNum:8; // Selected BBP register + UINT32 fRead:1; // 0: Write BBP, 1: Read BBP + UINT32 Busy:1; // 1: ASIC is busy execute BBP programming. + UINT32 BBP_PAR_DUR:1; // 0: 4 MAC clock cycles 1: 8 MAC clock cycles + UINT32 BBP_RW_MODE:1; // 0: use serial mode 1:parallel + UINT32 :12; + } field; + UINT32 word; +} BBP_CSR_CFG_STRUC, *PBBP_CSR_CFG_STRUC; +#endif +#define RF_CSR_CFG0 0x1020 +// +// RF_CSR_CFG: RF control register +// +#ifdef RT_BIG_ENDIAN +typedef union _RF_CSR_CFG0_STRUC { + struct { + UINT32 Busy:1; // 0: idle 1: 8busy + UINT32 Sel:1; // 0:RF_LE0 activate 1:RF_LE1 activate + UINT32 StandbyMode:1; // 0: high when stand by 1: low when standby + UINT32 bitwidth:5; // Selected BBP register + UINT32 RegIdAndContent:24; // Register value to program into BBP + } field; + UINT32 word; +} RF_CSR_CFG0_STRUC, *PRF_CSR_CFG0_STRUC; +#else +typedef union _RF_CSR_CFG0_STRUC { + struct { + UINT32 RegIdAndContent:24; // Register value to program into BBP + UINT32 bitwidth:5; // Selected BBP register + UINT32 StandbyMode:1; // 0: high when stand by 1: low when standby + UINT32 Sel:1; // 0:RF_LE0 activate 1:RF_LE1 activate + UINT32 Busy:1; // 0: idle 1: 8busy + } field; + UINT32 word; +} RF_CSR_CFG0_STRUC, *PRF_CSR_CFG0_STRUC; +#endif +#define RF_CSR_CFG1 0x1024 +#ifdef RT_BIG_ENDIAN +typedef union _RF_CSR_CFG1_STRUC { + struct { + UINT32 rsv:7; // 0: idle 1: 8busy + UINT32 RFGap:5; // Gap between BB_CONTROL_RF and RF_LE. 0: 3 system clock cycle (37.5usec) 1: 5 system clock cycle (62.5usec) + UINT32 RegIdAndContent:24; // Register value to program into BBP + } field; + UINT32 word; +} RF_CSR_CFG1_STRUC, *PRF_CSR_CFG1_STRUC; +#else +typedef union _RF_CSR_CFG1_STRUC { + struct { + UINT32 RegIdAndContent:24; // Register value to program into BBP + UINT32 RFGap:5; // Gap between BB_CONTROL_RF and RF_LE. 0: 3 system clock cycle (37.5usec) 1: 5 system clock cycle (62.5usec) + UINT32 rsv:7; // 0: idle 1: 8busy + } field; + UINT32 word; +} RF_CSR_CFG1_STRUC, *PRF_CSR_CFG1_STRUC; +#endif +#define RF_CSR_CFG2 0x1028 // +#ifdef RT_BIG_ENDIAN +typedef union _RF_CSR_CFG2_STRUC { + struct { + UINT32 rsv:8; // 0: idle 1: 8busy + UINT32 RegIdAndContent:24; // Register value to program into BBP + } field; + UINT32 word; +} RF_CSR_CFG2_STRUC, *PRF_CSR_CFG2_STRUC; +#else +typedef union _RF_CSR_CFG2_STRUC { + struct { + UINT32 RegIdAndContent:24; // Register value to program into BBP + UINT32 rsv:8; // 0: idle 1: 8busy + } field; + UINT32 word; +} RF_CSR_CFG2_STRUC, *PRF_CSR_CFG2_STRUC; +#endif +#define LED_CFG 0x102c // MAC_CSR14 +#ifdef RT_BIG_ENDIAN +typedef union _LED_CFG_STRUC { + struct { + UINT32 :1; + UINT32 LedPolar:1; // Led Polarity. 0: active low1: active high + UINT32 YLedMode:2; // yellow Led Mode + UINT32 GLedMode:2; // green Led Mode + UINT32 RLedMode:2; // red Led Mode 0: off1: blinking upon TX2: periodic slow blinking3: always on + UINT32 rsv:2; + UINT32 SlowBlinkPeriod:6; // slow blinking period. unit:1ms + UINT32 OffPeriod:8; // blinking off period unit 1ms + UINT32 OnPeriod:8; // blinking on period unit 1ms + } field; + UINT32 word; +} LED_CFG_STRUC, *PLED_CFG_STRUC; +#else +typedef union _LED_CFG_STRUC { + struct { + UINT32 OnPeriod:8; // blinking on period unit 1ms + UINT32 OffPeriod:8; // blinking off period unit 1ms + UINT32 SlowBlinkPeriod:6; // slow blinking period. unit:1ms + UINT32 rsv:2; + UINT32 RLedMode:2; // red Led Mode 0: off1: blinking upon TX2: periodic slow blinking3: always on + UINT32 GLedMode:2; // green Led Mode + UINT32 YLedMode:2; // yellow Led Mode + UINT32 LedPolar:1; // Led Polarity. 0: active low1: active high + UINT32 :1; + } field; + UINT32 word; +} LED_CFG_STRUC, *PLED_CFG_STRUC; +#endif +// +// 4.2 MAC TIMING configuration registers (offset:0x1100) +// +#define XIFS_TIME_CFG 0x1100 // MAC_CSR8 MAC_CSR9 +#ifdef RT_BIG_ENDIAN +typedef union _IFS_SLOT_CFG_STRUC { + struct { + UINT32 rsv:2; + UINT32 BBRxendEnable:1; // reference RXEND signal to begin XIFS defer + UINT32 EIFS:9; // unit 1us + UINT32 OfdmXifsTime:4; //OFDM SIFS. unit 1us. Applied after OFDM RX when MAC doesn't reference BBP signal BBRXEND + UINT32 OfdmSifsTime:8; // unit 1us. Applied after OFDM RX/TX + UINT32 CckmSifsTime:8; // unit 1us. Applied after CCK RX/TX + } field; + UINT32 word; +} IFS_SLOT_CFG_STRUC, *PIFS_SLOT_CFG_STRUC; +#else +typedef union _IFS_SLOT_CFG_STRUC { + struct { + UINT32 CckmSifsTime:8; // unit 1us. Applied after CCK RX/TX + UINT32 OfdmSifsTime:8; // unit 1us. Applied after OFDM RX/TX + UINT32 OfdmXifsTime:4; //OFDM SIFS. unit 1us. Applied after OFDM RX when MAC doesn't reference BBP signal BBRXEND + UINT32 EIFS:9; // unit 1us + UINT32 BBRxendEnable:1; // reference RXEND signal to begin XIFS defer + UINT32 rsv:2; + } field; + UINT32 word; +} IFS_SLOT_CFG_STRUC, *PIFS_SLOT_CFG_STRUC; +#endif + +#define BKOFF_SLOT_CFG 0x1104 // mac_csr9 last 8 bits +#define NAV_TIME_CFG 0x1108 // NAV (MAC_CSR15) +#define CH_TIME_CFG 0x110C // Count as channel busy +#define PBF_LIFE_TIMER 0x1110 //TX/RX MPDU timestamp timer (free run)Unit: 1us +#define BCN_TIME_CFG 0x1114 // TXRX_CSR9 + +#define BCN_OFFSET0 0x042C +#define BCN_OFFSET1 0x0430 + +// +// BCN_TIME_CFG : Synchronization control register +// +#ifdef RT_BIG_ENDIAN +typedef union _BCN_TIME_CFG_STRUC { + struct { + UINT32 TxTimestampCompensate:8; + UINT32 :3; + UINT32 bBeaconGen:1; // Enable beacon generator + UINT32 bTBTTEnable:1; + UINT32 TsfSyncMode:2; // Enable TSF sync, 00: disable, 01: infra mode, 10: ad-hoc mode + UINT32 bTsfTicking:1; // Enable TSF auto counting + UINT32 BeaconInterval:16; // in unit of 1/16 TU + } field; + UINT32 word; +} BCN_TIME_CFG_STRUC, *PBCN_TIME_CFG_STRUC; +#else +typedef union _BCN_TIME_CFG_STRUC { + struct { + UINT32 BeaconInterval:16; // in unit of 1/16 TU + UINT32 bTsfTicking:1; // Enable TSF auto counting + UINT32 TsfSyncMode:2; // Enable TSF sync, 00: disable, 01: infra mode, 10: ad-hoc mode + UINT32 bTBTTEnable:1; + UINT32 bBeaconGen:1; // Enable beacon generator + UINT32 :3; + UINT32 TxTimestampCompensate:8; + } field; + UINT32 word; +} BCN_TIME_CFG_STRUC, *PBCN_TIME_CFG_STRUC; +#endif +#define TBTT_SYNC_CFG 0x1118 // txrx_csr10 +#define TSF_TIMER_DW0 0x111C // Local TSF timer lsb 32 bits. Read-only +#define TSF_TIMER_DW1 0x1120 // msb 32 bits. Read-only. +#define TBTT_TIMER 0x1124 // TImer remains till next TBTT. Read-only. TXRX_CSR14 +#define INT_TIMER_CFG 0x1128 // +#define INT_TIMER_EN 0x112c // GP-timer and pre-tbtt Int enable +#define CH_IDLE_STA 0x1130 // channel idle time +#define CH_BUSY_STA 0x1134 // channle busy time +#define CH_BUSY_STA_SEC 0x1138 // channel busy time for secondary channel +// +// 4.2 MAC POWER configuration registers (offset:0x1200) +// +#define MAC_STATUS_CFG 0x1200 // old MAC_CSR12 +#define PWR_PIN_CFG 0x1204 // old MAC_CSR12 +#define AUTO_WAKEUP_CFG 0x1208 // old MAC_CSR10 +// +// AUTO_WAKEUP_CFG: Manual power control / status register +// +#ifdef RT_BIG_ENDIAN +typedef union _AUTO_WAKEUP_STRUC { + struct { + UINT32 :16; + UINT32 EnableAutoWakeup:1; // 0:sleep, 1:awake + UINT32 NumofSleepingTbtt:7; // ForceWake has high privilege than PutToSleep when both set + UINT32 AutoLeadTime:8; + } field; + UINT32 word; +} AUTO_WAKEUP_STRUC, *PAUTO_WAKEUP_STRUC; +#else +typedef union _AUTO_WAKEUP_STRUC { + struct { + UINT32 AutoLeadTime:8; + UINT32 NumofSleepingTbtt:7; // ForceWake has high privilege than PutToSleep when both set + UINT32 EnableAutoWakeup:1; // 0:sleep, 1:awake + UINT32 :16; + } field; + UINT32 word; +} AUTO_WAKEUP_STRUC, *PAUTO_WAKEUP_STRUC; +#endif +// +// 4.3 MAC TX configuration registers (offset:0x1300) +// + +#define EDCA_AC0_CFG 0x1300 //AC_TXOP_CSR0 0x3474 +#define EDCA_AC1_CFG 0x1304 +#define EDCA_AC2_CFG 0x1308 +#define EDCA_AC3_CFG 0x130c +#ifdef RT_BIG_ENDIAN +typedef union _EDCA_AC_CFG_STRUC { + struct { + UINT32 :12; // + UINT32 Cwmax:4; //unit power of 2 + UINT32 Cwmin:4; // + UINT32 Aifsn:4; // # of slot time + UINT32 AcTxop:8; // in unit of 32us + } field; + UINT32 word; +} EDCA_AC_CFG_STRUC, *PEDCA_AC_CFG_STRUC; +#else +typedef union _EDCA_AC_CFG_STRUC { + struct { + UINT32 AcTxop:8; // in unit of 32us + UINT32 Aifsn:4; // # of slot time + UINT32 Cwmin:4; // + UINT32 Cwmax:4; //unit power of 2 + UINT32 :12; // + } field; + UINT32 word; +} EDCA_AC_CFG_STRUC, *PEDCA_AC_CFG_STRUC; +#endif + +#define EDCA_TID_AC_MAP 0x1310 +#define TX_PWR_CFG_0 0x1314 +#define TX_PWR_CFG_1 0x1318 +#define TX_PWR_CFG_2 0x131C +#define TX_PWR_CFG_3 0x1320 +#define TX_PWR_CFG_4 0x1324 +#define TX_PIN_CFG 0x1328 +#define TX_BAND_CFG 0x132c // 0x1 use upper 20MHz. 0 juse lower 20MHz +#define TX_SW_CFG0 0x1330 +#define TX_SW_CFG1 0x1334 +#define TX_SW_CFG2 0x1338 +#define TXOP_THRES_CFG 0x133c +#define TXOP_CTRL_CFG 0x1340 +#define TX_RTS_CFG 0x1344 + +#ifdef RT_BIG_ENDIAN +typedef union _TX_RTS_CFG_STRUC { + struct { + UINT32 rsv:7; + UINT32 RtsFbkEn:1; // enable rts rate fallback + UINT32 RtsThres:16; // unit:byte + UINT32 AutoRtsRetryLimit:8; + } field; + UINT32 word; +} TX_RTS_CFG_STRUC, *PTX_RTS_CFG_STRUC; +#else +typedef union _TX_RTS_CFG_STRUC { + struct { + UINT32 AutoRtsRetryLimit:8; + UINT32 RtsThres:16; // unit:byte + UINT32 RtsFbkEn:1; // enable rts rate fallback + UINT32 rsv:7; // 1: HT non-STBC control frame enable + } field; + UINT32 word; +} TX_RTS_CFG_STRUC, *PTX_RTS_CFG_STRUC; +#endif +#define TX_TIMEOUT_CFG 0x1348 +#ifdef RT_BIG_ENDIAN +typedef union _TX_TIMEOUT_CFG_STRUC { + struct { + UINT32 rsv2:8; + UINT32 TxopTimeout:8; //TXOP timeout value for TXOP truncation. It is recommended that (SLOT_TIME) > (TX_OP_TIMEOUT) > (RX_ACK_TIMEOUT) + UINT32 RxAckTimeout:8; // unit:slot. Used for TX precedure + UINT32 MpduLifeTime:4; // expiration time = 2^(9+MPDU LIFE TIME) us + UINT32 rsv:4; + } field; + UINT32 word; +} TX_TIMEOUT_CFG_STRUC, *PTX_TIMEOUT_CFG_STRUC; +#else +typedef union _TX_TIMEOUT_CFG_STRUC { + struct { + UINT32 rsv:4; + UINT32 MpduLifeTime:4; // expiration time = 2^(9+MPDU LIFE TIME) us + UINT32 RxAckTimeout:8; // unit:slot. Used for TX precedure + UINT32 TxopTimeout:8; //TXOP timeout value for TXOP truncation. It is recommended that (SLOT_TIME) > (TX_OP_TIMEOUT) > (RX_ACK_TIMEOUT) + UINT32 rsv2:8; // 1: HT non-STBC control frame enable + } field; + UINT32 word; +} TX_TIMEOUT_CFG_STRUC, *PTX_TIMEOUT_CFG_STRUC; +#endif +#define TX_RTY_CFG 0x134c +#ifdef RT_BIG_ENDIAN +typedef union GNU_PACKED _TX_RTY_CFG_STRUC { + struct { + UINT32 rsv:1; + UINT32 TxautoFBEnable:1; // Tx retry PHY rate auto fallback enable + UINT32 AggRtyMode:1; // Aggregate MPDU retry mode. 0:expired by retry limit, 1: expired by mpdu life timer + UINT32 NonAggRtyMode:1; // Non-Aggregate MPDU retry mode. 0:expired by retry limit, 1: expired by mpdu life timer + UINT32 LongRtyThre:12; // Long retry threshoold + UINT32 LongRtyLimit:8; //long retry limit + UINT32 ShortRtyLimit:8; // short retry limit + + } field; + UINT32 word; +} TX_RTY_CFG_STRUC, *PTX_RTY_CFG_STRUC; +#else +typedef union GNU_PACKED _TX_RTY_CFG_STRUC { + struct { + UINT32 ShortRtyLimit:8; // short retry limit + UINT32 LongRtyLimit:8; //long retry limit + UINT32 LongRtyThre:12; // Long retry threshoold + UINT32 NonAggRtyMode:1; // Non-Aggregate MPDU retry mode. 0:expired by retry limit, 1: expired by mpdu life timer + UINT32 AggRtyMode:1; // Aggregate MPDU retry mode. 0:expired by retry limit, 1: expired by mpdu life timer + UINT32 TxautoFBEnable:1; // Tx retry PHY rate auto fallback enable + UINT32 rsv:1; // 1: HT non-STBC control frame enable + } field; + UINT32 word; +} TX_RTY_CFG_STRUC, *PTX_RTY_CFG_STRUC; +#endif +#define TX_LINK_CFG 0x1350 +#ifdef RT_BIG_ENDIAN +typedef union GNU_PACKED _TX_LINK_CFG_STRUC { + struct GNU_PACKED { + UINT32 RemotMFS:8; //remote MCS feedback sequence number + UINT32 RemotMFB:8; // remote MCS feedback + UINT32 rsv:3; // + UINT32 TxCFAckEn:1; // Piggyback CF-ACK enable + UINT32 TxRDGEn:1; // RDG TX enable + UINT32 TxMRQEn:1; // MCS request TX enable + UINT32 RemoteUMFSEnable:1; // remote unsolicit MFB enable. 0: not apply remote remote unsolicit (MFS=7) + UINT32 MFBEnable:1; // TX apply remote MFB 1:enable + UINT32 RemoteMFBLifeTime:8; //remote MFB life time. unit : 32us + } field; + UINT32 word; +} TX_LINK_CFG_STRUC, *PTX_LINK_CFG_STRUC; +#else +typedef union GNU_PACKED _TX_LINK_CFG_STRUC { + struct GNU_PACKED { + UINT32 RemoteMFBLifeTime:8; //remote MFB life time. unit : 32us + UINT32 MFBEnable:1; // TX apply remote MFB 1:enable + UINT32 RemoteUMFSEnable:1; // remote unsolicit MFB enable. 0: not apply remote remote unsolicit (MFS=7) + UINT32 TxMRQEn:1; // MCS request TX enable + UINT32 TxRDGEn:1; // RDG TX enable + UINT32 TxCFAckEn:1; // Piggyback CF-ACK enable + UINT32 rsv:3; // + UINT32 RemotMFB:8; // remote MCS feedback + UINT32 RemotMFS:8; //remote MCS feedback sequence number + } field; + UINT32 word; +} TX_LINK_CFG_STRUC, *PTX_LINK_CFG_STRUC; +#endif +#define HT_FBK_CFG0 0x1354 +#ifdef RT_BIG_ENDIAN +typedef union GNU_PACKED _HT_FBK_CFG0_STRUC { + struct { + UINT32 HTMCS7FBK:4; + UINT32 HTMCS6FBK:4; + UINT32 HTMCS5FBK:4; + UINT32 HTMCS4FBK:4; + UINT32 HTMCS3FBK:4; + UINT32 HTMCS2FBK:4; + UINT32 HTMCS1FBK:4; + UINT32 HTMCS0FBK:4; + } field; + UINT32 word; +} HT_FBK_CFG0_STRUC, *PHT_FBK_CFG0_STRUC; +#else +typedef union GNU_PACKED _HT_FBK_CFG0_STRUC { + struct { + UINT32 HTMCS0FBK:4; + UINT32 HTMCS1FBK:4; + UINT32 HTMCS2FBK:4; + UINT32 HTMCS3FBK:4; + UINT32 HTMCS4FBK:4; + UINT32 HTMCS5FBK:4; + UINT32 HTMCS6FBK:4; + UINT32 HTMCS7FBK:4; + } field; + UINT32 word; +} HT_FBK_CFG0_STRUC, *PHT_FBK_CFG0_STRUC; +#endif +#define HT_FBK_CFG1 0x1358 +#ifdef RT_BIG_ENDIAN +typedef union _HT_FBK_CFG1_STRUC { + struct { + UINT32 HTMCS15FBK:4; + UINT32 HTMCS14FBK:4; + UINT32 HTMCS13FBK:4; + UINT32 HTMCS12FBK:4; + UINT32 HTMCS11FBK:4; + UINT32 HTMCS10FBK:4; + UINT32 HTMCS9FBK:4; + UINT32 HTMCS8FBK:4; + } field; + UINT32 word; +} HT_FBK_CFG1_STRUC, *PHT_FBK_CFG1_STRUC; +#else +typedef union _HT_FBK_CFG1_STRUC { + struct { + UINT32 HTMCS8FBK:4; + UINT32 HTMCS9FBK:4; + UINT32 HTMCS10FBK:4; + UINT32 HTMCS11FBK:4; + UINT32 HTMCS12FBK:4; + UINT32 HTMCS13FBK:4; + UINT32 HTMCS14FBK:4; + UINT32 HTMCS15FBK:4; + } field; + UINT32 word; +} HT_FBK_CFG1_STRUC, *PHT_FBK_CFG1_STRUC; +#endif +#define LG_FBK_CFG0 0x135c +#ifdef RT_BIG_ENDIAN +typedef union _LG_FBK_CFG0_STRUC { + struct { + UINT32 OFDMMCS7FBK:4; //initial value is 6 + UINT32 OFDMMCS6FBK:4; //initial value is 5 + UINT32 OFDMMCS5FBK:4; //initial value is 4 + UINT32 OFDMMCS4FBK:4; //initial value is 3 + UINT32 OFDMMCS3FBK:4; //initial value is 2 + UINT32 OFDMMCS2FBK:4; //initial value is 1 + UINT32 OFDMMCS1FBK:4; //initial value is 0 + UINT32 OFDMMCS0FBK:4; //initial value is 0 + } field; + UINT32 word; +} LG_FBK_CFG0_STRUC, *PLG_FBK_CFG0_STRUC; +#else +typedef union _LG_FBK_CFG0_STRUC { + struct { + UINT32 OFDMMCS0FBK:4; //initial value is 0 + UINT32 OFDMMCS1FBK:4; //initial value is 0 + UINT32 OFDMMCS2FBK:4; //initial value is 1 + UINT32 OFDMMCS3FBK:4; //initial value is 2 + UINT32 OFDMMCS4FBK:4; //initial value is 3 + UINT32 OFDMMCS5FBK:4; //initial value is 4 + UINT32 OFDMMCS6FBK:4; //initial value is 5 + UINT32 OFDMMCS7FBK:4; //initial value is 6 + } field; + UINT32 word; +} LG_FBK_CFG0_STRUC, *PLG_FBK_CFG0_STRUC; +#endif +#define LG_FBK_CFG1 0x1360 +#ifdef RT_BIG_ENDIAN +typedef union _LG_FBK_CFG1_STRUC { + struct { + UINT32 rsv:16; + UINT32 CCKMCS3FBK:4; //initial value is 2 + UINT32 CCKMCS2FBK:4; //initial value is 1 + UINT32 CCKMCS1FBK:4; //initial value is 0 + UINT32 CCKMCS0FBK:4; //initial value is 0 + } field; + UINT32 word; +} LG_FBK_CFG1_STRUC, *PLG_FBK_CFG1_STRUC; +#else +typedef union _LG_FBK_CFG1_STRUC { + struct { + UINT32 CCKMCS0FBK:4; //initial value is 0 + UINT32 CCKMCS1FBK:4; //initial value is 0 + UINT32 CCKMCS2FBK:4; //initial value is 1 + UINT32 CCKMCS3FBK:4; //initial value is 2 + UINT32 rsv:16; + } field; + UINT32 word; +} LG_FBK_CFG1_STRUC, *PLG_FBK_CFG1_STRUC; +#endif + + +//======================================================= +//================ Protection Paramater================================ +//======================================================= +#define CCK_PROT_CFG 0x1364 //CCK Protection +#define ASIC_SHORTNAV 1 +#define ASIC_LONGNAV 2 +#define ASIC_RTS 1 +#define ASIC_CTS 2 +#ifdef RT_BIG_ENDIAN +typedef union _PROT_CFG_STRUC { + struct { + UINT32 rsv:5; + UINT32 RTSThEn:1; //RTS threshold enable on CCK TX + UINT32 TxopAllowGF40:1; //CCK TXOP allowance.0:disallow. + UINT32 TxopAllowGF20:1; //CCK TXOP allowance.0:disallow. + UINT32 TxopAllowMM40:1; //CCK TXOP allowance.0:disallow. + UINT32 TxopAllowMM20:1; //CCK TXOP allowance. 0:disallow. + UINT32 TxopAllowOfdm:1; //CCK TXOP allowance.0:disallow. + UINT32 TxopAllowCck:1; //CCK TXOP allowance.0:disallow. + UINT32 ProtectNav:2; //TXOP protection type for CCK TX. 0:None, 1:ShortNAVprotect, 2:LongNAVProtect, 3:rsv + UINT32 ProtectCtrl:2; //Protection control frame type for CCK TX. 1:RTS/CTS, 2:CTS-to-self, 0:None, 3:rsv + UINT32 ProtectRate:16; //Protection control frame rate for CCK TX(RTS/CTS/CFEnd). + } field; + UINT32 word; +} PROT_CFG_STRUC, *PPROT_CFG_STRUC; +#else +typedef union _PROT_CFG_STRUC { + struct { + UINT32 ProtectRate:16; //Protection control frame rate for CCK TX(RTS/CTS/CFEnd). + UINT32 ProtectCtrl:2; //Protection control frame type for CCK TX. 1:RTS/CTS, 2:CTS-to-self, 0:None, 3:rsv + UINT32 ProtectNav:2; //TXOP protection type for CCK TX. 0:None, 1:ShortNAVprotect, 2:LongNAVProtect, 3:rsv + UINT32 TxopAllowCck:1; //CCK TXOP allowance.0:disallow. + UINT32 TxopAllowOfdm:1; //CCK TXOP allowance.0:disallow. + UINT32 TxopAllowMM20:1; //CCK TXOP allowance. 0:disallow. + UINT32 TxopAllowMM40:1; //CCK TXOP allowance.0:disallow. + UINT32 TxopAllowGF20:1; //CCK TXOP allowance.0:disallow. + UINT32 TxopAllowGF40:1; //CCK TXOP allowance.0:disallow. + UINT32 RTSThEn:1; //RTS threshold enable on CCK TX + UINT32 rsv:5; + } field; + UINT32 word; +} PROT_CFG_STRUC, *PPROT_CFG_STRUC; +#endif + +#define OFDM_PROT_CFG 0x1368 //OFDM Protection +#define MM20_PROT_CFG 0x136C //MM20 Protection +#define MM40_PROT_CFG 0x1370 //MM40 Protection +#define GF20_PROT_CFG 0x1374 //GF20 Protection +#define GF40_PROT_CFG 0x1378 //GR40 Protection +#define EXP_CTS_TIME 0x137C // +#define EXP_ACK_TIME 0x1380 // + +// +// 4.4 MAC RX configuration registers (offset:0x1400) +// +#define RX_FILTR_CFG 0x1400 //TXRX_CSR0 +#define AUTO_RSP_CFG 0x1404 //TXRX_CSR4 +// +// TXRX_CSR4: Auto-Responder/ +// +#ifdef RT_BIG_ENDIAN +typedef union _AUTO_RSP_CFG_STRUC { + struct { + UINT32 :24; + UINT32 AckCtsPsmBit:1; // Power bit value in conrtrol frame + UINT32 DualCTSEn:1; // Power bit value in conrtrol frame + UINT32 rsv:1; // Power bit value in conrtrol frame + UINT32 AutoResponderPreamble:1; // 0:long, 1:short preamble + UINT32 CTS40MRef:1; // Response CTS 40MHz duplicate mode + UINT32 CTS40MMode:1; // Response CTS 40MHz duplicate mode + UINT32 BACAckPolicyEnable:1; // 0:long, 1:short preamble + UINT32 AutoResponderEnable:1; + } field; + UINT32 word; +} AUTO_RSP_CFG_STRUC, *PAUTO_RSP_CFG_STRUC; +#else +typedef union _AUTO_RSP_CFG_STRUC { + struct { + UINT32 AutoResponderEnable:1; + UINT32 BACAckPolicyEnable:1; // 0:long, 1:short preamble + UINT32 CTS40MMode:1; // Response CTS 40MHz duplicate mode + UINT32 CTS40MRef:1; // Response CTS 40MHz duplicate mode + UINT32 AutoResponderPreamble:1; // 0:long, 1:short preamble + UINT32 rsv:1; // Power bit value in conrtrol frame + UINT32 DualCTSEn:1; // Power bit value in conrtrol frame + UINT32 AckCtsPsmBit:1; // Power bit value in conrtrol frame + UINT32 :24; + } field; + UINT32 word; +} AUTO_RSP_CFG_STRUC, *PAUTO_RSP_CFG_STRUC; +#endif + +#define LEGACY_BASIC_RATE 0x1408 // TXRX_CSR5 0x3054 +#define HT_BASIC_RATE 0x140c +#define HT_CTRL_CFG 0x1410 +#define SIFS_COST_CFG 0x1414 +#define RX_PARSER_CFG 0x1418 //Set NAV for all received frames + +// +// 4.5 MAC Security configuration (offset:0x1500) +// +#define TX_SEC_CNT0 0x1500 // +#define RX_SEC_CNT0 0x1504 // +#define CCMP_FC_MUTE 0x1508 // +// +// 4.6 HCCA/PSMP (offset:0x1600) +// +#define TXOP_HLDR_ADDR0 0x1600 +#define TXOP_HLDR_ADDR1 0x1604 +#define TXOP_HLDR_ET 0x1608 +#define QOS_CFPOLL_RA_DW0 0x160c +#define QOS_CFPOLL_A1_DW1 0x1610 +#define QOS_CFPOLL_QC 0x1614 +// +// 4.7 MAC Statistis registers (offset:0x1700) +// +#define RX_STA_CNT0 0x1700 // +#define RX_STA_CNT1 0x1704 // +#define RX_STA_CNT2 0x1708 // + +// +// RX_STA_CNT0_STRUC: RX PLCP error count & RX CRC error count +// +#ifdef RT_BIG_ENDIAN +typedef union _RX_STA_CNT0_STRUC { + struct { + USHORT PhyErr; + USHORT CrcErr; + } field; + UINT32 word; +} RX_STA_CNT0_STRUC, *PRX_STA_CNT0_STRUC; +#else +typedef union _RX_STA_CNT0_STRUC { + struct { + USHORT CrcErr; + USHORT PhyErr; + } field; + UINT32 word; +} RX_STA_CNT0_STRUC, *PRX_STA_CNT0_STRUC; +#endif + +// +// RX_STA_CNT1_STRUC: RX False CCA count & RX LONG frame count +// +#ifdef RT_BIG_ENDIAN +typedef union _RX_STA_CNT1_STRUC { + struct { + USHORT PlcpErr; + USHORT FalseCca; + } field; + UINT32 word; +} RX_STA_CNT1_STRUC, *PRX_STA_CNT1_STRUC; +#else +typedef union _RX_STA_CNT1_STRUC { + struct { + USHORT FalseCca; + USHORT PlcpErr; + } field; + UINT32 word; +} RX_STA_CNT1_STRUC, *PRX_STA_CNT1_STRUC; +#endif + +// +// RX_STA_CNT2_STRUC: +// +#ifdef RT_BIG_ENDIAN +typedef union _RX_STA_CNT2_STRUC { + struct { + USHORT RxFifoOverflowCount; + USHORT RxDupliCount; + } field; + UINT32 word; +} RX_STA_CNT2_STRUC, *PRX_STA_CNT2_STRUC; +#else +typedef union _RX_STA_CNT2_STRUC { + struct { + USHORT RxDupliCount; + USHORT RxFifoOverflowCount; + } field; + UINT32 word; +} RX_STA_CNT2_STRUC, *PRX_STA_CNT2_STRUC; +#endif +#define TX_STA_CNT0 0x170C // +// +// STA_CSR3: TX Beacon count +// +#ifdef RT_BIG_ENDIAN +typedef union _TX_STA_CNT0_STRUC { + struct { + USHORT TxBeaconCount; + USHORT TxFailCount; + } field; + UINT32 word; +} TX_STA_CNT0_STRUC, *PTX_STA_CNT0_STRUC; +#else +typedef union _TX_STA_CNT0_STRUC { + struct { + USHORT TxFailCount; + USHORT TxBeaconCount; + } field; + UINT32 word; +} TX_STA_CNT0_STRUC, *PTX_STA_CNT0_STRUC; +#endif +#define TX_STA_CNT1 0x1710 // +// +// TX_STA_CNT1: TX tx count +// +#ifdef RT_BIG_ENDIAN +typedef union _TX_STA_CNT1_STRUC { + struct { + USHORT TxRetransmit; + USHORT TxSuccess; + } field; + UINT32 word; +} TX_STA_CNT1_STRUC, *PTX_STA_CNT1_STRUC; +#else +typedef union _TX_STA_CNT1_STRUC { + struct { + USHORT TxSuccess; + USHORT TxRetransmit; + } field; + UINT32 word; +} TX_STA_CNT1_STRUC, *PTX_STA_CNT1_STRUC; +#endif +#define TX_STA_CNT2 0x1714 // +// +// TX_STA_CNT2: TX tx count +// +#ifdef RT_BIG_ENDIAN +typedef union _TX_STA_CNT2_STRUC { + struct { + USHORT TxUnderFlowCount; + USHORT TxZeroLenCount; + } field; + UINT32 word; +} TX_STA_CNT2_STRUC, *PTX_STA_CNT2_STRUC; +#else +typedef union _TX_STA_CNT2_STRUC { + struct { + USHORT TxZeroLenCount; + USHORT TxUnderFlowCount; + } field; + UINT32 word; +} TX_STA_CNT2_STRUC, *PTX_STA_CNT2_STRUC; +#endif +#define TX_STA_FIFO 0x1718 // +// +// TX_STA_FIFO_STRUC: TX Result for specific PID status fifo register +// +#ifdef RT_BIG_ENDIAN +typedef union GNU_PACKED _TX_STA_FIFO_STRUC { + struct { + UINT32 Reserve:2; + UINT32 TxBF:1; // 3*3 + UINT32 SuccessRate:13; //include MCS, mode ,shortGI, BW settingSame format as TXWI Word 0 Bit 31-16. +// UINT32 SuccessRate:16; //include MCS, mode ,shortGI, BW settingSame format as TXWI Word 0 Bit 31-16. + UINT32 wcid:8; //wireless client index + UINT32 TxAckRequired:1; // ack required + UINT32 TxAggre:1; // Tx is aggregated + UINT32 TxSuccess:1; // Tx success. whether success or not + UINT32 PidType:4; + UINT32 bValid:1; // 1:This register contains a valid TX result + } field; + UINT32 word; +} TX_STA_FIFO_STRUC, *PTX_STA_FIFO_STRUC; +#else +typedef union GNU_PACKED _TX_STA_FIFO_STRUC { + struct { + UINT32 bValid:1; // 1:This register contains a valid TX result + UINT32 PidType:4; + UINT32 TxSuccess:1; // Tx No retry success + UINT32 TxAggre:1; // Tx Retry Success + UINT32 TxAckRequired:1; // Tx fail + UINT32 wcid:8; //wireless client index +// UINT32 SuccessRate:16; //include MCS, mode ,shortGI, BW settingSame format as TXWI Word 0 Bit 31-16. + UINT32 SuccessRate:13; //include MCS, mode ,shortGI, BW settingSame format as TXWI Word 0 Bit 31-16. + UINT32 TxBF:1; + UINT32 Reserve:2; + } field; + UINT32 word; +} TX_STA_FIFO_STRUC, *PTX_STA_FIFO_STRUC; +#endif +// Debug counter +#define TX_AGG_CNT 0x171c +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT_STRUC { + struct { + USHORT AggTxCount; + USHORT NonAggTxCount; + } field; + UINT32 word; +} TX_AGG_CNT_STRUC, *PTX_AGG_CNT_STRUC; +#else +typedef union _TX_AGG_CNT_STRUC { + struct { + USHORT NonAggTxCount; + USHORT AggTxCount; + } field; + UINT32 word; +} TX_AGG_CNT_STRUC, *PTX_AGG_CNT_STRUC; +#endif +// Debug counter +#define TX_AGG_CNT0 0x1720 +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT0_STRUC { + struct { + USHORT AggSize2Count; + USHORT AggSize1Count; + } field; + UINT32 word; +} TX_AGG_CNT0_STRUC, *PTX_AGG_CNT0_STRUC; +#else +typedef union _TX_AGG_CNT0_STRUC { + struct { + USHORT AggSize1Count; + USHORT AggSize2Count; + } field; + UINT32 word; +} TX_AGG_CNT0_STRUC, *PTX_AGG_CNT0_STRUC; +#endif +// Debug counter +#define TX_AGG_CNT1 0x1724 +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT1_STRUC { + struct { + USHORT AggSize4Count; + USHORT AggSize3Count; + } field; + UINT32 word; +} TX_AGG_CNT1_STRUC, *PTX_AGG_CNT1_STRUC; +#else +typedef union _TX_AGG_CNT1_STRUC { + struct { + USHORT AggSize3Count; + USHORT AggSize4Count; + } field; + UINT32 word; +} TX_AGG_CNT1_STRUC, *PTX_AGG_CNT1_STRUC; +#endif +#define TX_AGG_CNT2 0x1728 +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT2_STRUC { + struct { + USHORT AggSize6Count; + USHORT AggSize5Count; + } field; + UINT32 word; +} TX_AGG_CNT2_STRUC, *PTX_AGG_CNT2_STRUC; +#else +typedef union _TX_AGG_CNT2_STRUC { + struct { + USHORT AggSize5Count; + USHORT AggSize6Count; + } field; + UINT32 word; +} TX_AGG_CNT2_STRUC, *PTX_AGG_CNT2_STRUC; +#endif +// Debug counter +#define TX_AGG_CNT3 0x172c +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT3_STRUC { + struct { + USHORT AggSize8Count; + USHORT AggSize7Count; + } field; + UINT32 word; +} TX_AGG_CNT3_STRUC, *PTX_AGG_CNT3_STRUC; +#else +typedef union _TX_AGG_CNT3_STRUC { + struct { + USHORT AggSize7Count; + USHORT AggSize8Count; + } field; + UINT32 word; +} TX_AGG_CNT3_STRUC, *PTX_AGG_CNT3_STRUC; +#endif +// Debug counter +#define TX_AGG_CNT4 0x1730 +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT4_STRUC { + struct { + USHORT AggSize10Count; + USHORT AggSize9Count; + } field; + UINT32 word; +} TX_AGG_CNT4_STRUC, *PTX_AGG_CNT4_STRUC; +#else +typedef union _TX_AGG_CNT4_STRUC { + struct { + USHORT AggSize9Count; + USHORT AggSize10Count; + } field; + UINT32 word; +} TX_AGG_CNT4_STRUC, *PTX_AGG_CNT4_STRUC; +#endif +#define TX_AGG_CNT5 0x1734 +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT5_STRUC { + struct { + USHORT AggSize12Count; + USHORT AggSize11Count; + } field; + UINT32 word; +} TX_AGG_CNT5_STRUC, *PTX_AGG_CNT5_STRUC; +#else +typedef union _TX_AGG_CNT5_STRUC { + struct { + USHORT AggSize11Count; + USHORT AggSize12Count; + } field; + UINT32 word; +} TX_AGG_CNT5_STRUC, *PTX_AGG_CNT5_STRUC; +#endif +#define TX_AGG_CNT6 0x1738 +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT6_STRUC { + struct { + USHORT AggSize14Count; + USHORT AggSize13Count; + } field; + UINT32 word; +} TX_AGG_CNT6_STRUC, *PTX_AGG_CNT6_STRUC; +#else +typedef union _TX_AGG_CNT6_STRUC { + struct { + USHORT AggSize13Count; + USHORT AggSize14Count; + } field; + UINT32 word; +} TX_AGG_CNT6_STRUC, *PTX_AGG_CNT6_STRUC; +#endif +#define TX_AGG_CNT7 0x173c +#ifdef RT_BIG_ENDIAN +typedef union _TX_AGG_CNT7_STRUC { + struct { + USHORT AggSize16Count; + USHORT AggSize15Count; + } field; + UINT32 word; +} TX_AGG_CNT7_STRUC, *PTX_AGG_CNT7_STRUC; +#else +typedef union _TX_AGG_CNT7_STRUC { + struct { + USHORT AggSize15Count; + USHORT AggSize16Count; + } field; + UINT32 word; +} TX_AGG_CNT7_STRUC, *PTX_AGG_CNT7_STRUC; +#endif +#define MPDU_DENSITY_CNT 0x1740 +#ifdef RT_BIG_ENDIAN +typedef union _MPDU_DEN_CNT_STRUC { + struct { + USHORT RXZeroDelCount; //RX zero length delimiter count + USHORT TXZeroDelCount; //TX zero length delimiter count + } field; + UINT32 word; +} MPDU_DEN_CNT_STRUC, *PMPDU_DEN_CNT_STRUC; +#else +typedef union _MPDU_DEN_CNT_STRUC { + struct { + USHORT TXZeroDelCount; //TX zero length delimiter count + USHORT RXZeroDelCount; //RX zero length delimiter count + } field; + UINT32 word; +} MPDU_DEN_CNT_STRUC, *PMPDU_DEN_CNT_STRUC; +#endif +// +// TXRX control registers - base address 0x3000 +// +// rt2860b UNKNOWN reg use R/O Reg Addr 0x77d0 first.. +#define TXRX_CSR1 0x77d0 + +// +// Security key table memory, base address = 0x1000 +// +#define MAC_WCID_BASE 0x1800 //8-bytes(use only 6-bytes) * 256 entry = +#define HW_WCID_ENTRY_SIZE 8 +#define PAIRWISE_KEY_TABLE_BASE 0x4000 // 32-byte * 256-entry = -byte +#define HW_KEY_ENTRY_SIZE 0x20 +#define PAIRWISE_IVEIV_TABLE_BASE 0x6000 // 8-byte * 256-entry = -byte +#define MAC_IVEIV_TABLE_BASE 0x6000 // 8-byte * 256-entry = -byte +#define HW_IVEIV_ENTRY_SIZE 8 +#define MAC_WCID_ATTRIBUTE_BASE 0x6800 // 4-byte * 256-entry = -byte +#define HW_WCID_ATTRI_SIZE 4 +#define WCID_RESERVED 0x6bfc +#define SHARED_KEY_TABLE_BASE 0x6c00 // 32-byte * 16-entry = 512-byte +#define SHARED_KEY_MODE_BASE 0x7000 // 32-byte * 16-entry = 512-byte +#define HW_SHARED_KEY_MODE_SIZE 4 +#define SHAREDKEYTABLE 0 +#define PAIRWISEKEYTABLE 1 + +/* This resgiser is ONLY be supported for RT3883 or later. + It conflicted with BCN#0 offset of previous chipset. */ +#define WAPI_PN_TABLE_BASE 0x7800 +#define WAPI_PN_ENTRY_SIZE 8 + +#ifdef RT_BIG_ENDIAN +typedef union _SHAREDKEY_MODE_STRUC { + struct { + UINT32 Bss1Key3CipherAlg:4; + UINT32 Bss1Key2CipherAlg:4; + UINT32 Bss1Key1CipherAlg:4; + UINT32 Bss1Key0CipherAlg:4; + UINT32 Bss0Key3CipherAlg:4; + UINT32 Bss0Key2CipherAlg:4; + UINT32 Bss0Key1CipherAlg:4; + UINT32 Bss0Key0CipherAlg:4; + } field; + UINT32 word; +} SHAREDKEY_MODE_STRUC, *PSHAREDKEY_MODE_STRUC; +#else +typedef union _SHAREDKEY_MODE_STRUC { + struct { + UINT32 Bss0Key0CipherAlg:4; + UINT32 Bss0Key1CipherAlg:4; + UINT32 Bss0Key2CipherAlg:4; + UINT32 Bss0Key3CipherAlg:4; + UINT32 Bss1Key0CipherAlg:4; + UINT32 Bss1Key1CipherAlg:4; + UINT32 Bss1Key2CipherAlg:4; + UINT32 Bss1Key3CipherAlg:4; + } field; + UINT32 word; +} SHAREDKEY_MODE_STRUC, *PSHAREDKEY_MODE_STRUC; +#endif +// 64-entry for pairwise key table +typedef struct _HW_WCID_ENTRY { // 8-byte per entry + UCHAR Address[6]; + UCHAR Rsv[2]; +} HW_WCID_ENTRY, PHW_WCID_ENTRY; + + +// ================================================================================= +// WCID format +// ================================================================================= +//7.1 WCID ENTRY format : 8bytes +typedef struct _WCID_ENTRY_STRUC { + UCHAR RXBABitmap7; // bit0 for TID8, bit7 for TID 15 + UCHAR RXBABitmap0; // bit0 for TID0, bit7 for TID 7 + UCHAR MAC[6]; // 0 for shared key table. 1 for pairwise key table +} WCID_ENTRY_STRUC, *PWCID_ENTRY_STRUC; + +//8.1.1 SECURITY KEY format : 8DW +// 32-byte per entry, total 16-entry for shared key table, 64-entry for pairwise key table +typedef struct _HW_KEY_ENTRY { // 32-byte per entry + UCHAR Key[16]; + UCHAR TxMic[8]; + UCHAR RxMic[8]; +} HW_KEY_ENTRY, *PHW_KEY_ENTRY; + +//8.1.2 IV/EIV format : 2DW + +// RX attribute entry format : 1DW +#ifdef RT_BIG_ENDIAN +typedef union _WCID_ATTRIBUTE_STRUC { + struct { + UINT32 WAPIKeyIdx:8; + UINT32 WAPI_rsv:8; + UINT32 WAPI_MCBC:1; + UINT32 rsv:3; + UINT32 BSSIdxExt:1; + UINT32 PairKeyModeExt:1; + UINT32 RXWIUDF:3; + UINT32 BSSIdx:3; //multipleBSS index for the WCID + UINT32 PairKeyMode:3; + UINT32 KeyTab:1; // 0 for shared key table. 1 for pairwise key table + } field; + UINT32 word; +} WCID_ATTRIBUTE_STRUC, *PWCID_ATTRIBUTE_STRUC; +#else +typedef union _WCID_ATTRIBUTE_STRUC { + struct { + UINT32 KeyTab:1; // 0 for shared key table. 1 for pairwise key table + UINT32 PairKeyMode:3; + UINT32 BSSIdx:3; //multipleBSS index for the WCID + UINT32 RXWIUDF:3; + UINT32 PairKeyModeExt:1; + UINT32 BSSIdxExt:1; + UINT32 rsv:3; + UINT32 WAPI_MCBC:1; + UINT32 WAPI_rsv:8; + UINT32 WAPIKeyIdx:8; + } field; + UINT32 word; +} WCID_ATTRIBUTE_STRUC, *PWCID_ATTRIBUTE_STRUC; +#endif + + +// ================================================================================= +// HOST-MCU communication data structure +// ================================================================================= + +// +// H2M_MAILBOX_CSR: Host-to-MCU Mailbox +// +#ifdef RT_BIG_ENDIAN +typedef union _H2M_MAILBOX_STRUC { + struct { + UINT32 Owner:8; + UINT32 CmdToken:8; // 0xff tells MCU not to report CmdDoneInt after excuting the command + UINT32 HighByte:8; + UINT32 LowByte:8; + } field; + UINT32 word; +} H2M_MAILBOX_STRUC, *PH2M_MAILBOX_STRUC; +#else +typedef union _H2M_MAILBOX_STRUC { + struct { + UINT32 LowByte:8; + UINT32 HighByte:8; + UINT32 CmdToken:8; + UINT32 Owner:8; + } field; + UINT32 word; +} H2M_MAILBOX_STRUC, *PH2M_MAILBOX_STRUC; +#endif + +// +// M2H_CMD_DONE_CSR: MCU-to-Host command complete indication +// +#ifdef RT_BIG_ENDIAN +typedef union _M2H_CMD_DONE_STRUC { + struct { + UINT32 CmdToken3; + UINT32 CmdToken2; + UINT32 CmdToken1; + UINT32 CmdToken0; + } field; + UINT32 word; +} M2H_CMD_DONE_STRUC, *PM2H_CMD_DONE_STRUC; +#else +typedef union _M2H_CMD_DONE_STRUC { + struct { + UINT32 CmdToken0; + UINT32 CmdToken1; + UINT32 CmdToken2; + UINT32 CmdToken3; + } field; + UINT32 word; +} M2H_CMD_DONE_STRUC, *PM2H_CMD_DONE_STRUC; +#endif + + +//NAV_TIME_CFG :NAV +#ifdef RT_BIG_ENDIAN +typedef union _NAV_TIME_CFG_STRUC { + struct { + USHORT rsv:6; + USHORT ZeroSifs:1; // Applied zero SIFS timer after OFDM RX 0: disable + USHORT Eifs:9; // in unit of 1-us + UCHAR SlotTime; // in unit of 1-us + UCHAR Sifs; // in unit of 1-us + } field; + UINT32 word; +} NAV_TIME_CFG_STRUC, *PNAV_TIME_CFG_STRUC; +#else +typedef union _NAV_TIME_CFG_STRUC { + struct { + UCHAR Sifs; // in unit of 1-us + UCHAR SlotTime; // in unit of 1-us + USHORT Eifs:9; // in unit of 1-us + USHORT ZeroSifs:1; // Applied zero SIFS timer after OFDM RX 0: disable + USHORT rsv:6; + } field; + UINT32 word; +} NAV_TIME_CFG_STRUC, *PNAV_TIME_CFG_STRUC; +#endif + + +// +// RX_FILTR_CFG: /RX configuration register +// +#ifdef RT_BIG_ENDIAN +typedef union RX_FILTR_CFG_STRUC { + struct { + UINT32 :15; + UINT32 DropRsvCntlType:1; + + UINT32 DropBAR:1; // + UINT32 DropBA:1; // + UINT32 DropPsPoll:1; // Drop Ps-Poll + UINT32 DropRts:1; // Drop Ps-Poll + + UINT32 DropCts:1; // Drop Ps-Poll + UINT32 DropAck:1; // Drop Ps-Poll + UINT32 DropCFEnd:1; // Drop Ps-Poll + UINT32 DropCFEndAck:1; // Drop Ps-Poll + + UINT32 DropDuplicate:1; // Drop duplicate frame + UINT32 DropBcast:1; // Drop broadcast frames + UINT32 DropMcast:1; // Drop multicast frames + UINT32 DropVerErr:1; // Drop version error frame + + UINT32 DropNotMyBSSID:1; // Drop fram ToDs bit is true + UINT32 DropNotToMe:1; // Drop not to me unicast frame + UINT32 DropPhyErr:1; // Drop physical error + UINT32 DropCRCErr:1; // Drop CRC error + } field; + UINT32 word; +} RX_FILTR_CFG_STRUC, *PRX_FILTR_CFG_STRUC; +#else +typedef union _RX_FILTR_CFG_STRUC { + struct { + UINT32 DropCRCErr:1; // Drop CRC error + UINT32 DropPhyErr:1; // Drop physical error + UINT32 DropNotToMe:1; // Drop not to me unicast frame + UINT32 DropNotMyBSSID:1; // Drop fram ToDs bit is true + + UINT32 DropVerErr:1; // Drop version error frame + UINT32 DropMcast:1; // Drop multicast frames + UINT32 DropBcast:1; // Drop broadcast frames + UINT32 DropDuplicate:1; // Drop duplicate frame + + UINT32 DropCFEndAck:1; // Drop Ps-Poll + UINT32 DropCFEnd:1; // Drop Ps-Poll + UINT32 DropAck:1; // Drop Ps-Poll + UINT32 DropCts:1; // Drop Ps-Poll + + UINT32 DropRts:1; // Drop Ps-Poll + UINT32 DropPsPoll:1; // Drop Ps-Poll + UINT32 DropBA:1; // + UINT32 DropBAR:1; // + + UINT32 DropRsvCntlType:1; + UINT32 :15; + } field; + UINT32 word; +} RX_FILTR_CFG_STRUC, *PRX_FILTR_CFG_STRUC; +#endif + + + + +// +// PHY_CSR4: RF serial control register +// +#ifdef RT_BIG_ENDIAN +typedef union _PHY_CSR4_STRUC { + struct { + UINT32 Busy:1; // 1: ASIC is busy execute RF programming. + UINT32 PLL_LD:1; // RF PLL_LD status + UINT32 IFSelect:1; // 1: select IF to program, 0: select RF to program + UINT32 NumberOfBits:5; // Number of bits used in RFRegValue (I:20, RFMD:22) + UINT32 RFRegValue:24; // Register value (include register id) serial out to RF/IF chip. + } field; + UINT32 word; +} PHY_CSR4_STRUC, *PPHY_CSR4_STRUC; +#else +typedef union _PHY_CSR4_STRUC { + struct { + UINT32 RFRegValue:24; // Register value (include register id) serial out to RF/IF chip. + UINT32 NumberOfBits:5; // Number of bits used in RFRegValue (I:20, RFMD:22) + UINT32 IFSelect:1; // 1: select IF to program, 0: select RF to program + UINT32 PLL_LD:1; // RF PLL_LD status + UINT32 Busy:1; // 1: ASIC is busy execute RF programming. + } field; + UINT32 word; +} PHY_CSR4_STRUC, *PPHY_CSR4_STRUC; +#endif + + +// +// SEC_CSR5: shared key table security mode register +// +#ifdef RT_BIG_ENDIAN +typedef union _SEC_CSR5_STRUC { + struct { + UINT32 :1; + UINT32 Bss3Key3CipherAlg:3; + UINT32 :1; + UINT32 Bss3Key2CipherAlg:3; + UINT32 :1; + UINT32 Bss3Key1CipherAlg:3; + UINT32 :1; + UINT32 Bss3Key0CipherAlg:3; + UINT32 :1; + UINT32 Bss2Key3CipherAlg:3; + UINT32 :1; + UINT32 Bss2Key2CipherAlg:3; + UINT32 :1; + UINT32 Bss2Key1CipherAlg:3; + UINT32 :1; + UINT32 Bss2Key0CipherAlg:3; + } field; + UINT32 word; +} SEC_CSR5_STRUC, *PSEC_CSR5_STRUC; +#else +typedef union _SEC_CSR5_STRUC { + struct { + UINT32 Bss2Key0CipherAlg:3; + UINT32 :1; + UINT32 Bss2Key1CipherAlg:3; + UINT32 :1; + UINT32 Bss2Key2CipherAlg:3; + UINT32 :1; + UINT32 Bss2Key3CipherAlg:3; + UINT32 :1; + UINT32 Bss3Key0CipherAlg:3; + UINT32 :1; + UINT32 Bss3Key1CipherAlg:3; + UINT32 :1; + UINT32 Bss3Key2CipherAlg:3; + UINT32 :1; + UINT32 Bss3Key3CipherAlg:3; + UINT32 :1; + } field; + UINT32 word; +} SEC_CSR5_STRUC, *PSEC_CSR5_STRUC; +#endif + + +// +// HOST_CMD_CSR: For HOST to interrupt embedded processor +// +#ifdef RT_BIG_ENDIAN +typedef union _HOST_CMD_CSR_STRUC { + struct { + UINT32 Rsv:24; + UINT32 HostCommand:8; + } field; + UINT32 word; +} HOST_CMD_CSR_STRUC, *PHOST_CMD_CSR_STRUC; +#else +typedef union _HOST_CMD_CSR_STRUC { + struct { + UINT32 HostCommand:8; + UINT32 Rsv:24; + } field; + UINT32 word; +} HOST_CMD_CSR_STRUC, *PHOST_CMD_CSR_STRUC; +#endif + + +// +// AIFSN_CSR: AIFSN for each EDCA AC +// + + + +// +// E2PROM_CSR: EEPROM control register +// +#ifdef RT_BIG_ENDIAN +typedef union _E2PROM_CSR_STRUC { + struct { + UINT32 Rsvd:25; + UINT32 LoadStatus:1; // 1:loading, 0:done + UINT32 Type:1; // 1: 93C46, 0:93C66 + UINT32 EepromDO:1; + UINT32 EepromDI:1; + UINT32 EepromCS:1; + UINT32 EepromSK:1; + UINT32 Reload:1; // Reload EEPROM content, write one to reload, self-cleared. + } field; + UINT32 word; +} E2PROM_CSR_STRUC, *PE2PROM_CSR_STRUC; +#else +typedef union _E2PROM_CSR_STRUC { + struct { + UINT32 Reload:1; // Reload EEPROM content, write one to reload, self-cleared. + UINT32 EepromSK:1; + UINT32 EepromCS:1; + UINT32 EepromDI:1; + UINT32 EepromDO:1; + UINT32 Type:1; // 1: 93C46, 0:93C66 + UINT32 LoadStatus:1; // 1:loading, 0:done + UINT32 Rsvd:25; + } field; + UINT32 word; +} E2PROM_CSR_STRUC, *PE2PROM_CSR_STRUC; +#endif + +// +// QOS_CSR0: TXOP holder address0 register +// +#ifdef RT_BIG_ENDIAN +typedef union _QOS_CSR0_STRUC { + struct { + UCHAR Byte3; // MAC address byte 3 + UCHAR Byte2; // MAC address byte 2 + UCHAR Byte1; // MAC address byte 1 + UCHAR Byte0; // MAC address byte 0 + } field; + UINT32 word; +} QOS_CSR0_STRUC, *PQOS_CSR0_STRUC; +#else +typedef union _QOS_CSR0_STRUC { + struct { + UCHAR Byte0; // MAC address byte 0 + UCHAR Byte1; // MAC address byte 1 + UCHAR Byte2; // MAC address byte 2 + UCHAR Byte3; // MAC address byte 3 + } field; + UINT32 word; +} QOS_CSR0_STRUC, *PQOS_CSR0_STRUC; +#endif + +// +// QOS_CSR1: TXOP holder address1 register +// +#ifdef RT_BIG_ENDIAN +typedef union _QOS_CSR1_STRUC { + struct { + UCHAR Rsvd1; + UCHAR Rsvd0; + UCHAR Byte5; // MAC address byte 5 + UCHAR Byte4; // MAC address byte 4 + } field; + UINT32 word; +} QOS_CSR1_STRUC, *PQOS_CSR1_STRUC; +#else +typedef union _QOS_CSR1_STRUC { + struct { + UCHAR Byte4; // MAC address byte 4 + UCHAR Byte5; // MAC address byte 5 + UCHAR Rsvd0; + UCHAR Rsvd1; + } field; + UINT32 word; +} QOS_CSR1_STRUC, *PQOS_CSR1_STRUC; +#endif + +#define RF_CSR_CFG 0x500 +#ifdef RT_BIG_ENDIAN +typedef union _RF_CSR_CFG_STRUC { + struct { + UINT Rsvd1:14; // Reserved + UINT RF_CSR_KICK:1; // kick RF register read/write + UINT RF_CSR_WR:1; // 0: read 1: write + UINT Rsvd2:3; // Reserved + UINT TESTCSR_RFACC_REGNUM:5; // RF register ID + UINT RF_CSR_DATA:8; // DATA + } field; + UINT word; +} RF_CSR_CFG_STRUC, *PRF_CSR_CFG_STRUC; +#else +typedef union _RF_CSR_CFG_STRUC { + struct { + UINT RF_CSR_DATA:8; // DATA + UINT TESTCSR_RFACC_REGNUM:5; // RF register ID + UINT Rsvd2:3; // Reserved + UINT RF_CSR_WR:1; // 0: read 1: write + UINT RF_CSR_KICK:1; // kick RF register read/write + UINT Rsvd1:14; // Reserved + } field; + UINT word; +} RF_CSR_CFG_STRUC, *PRF_CSR_CFG_STRUC; +#endif + + +// +// Other on-chip shared memory space, base = 0x2000 +// + +// CIS space - base address = 0x2000 +#define HW_CIS_BASE 0x2000 + +// Carrier-sense CTS frame base address. It's where mac stores carrier-sense frame for carrier-sense function. +#define HW_CS_CTS_BASE 0x7700 +// DFS CTS frame base address. It's where mac stores CTS frame for DFS. +#define HW_DFS_CTS_BASE 0x7780 +#define HW_CTS_FRAME_SIZE 0x80 + +// 2004-11-08 john - since NULL frame won't be that long (256 byte). We steal 16 tail bytes +// to save debugging settings +#define HW_DEBUG_SETTING_BASE 0x77f0 // 0x77f0~0x77ff total 16 bytes +#define HW_DEBUG_SETTING_BASE2 0x7770 // 0x77f0~0x77ff total 16 bytes + +// In order to support maximum 8 MBSS and its maximum length is 512 for each beacon +// Three section discontinue memory segments will be used. +// 1. The original region for BCN 0~3 +// 2. Extract memory from FCE table for BCN 4~5 +// 3. Extract memory from Pair-wise key table for BCN 6~7 +// It occupied those memory of wcid 238~253 for BCN 6 +// and wcid 222~237 for BCN 7 +#define HW_BEACON_MAX_SIZE 0x1000 /* unit: byte */ +#define HW_BEACON_BASE0 0x7800 +#define HW_BEACON_BASE1 0x7A00 +#define HW_BEACON_BASE2 0x7C00 +#define HW_BEACON_BASE3 0x7E00 +#define HW_BEACON_BASE4 0x7200 +#define HW_BEACON_BASE5 0x7400 +#define HW_BEACON_BASE6 0x5DC0 +#define HW_BEACON_BASE7 0x5BC0 + +#define HW_BEACON_MAX_COUNT 8 +#define HW_BEACON_OFFSET 0x0200 +#define HW_BEACON_CONTENT_LEN (HW_BEACON_OFFSET - TXWI_SIZE) + +// HOST-MCU shared memory - base address = 0x2100 +#define HOST_CMD_CSR 0x404 +#define H2M_MAILBOX_CSR 0x7010 +#define H2M_MAILBOX_CID 0x7014 +#define H2M_MAILBOX_STATUS 0x701c +#define H2M_INT_SRC 0x7024 +#define H2M_BBP_AGENT 0x7028 +#define M2H_CMD_DONE_CSR 0x000c +#define MCU_TXOP_ARRAY_BASE 0x000c // TODO: to be provided by Albert +#define MCU_TXOP_ENTRY_SIZE 32 // TODO: to be provided by Albert +#define MAX_NUM_OF_TXOP_ENTRY 16 // TODO: must be same with 8051 firmware +#define MCU_MBOX_VERSION 0x01 // TODO: to be confirmed by Albert +#define MCU_MBOX_VERSION_OFFSET 5 // TODO: to be provided by Albert + +// +// Host DMA registers - base address 0x200 . TX0-3=EDCAQid0-3, TX4=HCCA, TX5=MGMT, +// +// +// DMA RING DESCRIPTOR +// +#define E2PROM_CSR 0x0004 +#define IO_CNTL_CSR 0x77d0 + + + +// ================================================================ +// Tx / Rx / Mgmt ring descriptor definition +// ================================================================ + +// the following PID values are used to mark outgoing frame type in TXD->PID so that +// proper TX statistics can be collected based on these categories +// b3-2 of PID field - +#define PID_MGMT 0x05 +#define PID_BEACON 0x0c +#define PID_DATA_NORMALUCAST 0x02 +#define PID_DATA_AMPDU 0x04 +#define PID_DATA_NO_ACK 0x08 +#define PID_DATA_NOT_NORM_ACK 0x03 +// value domain of pTxD->HostQId (4-bit: 0~15) +#define QID_AC_BK 1 // meet ACI definition in 802.11e +#define QID_AC_BE 0 // meet ACI definition in 802.11e +#define QID_AC_VI 2 +#define QID_AC_VO 3 +#define QID_HCCA 4 +#define NUM_OF_TX_RING 5 +#define QID_MGMT 13 +#define QID_RX 14 +#define QID_OTHER 15 + +#endif // __RTMP_MAC_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rtmp_phy.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rtmp_phy.h new file mode 100644 index 000000000..938ed8d77 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chip/rtmp_phy.h @@ -0,0 +1,636 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_phy.h + + Abstract: + Ralink Wireless Chip PHY(BBP/RF) related definition & structures + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#ifndef __RTMP_PHY_H__ +#define __RTMP_PHY_H__ + + +/* + RF sections +*/ +#define RF_R00 0 +#define RF_R01 1 +#define RF_R02 2 +#define RF_R03 3 +#define RF_R04 4 +#define RF_R05 5 +#define RF_R06 6 +#define RF_R07 7 +#define RF_R08 8 +#define RF_R09 9 +#define RF_R10 10 +#define RF_R11 11 +#define RF_R12 12 +#define RF_R13 13 +#define RF_R14 14 +#define RF_R15 15 +#define RF_R16 16 +#define RF_R17 17 +#define RF_R18 18 +#define RF_R19 19 +#define RF_R20 20 +#define RF_R21 21 +#define RF_R22 22 +#define RF_R23 23 +#define RF_R24 24 +#define RF_R25 25 +#define RF_R26 26 +#define RF_R27 27 +#define RF_R28 28 +#define RF_R29 29 +#define RF_R30 30 +#define RF_R31 31 + + +// value domain of pAd->RfIcType +#define RFIC_2820 1 // 2.4G 2T3R +#define RFIC_2850 2 // 2.4G/5G 2T3R +#define RFIC_2720 3 // 2.4G 1T2R +#define RFIC_2750 4 // 2.4G/5G 1T2R +#define RFIC_3020 5 // 2.4G 1T1R +#define RFIC_2020 6 // 2.4G B/G +#define RFIC_3021 7 // 2.4G 1T2R +#define RFIC_3022 8 // 2.4G 2T2R +#define RFIC_3052 9 // 2.4G/5G 2T2R +#define RFIC_3320 11 // 2.4G 1T1R + + +/* + BBP sections +*/ +#define BBP_R0 0 // version +#define BBP_R1 1 // TSSI +#define BBP_R2 2 // TX configure +#define BBP_R3 3 +#define BBP_R4 4 +#define BBP_R5 5 +#define BBP_R6 6 +#define BBP_R14 14 // RX configure +#define BBP_R16 16 +#define BBP_R17 17 // RX sensibility +#define BBP_R18 18 +#define BBP_R21 21 +#define BBP_R22 22 +#define BBP_R24 24 +#define BBP_R25 25 +#define BBP_R26 26 +#define BBP_R27 27 +#define BBP_R31 31 +#define BBP_R49 49 //TSSI +#define BBP_R50 50 +#define BBP_R51 51 +#define BBP_R52 52 +#define BBP_R55 55 +#define BBP_R62 62 // Rx SQ0 Threshold HIGH +#define BBP_R63 63 +#define BBP_R64 64 +#define BBP_R65 65 +#define BBP_R66 66 +#define BBP_R67 67 +#define BBP_R68 68 +#define BBP_R69 69 +#define BBP_R70 70 // Rx AGC SQ CCK Xcorr threshold +#define BBP_R73 73 +#define BBP_R75 75 +#define BBP_R77 77 +#define BBP_R78 78 +#define BBP_R79 79 +#define BBP_R80 80 +#define BBP_R81 81 +#define BBP_R82 82 +#define BBP_R83 83 +#define BBP_R84 84 +#define BBP_R86 86 +#define BBP_R91 91 +#define BBP_R92 92 +#define BBP_R94 94 // Tx Gain Control +#define BBP_R103 103 +#define BBP_R105 105 +#define BBP_R106 106 +#define BBP_R113 113 +#define BBP_R114 114 +#define BBP_R115 115 +#define BBP_R116 116 +#define BBP_R117 117 +#define BBP_R118 118 +#define BBP_R119 119 +#define BBP_R120 120 +#define BBP_R121 121 +#define BBP_R122 122 +#define BBP_R123 123 +#ifdef RT30xx +#define BBP_R138 138 // add by johnli, RF power sequence setup, ADC dynamic on/off control +#endif // RT30xx // + + +#define BBPR94_DEFAULT 0x06 // Add 1 value will gain 1db + + +#ifdef MERGE_ARCH_TEAM + #define MAX_BBP_ID 200 + #define MAX_BBP_MSG_SIZE 4096 +#else +#ifdef RT30xx + // edit by johnli, RF power sequence setup, add BBP R138 for ADC dynamic on/off control + #define MAX_BBP_ID 138 +#elif defined(RT2883) + #define MAX_BBP_ID 180 +#else + #define MAX_BBP_ID 136 +#endif // RT30xx // + #define MAX_BBP_MSG_SIZE 2048 +#endif // MERGE_ARCH_TEAM // + + +// +// BBP & RF are using indirect access. Before write any value into it. +// We have to make sure there is no outstanding command pending via checking busy bit. +// +#define MAX_BUSY_COUNT 100 // Number of retry before failing access BBP & RF indirect register + +//#define PHY_TR_SWITCH_TIME 5 // usec + +//#define BBP_R17_LOW_SENSIBILITY 0x50 +//#define BBP_R17_MID_SENSIBILITY 0x41 +//#define BBP_R17_DYNAMIC_UP_BOUND 0x40 + +#define RSSI_FOR_VERY_LOW_SENSIBILITY -35 +#define RSSI_FOR_LOW_SENSIBILITY -58 +#define RSSI_FOR_MID_LOW_SENSIBILITY -80 +#define RSSI_FOR_MID_SENSIBILITY -90 + +/***************************************************************************** + RF register Read/Write marco definition + *****************************************************************************/ +#ifdef RTMP_MAC_PCI +#define RTMP_RF_IO_WRITE32(_A, _V) \ +{ \ + if ((_A)->bPCIclkOff == FALSE) \ + { \ + PHY_CSR4_STRUC _value; \ + ULONG _busyCnt = 0; \ + \ + do { \ + RTMP_IO_READ32((_A), RF_CSR_CFG0, &_value.word); \ + if (_value.field.Busy == IDLE) \ + break; \ + _busyCnt++; \ + }while (_busyCnt < MAX_BUSY_COUNT); \ + if(_busyCnt < MAX_BUSY_COUNT) \ + { \ + RTMP_IO_WRITE32((_A), RF_CSR_CFG0, (_V)); \ + } \ + } \ +} +#endif // RTMP_MAC_PCI // + + + +#ifdef RT30xx +#define RTMP_RF_IO_READ8_BY_REG_ID(_A, _I, _pV) RT30xxReadRFRegister(_A, _I, _pV) +#define RTMP_RF_IO_WRITE8_BY_REG_ID(_A, _I, _V) RT30xxWriteRFRegister(_A, _I, _V) +#endif // RT30xx // + + +/***************************************************************************** + BBP register Read/Write marco definitions. + we read/write the bbp value by register's ID. + Generate PER to test BA + *****************************************************************************/ +#ifdef RTMP_MAC_PCI +/* + basic marco for BBP read operation. + _pAd: the data structure pointer of RTMP_ADAPTER + _bbpID : the bbp register ID + _pV: data pointer used to save the value of queried bbp register. + _bViaMCU: if we need access the bbp via the MCU. +*/ +#ifdef RELASE_INCLUDE +/* + The RTMP_PCIE_PS_L3_BBP_IO_READ8 is used to support PCIE power-saving solution3. + "brc =AsicSendCommandToMcu" is used to avoid any muc command is executed during + RF_OFF command. +*/ +#endif // RELASE_INCLUDE // + + +#ifdef CONFIG_STA_SUPPORT +#define IS_SUPPORT_PCIE_PS_L3(_pAd) (((_pAd)->OpMode == OPMODE_STA) &&\ + (IS_RT3090((_pAd)) || IS_RT3572((_pAd)) || IS_RT3390((_pAd))) && \ + ((_pAd)->StaCfg.PSControl.field.rt30xxPowerMode == 3)&& \ + ((_pAd)->StaCfg.PSControl.field.EnableNewPS == TRUE)) + +#define RTMP_PCIE_PS_L3_BBP_IO_READ8(_pAd, _bbpID, _pV, _bViaMCU) \ + do{ \ + BBP_CSR_CFG_STRUC BbpCsr; \ + int _busyCnt, _secCnt, _regID; \ + BOOLEAN brc; \ + _regID = ((_bViaMCU) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG); \ + BbpCsr.field.Busy = IDLE; \ + if (((_pAd)->bPCIclkOff == FALSE) \ + && ((_pAd)->brt30xxBanMcuCmd == FALSE)) \ + { \ + for (_busyCnt=0; _busyCnt<MAX_BUSY_COUNT; _busyCnt++) \ + { \ + RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \ + if (BbpCsr.field.Busy == BUSY) \ + continue; \ + BbpCsr.word = 0; \ + BbpCsr.field.fRead = 1; \ + BbpCsr.field.BBP_RW_MODE = 1; \ + BbpCsr.field.Busy = 1; \ + BbpCsr.field.RegNum = _bbpID; \ + RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \ + if ((_bViaMCU) == TRUE) \ + { \ + brc =AsicSendCommandToMcu(_pAd, 0x80, 0xff, 0x0, 0x0); \ + RTMPusecDelay(1000); \ + } \ + if (brc == TRUE) \ + { \ + for (_secCnt=0; _secCnt<MAX_BUSY_COUNT; _secCnt++) \ + { \ + RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \ + if (BbpCsr.field.Busy == IDLE) \ + break; \ + } \ + if ((BbpCsr.field.Busy == IDLE) && \ + (BbpCsr.field.RegNum == _bbpID)) \ + { \ + *(_pV) = (UCHAR)BbpCsr.field.Value; \ + break; \ + } \ + } \ + else \ + { \ + BbpCsr.field.Busy = 0; \ + RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \ + } \ + } \ + } \ + else \ + { \ + DBGPRINT_ERR(("RTMP_PCIE_PS_L3_BBP_IO_READ8(viaMCU=%d) read R%d fail\n", (_bViaMCU), _bbpID)); \ + *(_pV) = (_pAd)->BbpWriteLatch[_bbpID]; \ + if ((_bViaMCU) == TRUE) \ + { \ + RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \ + BbpCsr.field.Busy = 0; \ + RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \ + } \ + } \ + if ((BbpCsr.field.Busy == BUSY) || ((_pAd)->bPCIclkOff == TRUE)) \ + { \ + DBGPRINT_ERR(("RTMP_PCIE_PS_L3_BBP_IO_READ8(viaMCU=%d) read R%d fail(reason:clk=%d,busy=%x)\n", (_bViaMCU), _bbpID,(_pAd)->bPCIclkOff ,BbpCsr.field.Busy)); \ + *(_pV) = (_pAd)->BbpWriteLatch[_bbpID]; \ + if ((_bViaMCU) == TRUE) \ + { \ + RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \ + BbpCsr.field.Busy = 0; \ + RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \ + } \ + } \ +}while(0) +#else +#define IS_SUPPORT_PCIE_PS_L3(_pAd) FALSE +#define RTMP_PCIE_PS_L3_BBP_IO_READ8(_pAd, _bbpID, _pV, _bViaMCU) +#endif // CONFIG_STA_SUPPORT // + +#ifndef VENDOR_FEATURE3_SUPPORT +#define RTMP_BBP_IO_READ8(_pAd, _bbpID, _pV, _bViaMCU) \ + do{ \ + BBP_CSR_CFG_STRUC BbpCsr; \ + int _busyCnt, _secCnt, _regID; \ + \ + _regID = ((_bViaMCU) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG); \ + for (_busyCnt=0; _busyCnt<MAX_BUSY_COUNT; _busyCnt++) \ + { \ + RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \ + if (BbpCsr.field.Busy == BUSY) \ + continue; \ + BbpCsr.word = 0; \ + BbpCsr.field.fRead = 1; \ + BbpCsr.field.BBP_RW_MODE = 1; \ + BbpCsr.field.Busy = 1; \ + BbpCsr.field.RegNum = _bbpID; \ + RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \ + if ((_bViaMCU) == TRUE) \ + { \ + AsicSendCommandToMcu(_pAd, 0x80, 0xff, 0x0, 0x0); \ + RTMPusecDelay(1000); \ + } \ + for (_secCnt=0; _secCnt<MAX_BUSY_COUNT; _secCnt++) \ + { \ + RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \ + if (BbpCsr.field.Busy == IDLE) \ + break; \ + } \ + if ((BbpCsr.field.Busy == IDLE) && \ + (BbpCsr.field.RegNum == _bbpID)) \ + { \ + *(_pV) = (UCHAR)BbpCsr.field.Value; \ + break; \ + } \ + } \ + if (BbpCsr.field.Busy == BUSY) \ + { \ + DBGPRINT_ERR(("BBP(viaMCU=%d) read R%d fail\n", (_bViaMCU), _bbpID)); \ + *(_pV) = (_pAd)->BbpWriteLatch[_bbpID]; \ + if ((_bViaMCU) == TRUE) \ + { \ + RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \ + BbpCsr.field.Busy = 0; \ + RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \ + } \ + } \ + }while(0) +#endif // VENDOR_FEATURE3_SUPPORT // + +/* + This marco used for the BBP read operation which didn't need via MCU. +*/ +#define BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) \ + RTMP_BBP_IO_READ8((_A), (_I), (_pV), FALSE) + +/* + This marco used for the BBP read operation which need via MCU. + But for some chipset which didn't have mcu (e.g., RBUS based chipset), we + will use this function too and didn't access the bbp register via the MCU. +*/ +#ifndef VENDOR_FEATURE3_SUPPORT +#define RTMP_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) \ + do{ \ + if ((_A)->bPCIclkOff == FALSE) \ + { \ + if ((_A)->infType == RTMP_DEV_INF_RBUS) \ + RTMP_BBP_IO_READ8((_A), (_I), (_pV), FALSE); \ + else \ + if(IS_SUPPORT_PCIE_PS_L3((_A))) \ + RTMP_PCIE_PS_L3_BBP_IO_READ8((_A), (_I), (_pV), TRUE); \ + else \ + RTMP_BBP_IO_READ8((_A), (_I), (_pV), TRUE); \ + } \ + }while(0) +#endif // VENDOR_FEATURE3_SUPPORT // + +/* + basic marco for BBP write operation. + _pAd: the data structure pointer of RTMP_ADAPTER + _bbpID : the bbp register ID + _pV: data used to save the value of queried bbp register. + _bViaMCU: if we need access the bbp via the MCU. +*/ +#ifdef CONFIG_STA_SUPPORT +#define RTMP_PCIE_PS_L3_BBP_IO_WRITE8(_pAd, _bbpID, _pV, _bViaMCU) \ + do{ \ + BBP_CSR_CFG_STRUC BbpCsr; \ + int _busyCnt=0, _regID; \ + BOOLEAN brc; \ + _regID = ((_bViaMCU) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG); \ + if (((_pAd)->bPCIclkOff == FALSE) \ + && ((_pAd)->brt30xxBanMcuCmd == FALSE)) \ + { \ + if (_pAd->AccessBBPFailCount > 20) \ + { \ + AsicResetBBPAgent(_pAd); \ + _pAd->AccessBBPFailCount = 0; \ + } \ + for (_busyCnt=0; _busyCnt<MAX_BUSY_COUNT; _busyCnt++) \ + { \ + RTMP_IO_READ32((_pAd), _regID, &BbpCsr.word); \ + if (BbpCsr.field.Busy == BUSY) \ + continue; \ + BbpCsr.word = 0; \ + BbpCsr.field.fRead = 0; \ + BbpCsr.field.BBP_RW_MODE = 1; \ + BbpCsr.field.Busy = 1; \ + BbpCsr.field.Value = _pV; \ + BbpCsr.field.RegNum = _bbpID; \ + RTMP_IO_WRITE32((_pAd), _regID, BbpCsr.word); \ + if ((_bViaMCU) == TRUE) \ + { \ + brc =AsicSendCommandToMcu(_pAd, 0x80, 0xff, 0x0, 0x0); \ + if ((_pAd)->OpMode == OPMODE_AP) \ + RTMPusecDelay(1000); \ + } \ + if (brc == TRUE) \ + { \ + (_pAd)->BbpWriteLatch[_bbpID] = _pV; \ + } \ + else \ + { \ + BbpCsr.field.Busy = 0; \ + RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \ + } \ + break; \ + } \ + } \ + else \ + { \ + DBGPRINT_ERR((" brt30xxBanMcuCmd = %d. Write BBP %d \n", (_pAd)->brt30xxBanMcuCmd, (_regID))); \ + } \ + if ((_busyCnt == MAX_BUSY_COUNT) || ((_pAd)->bPCIclkOff == TRUE)) \ + { \ + if (_busyCnt == MAX_BUSY_COUNT) \ + (_pAd)->AccessBBPFailCount++; \ + DBGPRINT_ERR(("BBP write R%d=0x%x fail. BusyCnt= %d.bPCIclkOff = %d. \n", _regID, BbpCsr.word, _busyCnt, (_pAd)->bPCIclkOff )); \ + } \ + }while(0) +#else +#define RTMP_PCIE_PS_L3_BBP_IO_WRITE8(_pAd, _bbpID, _pV, _bViaMCU) +#endif // CONFIG_STA_SUPPORT // + +#ifndef VENDOR_FEATURE3_SUPPORT +#define RTMP_BBP_IO_WRITE8(_pAd, _bbpID, _pV, _bViaMCU) \ + do{ \ + BBP_CSR_CFG_STRUC BbpCsr; \ + int _busyCnt=0, _regID; \ + BOOLEAN brc; \ + \ + _regID = ((_bViaMCU) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG); \ + for (_busyCnt=0; _busyCnt<MAX_BUSY_COUNT; _busyCnt++) \ + { \ + RTMP_IO_READ32((_pAd), _regID, &BbpCsr.word); \ + if (BbpCsr.field.Busy == BUSY) \ + {\ + if ( ((_bViaMCU) == TRUE) && ((_busyCnt % 20) == 0)) \ + {\ + BbpCsr.field.Busy = IDLE;\ + RTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, BbpCsr.word);\ + }\ + continue; \ + }\ + BbpCsr.word = 0; \ + BbpCsr.field.fRead = 0; \ + BbpCsr.field.BBP_RW_MODE = 1; \ + BbpCsr.field.Busy = 1; \ + BbpCsr.field.Value = _pV; \ + BbpCsr.field.RegNum = _bbpID; \ + RTMP_IO_WRITE32((_pAd), _regID, BbpCsr.word); \ + if ((_bViaMCU) == TRUE) \ + { \ + brc = AsicSendCommandToMcu(_pAd, 0x80, 0xff, 0x0, 0x0); \ + if ((_pAd)->OpMode == OPMODE_AP) \ + RTMPusecDelay(1000); \ + if (brc == FALSE) \ + { \ + BbpCsr.field.Busy = IDLE; \ + RTMP_IO_WRITE32((_pAd), H2M_BBP_AGENT, BbpCsr.word); \ + } \ + } \ + (_pAd)->BbpWriteLatch[_bbpID] = _pV; \ + break; \ + } \ + if (_busyCnt == MAX_BUSY_COUNT) \ + { \ + DBGPRINT_ERR(("BBP write R%d fail\n", _bbpID)); \ + if((_bViaMCU) == TRUE) \ + { \ + RTMP_IO_READ32(_pAd, H2M_BBP_AGENT, &BbpCsr.word); \ + BbpCsr.field.Busy = 0; \ + RTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, BbpCsr.word); \ + } \ + } \ + }while(0) +#endif // VENDOR_FEATURE3_SUPPORT // + + +/* + This marco used for the BBP write operation which didn't need via MCU. +*/ +#define BBP_IO_WRITE8_BY_REG_ID(_A, _I, _pV) \ + RTMP_BBP_IO_WRITE8((_A), (_I), (_pV), FALSE) + +/* + This marco used for the BBP write operation which need via MCU. + But for some chipset which didn't have mcu (e.g., RBUS based chipset), we + will use this function too and didn't access the bbp register via the MCU. +*/ +#ifndef VENDOR_FEATURE3_SUPPORT +#define RTMP_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _pV) \ + do{ \ + if ((_A)->bPCIclkOff == FALSE) \ + { \ + if ((_A)->infType == RTMP_DEV_INF_RBUS) \ + RTMP_BBP_IO_WRITE8((_A), (_I), (_pV), FALSE); \ + else \ + if(IS_SUPPORT_PCIE_PS_L3((_A))) \ + RTMP_PCIE_PS_L3_BBP_IO_WRITE8((_A), (_I), (_pV), TRUE); \ + else \ + RTMP_BBP_IO_WRITE8((_A), (_I), (_pV), TRUE); \ + } \ + }while(0) +#endif // VENDOR_FEATURE3_SUPPORT // + +#endif // RTMP_MAC_PCI // + + + +#ifdef RT30xx +//Need to collect each ant's rssi concurrently +//rssi1 is report to pair2 Ant and rss2 is reprot to pair1 Ant when 4 Ant +#ifdef RELEASE_EXCLUDE +/* STA will get the Avg. RSSI from Mgmt Frame and Peer AP Beacon. + * The reason to use moving average is prevent STA switch antenna back and forth quickly + * to cause antenna switching hourly. + */ +#endif // RELEASE_EXCLUDE // +#define COLLECT_RX_ANTENNA_AVERAGE_RSSI(_pAd, _rssi1, _rssi2) \ +{ \ + SHORT AvgRssi; \ + UCHAR UsedAnt; \ + if (_pAd->RxAnt.EvaluatePeriod == 0) \ + { \ + UsedAnt = _pAd->RxAnt.Pair1PrimaryRxAnt; \ + AvgRssi = _pAd->RxAnt.Pair1AvgRssi[UsedAnt]; \ + if (AvgRssi < 0) \ + AvgRssi = AvgRssi - (AvgRssi >> 3) + _rssi1; \ + else \ + AvgRssi = _rssi1 << 3; \ + _pAd->RxAnt.Pair1AvgRssi[UsedAnt] = AvgRssi; \ + } \ + else \ + { \ + UsedAnt = _pAd->RxAnt.Pair1SecondaryRxAnt; \ + AvgRssi = _pAd->RxAnt.Pair1AvgRssi[UsedAnt]; \ + if ((AvgRssi < 0) && (_pAd->RxAnt.FirstPktArrivedWhenEvaluate)) \ + AvgRssi = AvgRssi - (AvgRssi >> 3) + _rssi1; \ + else \ + { \ + _pAd->RxAnt.FirstPktArrivedWhenEvaluate = TRUE; \ + AvgRssi = _rssi1 << 3; \ + } \ + _pAd->RxAnt.Pair1AvgRssi[UsedAnt] = AvgRssi; \ + _pAd->RxAnt.RcvPktNumWhenEvaluate++; \ + } \ +} + +#define RTMP_ASIC_MMPS_DISABLE(_pAd) \ + do{ \ + UCHAR _bbpData = 0; \ + UINT32 _macData; \ + /* disable MMPS BBP control register */ \ + RTMP_BBP_IO_READ8_BY_REG_ID(_pAd, BBP_R3, &_bbpData); \ + _bbpData &= ~(0x04); /*bit 2*/ \ + RTMP_BBP_IO_WRITE8_BY_REG_ID(_pAd, BBP_R3, _bbpData); \ + \ + /* disable MMPS MAC control register */ \ + RTMP_IO_READ32(_pAd, 0x1210, &_macData); \ + _macData &= ~(0x09); /*bit 0, 3*/ \ + RTMP_IO_WRITE32(_pAd, 0x1210, _macData); \ + }while(0) + + +#define RTMP_ASIC_MMPS_ENABLE(_pAd) \ + do{ \ + UCHAR _bbpData = 0; \ + UINT32 _macData; \ + /* enable MMPS BBP control register */ \ + RTMP_BBP_IO_READ8_BY_REG_ID(_pAd, BBP_R3, &_bbpData); \ + _bbpData |= (0x04); /*bit 2*/ \ + RTMP_BBP_IO_WRITE8_BY_REG_ID(_pAd, BBP_R3, _bbpData); \ + \ + /* enable MMPS MAC control register */ \ + RTMP_IO_READ32(_pAd, 0x1210, &_macData); \ + _macData |= (0x09); /*bit 0, 3*/ \ + RTMP_IO_WRITE32(_pAd, 0x1210, _macData); \ + }while(0) + +#endif // RT30xx // + +#endif // __RTMP_PHY_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chlist.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chlist.h new file mode 100644 index 000000000..af2c3d1c6 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/chlist.h @@ -0,0 +1,118 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + chlist.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Fonchi Wu 2007-12-19 created +*/ + +#ifndef __CHLIST_H__ +#define __CHLIST_H__ + +#include "rtmp_type.h" +#include "rtmp_def.h" + +#define BAND_5G 0 +#define BAND_24G 1 +#define BAND_BOTH 2 + +#ifdef EXT_BUILD_CHANNEL_LIST +#define ODOR 0 +#define IDOR 1 +#define BOTH 2 + +typedef struct _CH_DESP { + UCHAR FirstChannel; + UCHAR NumOfCh; + CHAR MaxTxPwr; // dBm + UCHAR Geography; // 0:out door, 1:in door, 2:both + BOOLEAN DfsReq; // Dfs require, 0: No, 1: yes. +} CH_DESP, *PCH_DESP; + +typedef struct _CH_REGION { + UCHAR CountReg[3]; + UCHAR DfsType; // 0: CE, 1: FCC, 2: JAP, 3:JAP_W53, JAP_W56 + CH_DESP ChDesp[10]; +} CH_REGION, *PCH_REGION; + +extern CH_REGION ChRegion[]; +#endif // EXT_BUILD_CHANNEL_LIST // + +typedef struct _CH_FREQ_MAP_{ + UINT16 channel; + UINT16 freqKHz; +}CH_FREQ_MAP; + +extern CH_FREQ_MAP CH_HZ_ID_MAP[]; +extern int CH_HZ_ID_MAP_NUM; + + + + +#define MAP_CHANNEL_ID_TO_KHZ(_ch, _khz) \ + RTMP_MapChannelID2KHZ(_ch, (UINT32 *)&(_khz)) +#define MAP_KHZ_TO_CHANNEL_ID(_khz, _ch) \ + RTMP_MapKHZ2ChannelID(_khz, (INT *)&(_ch)) + + +#ifdef EXT_BUILD_CHANNEL_LIST +VOID BuildChannelListEx( + IN PRTMP_ADAPTER pAd); + +VOID BuildBeaconChList( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pBuf, + OUT PULONG pBufLen); +#endif // EXT_BUILD_CHANNEL_LIST // + +#ifdef DOT11_N_SUPPORT +VOID N_ChannelCheck( + IN PRTMP_ADAPTER pAd); + +VOID N_SetCenCh( + IN PRTMP_ADAPTER pAd); +#endif // DOT11_N_SUPPORT // + +UINT8 GetCuntryMaxTxPwr( + IN PRTMP_ADAPTER pAd, + IN UINT8 channel); + +VOID RTMP_MapChannelID2KHZ( + IN UCHAR Ch, + OUT UINT32 *pFreq); + +VOID RTMP_MapKHZ2ChannelID( + IN ULONG Freq, + OUT INT *pCh); + +#endif // __CHLIST_H__ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/client_wds.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/client_wds.h new file mode 100644 index 000000000..013ca73c5 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/client_wds.h @@ -0,0 +1,68 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + client_wds.h + + Abstract: +*/ + +#ifndef __CLIENT_WDS_H__ +#define __CLIENT_WDS_H__ + +#include "client_wds_cmm.h" + +VOID CliWds_ProxyTabInit( + IN PRTMP_ADAPTER pAd); + +VOID CliWds_ProxyTabDestory( + IN PRTMP_ADAPTER pAd); + +PCLIWDS_PROXY_ENTRY CliWdsEntyAlloc( + IN PRTMP_ADAPTER pAd); + + +VOID CliWdsEntyFree( + IN PRTMP_ADAPTER pAd, + IN PCLIWDS_PROXY_ENTRY pCliWdsEntry); + + +PUCHAR CliWds_ProxyLookup( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pMac); + + +VOID CliWds_ProxyTabUpdate( + IN PRTMP_ADAPTER pAd, + IN SHORT Aid, + IN PUCHAR pMac); + + +VOID CliWds_ProxyTabMaintain( + IN PRTMP_ADAPTER pAd); + +#endif // __CLIENT_WDS_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/client_wds_cmm.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/client_wds_cmm.h new file mode 100644 index 000000000..ea8d2ad18 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/client_wds_cmm.h @@ -0,0 +1,55 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + client_wds_cmm.h + + Abstract: +*/ + +#ifndef __CLIENT_WDS_CMM_H__ +#define __CLIENT_WDS_CMM_H__ + +#include "rtmp_def.h" + +#ifdef CLIENT_WDS + + +#define CLI_WDS_ENTRY_AGEOUT 5000 /* seconds */ + +#define CLIWDS_POOL_SIZE 128 +#define CLIWDS_HASH_TAB_SIZE 64 /* the legth of hash table must be power of 2. */ +typedef struct _CLIWDS_PROXY_ENTRY { + struct _CLIWDS_PROXY_ENTRY * pNext; + ULONG LastRefTime; + SHORT Aid; + UCHAR Addr[MAC_ADDR_LEN]; +} CLIWDS_PROXY_ENTRY, *PCLIWDS_PROXY_ENTRY; + +#endif // CLIENT_WDS // + +#endif // __CLIENT_WDS_CMM_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_aes.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_aes.h new file mode 100644 index 000000000..e982a620f --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_aes.h @@ -0,0 +1,235 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + + +#ifndef __CRYPT_AES_H__ +#define __CRYPT_AES_H__ + +#include "rt_config.h" + + +/* +//#undef SWAP32 +//#define SWAP32(x) \ +// ((unsigned long)( \ +// (((unsigned long)(x) & (unsigned long) 0x000000ffUL) << 24) | \ +// (((unsigned long)(x) & (unsigned long) 0x0000ff00UL) << 8) | \ +// (((unsigned long)(x) & (unsigned long) 0x00ff0000UL) >> 8) | \ +// (((unsigned long)(x) & (unsigned long) 0xff000000UL) >> 24) )) +*/ +#define GETU32(p) cpu2be32(get_unaligned((u32 *) (p))) +#define PUTU32(ct, st) put_unaligned(cpu2be32(st), (u32*)(ct)) //{ *((u32 *)(ct)) = cpu2be32((st)); } + +#define AES_ENCRYPT 1 +#define AES_DECRYPT 0 + +/* Because array size can't be a const in C, the following two are macros. + Both sizes are in bytes. */ +#define AES_MAXNR 14 +#define AES_BLOCK_SIZE 16 + +/* This should be a hidden type, but EVP requires that the size be known */ +struct aes_key_st { +#ifdef AES_LONG + unsigned long rd_key[4 *(AES_MAXNR + 1)]; +#else + unsigned int rd_key[4 *(AES_MAXNR + 1)]; +#endif + int rounds; +}; +typedef struct aes_key_st AES_KEY; + +typedef struct _EVP_CIPHER_CTX_ { + unsigned long flag; + unsigned long type; + unsigned long encrypt; //1: Encrypt 0: Decrypt, + unsigned char key[16]; + unsigned char iv[8 + 16]; + unsigned long bufferlen; + unsigned char buffer[AES_BLOCK_SIZE]; + AES_KEY aesKey; +} EVP_CIPHER_CTX, *PEVP_CIPHER_CTX; + +void evp_aes_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key); +void evp_aes_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key); +int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); +int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); +int EVP_aes_128_cbc(void); +int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, int type, unsigned char *key, unsigned char *iv); +int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen, unsigned char *inbuf, int inlen); +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen); +int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, int type, unsigned char *key, unsigned char *iv); +int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen, unsigned char *inbuf, int inlen); +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outbuf, int *outlen); +void evp_aes_cbc_encrypt(const unsigned char *in, unsigned char *out, + const unsigned long length, const AES_KEY *key, + unsigned char *ivec, const int enc); + +void WscEncryptData( + unsigned char *plainText, int ptx_len, + unsigned char *key, unsigned char *iv, + unsigned char *cipherText, int *ctx_len); + +void WscDecryptData( + unsigned char *cipherText, int ctx_len, + unsigned char *key, unsigned char *iv, + unsigned char *plainText, int *ptx_len); + +#define AES_CBC_Encrypt(Plain, PlainL, Key, KeyL, IV, IVL, Cipher, CipherL) \ + WscEncryptData((Plain), (PlainL), (Key), (IV), (Cipher), (int *) (CipherL)); + +#define AES_CBC_Decrypt(Cipher, CipherL, Key, KeyL, IV, IVL, Plain, PlainL) \ + WscDecryptData((Cipher), (CipherL), (Key), (IV), (Plain), (int *) (PlainL)); + +typedef struct +{ + uint32 erk[64]; /* encryption round keys */ + uint32 drk[64]; /* decryption round keys */ + int nr; /* number of rounds */ +} +aes_context; + +int rtmp_aes_set_key( aes_context *ctx, uint8 *key, int nbits ); +void rtmp_aes_encrypt( aes_context *ctx, uint8 input[16], uint8 output[16] ); +void rtmp_aes_decrypt( aes_context *ctx, uint8 input[16], uint8 output[16] ); + +VOID AES_GTK_KEY_WRAP( + IN UCHAR *key, + IN UCHAR *plaintext, + IN UINT p_len, + OUT UCHAR *ciphertext, + OUT UINT *c_len); + +VOID AES_GTK_KEY_UNWRAP( + IN UCHAR *key, + OUT UCHAR *plaintext, + OUT UINT *p_len, + IN UCHAR *ciphertext, + IN UINT c_len); + +#define AES_Key_Wrap(Plain, PlainL, Key, KeyL, Cipher, CipherL) \ + AES_GTK_KEY_WRAP((Key), (Plain), (PlainL), (Cipher), (CipherL)) + +#define AES_Key_Unwrap(Cipher, CipherL, Key, KeyL, Plain, PlainL) \ + AES_GTK_KEY_UNWRAP((Key), (Plain), (PlainL), (Cipher), (CipherL)) + +/* AES definition & structure */ +#define AES_STATE_ROWS 4 /* Block size: 4*4*8 = 128 bits */ +#define AES_STATE_COLUMNS 4 +#define AES_BLOCK_SIZES AES_STATE_ROWS*AES_STATE_COLUMNS +#define AES_KEY_ROWS 4 +#define AES_KEY_COLUMNS 8 /*Key length: 4*{4,6,8}*8 = 128, 192, 256 bits */ +#define AES_KEY128_LENGTH 16 +#define AES_KEY192_LENGTH 24 +#define AES_KEY256_LENGTH 32 +#define AES_CBC_IV_LENGTH 16 + +typedef struct { + UINT8 State[AES_STATE_ROWS][AES_STATE_COLUMNS]; + UINT8 KeyWordExpansion[AES_KEY_ROWS][AES_KEY_ROWS*((AES_KEY256_LENGTH >> 2) + 6 + 1)]; +} AES_CTX_STRUC, *PAES_CTX_STRUC; + + +/* AES operations */ +VOID RT_AES_KeyExpansion ( + IN UINT8 Key[], + IN UINT KeyLength, + INOUT AES_CTX_STRUC *paes_ctx); + +VOID RT_AES_Encrypt ( + IN UINT8 PlainBlock[], + IN UINT PlainBlockSize, + IN UINT8 Key[], + IN UINT KeyLength, + OUT UINT8 CipherBlock[], + INOUT UINT *CipherBlockSize); + +VOID RT_AES_Decrypt ( + IN UINT8 CipherBlock[], + IN UINT CipherBlockSize, + IN UINT8 Key[], + IN UINT KeyLength, + OUT UINT8 PlainBlock[], + INOUT UINT *PlainBlockSize); + +/* AES Counter with CBC-MAC operations */ +VOID AES_CCM_MAC ( + IN UINT8 Payload[], + IN UINT PayloadLength, + IN UINT8 Key[], + IN UINT KeyLength, + IN UINT8 Nonce[], + IN UINT NonceLength, + IN UINT8 AAD[], + IN UINT AADLength, + IN UINT MACLength, + OUT UINT8 MACText[]); + +INT AES_CCM_Encrypt ( + IN UINT8 PlainText[], + IN UINT PlainTextLength, + IN UINT8 Key[], + IN UINT KeyLength, + IN UINT8 Nonce[], + IN UINT NonceLength, + IN UINT8 AAD[], + IN UINT AADLength, + IN UINT MACLength, + OUT UINT8 CipherText[], + INOUT UINT *CipherTextLength); + +INT AES_CCM_Decrypt ( + IN UINT8 CipherText[], + IN UINT CipherTextLength, + IN UINT8 Key[], + IN UINT KeyLength, + IN UINT8 Nonce[], + IN UINT NonceLength, + IN UINT8 AAD[], + IN UINT AADLength, + IN UINT MACLength, + OUT UINT8 PlainText[], + INOUT UINT *PlainTextLength); + +/* AES-CMAC operations */ +VOID AES_CMAC_GenerateSubKey ( + IN UINT8 Key[], + IN UINT KeyLength, + OUT UINT8 SubKey1[], + OUT UINT8 SubKey2[]); + +VOID AES_CMAC ( + IN UINT8 PlainText[], + IN UINT PlainTextLength, + IN UINT8 Key[], + IN UINT KeyLength, + OUT UINT8 MACText[], + INOUT UINT *MACTextLength); + + + +#endif /* __CRYPT_AES_H__ */ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_arc4.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_arc4.h new file mode 100644 index 000000000..27cdef458 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_arc4.h @@ -0,0 +1,71 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + +/**************************************************************************** + Module Name: + RC4 + + Abstract: + + Revision History: + Who When What + -------- ---------- ------------------------------------------ + Eddy 2009/05/13 ARC4 +***************************************************************************/ + +#ifndef __CRYPT_ARC4_H__ +#define __CRYPT_ARC4_H__ + +#include "rt_config.h" + +/* ARC4 definition & structure */ +#define ARC4_KEY_BLOCK_SIZE 256 + +typedef struct { + UINT BlockIndex1; + UINT BlockIndex2; + UINT8 KeyBlock[256]; +} ARC4_CTX_STRUC, *PARC4_CTX_STRUC; + + +/* ARC4 operations */ +VOID ARC4_INIT ( + IN ARC4_CTX_STRUC *pARC4_CTX, + IN PUCHAR pKey, + IN UINT KeyLength); + +VOID ARC4_Compute ( + IN ARC4_CTX_STRUC *pARC4_CTX, + IN UINT8 InputBlock[], + IN UINT InputBlockSize, + OUT UINT8 OutputBlock[]); + +VOID ARC4_Discard_KeyLength ( + IN ARC4_CTX_STRUC *pARC4_CTX, + IN UINT Length); + +#endif /* __CRYPT_ARC4_H__ */ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_hmac.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_hmac.h new file mode 100644 index 000000000..536915c1f --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_hmac.h @@ -0,0 +1,90 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + + +#ifndef __CRYPT_HMAC_H__ +#define __CRYPT_HMAC_H__ + +#include "rt_config.h" + + +#if defined(__cplusplus) +extern "C" +{ +#endif + +#define USE_SHA256 + +#if !defined(USE_SHA1) && !defined(USE_SHA256) +#error define USE_SHA1 or USE_SHA256 to set the HMAC hash algorithm +#endif + +#ifdef USE_SHA1 +#define HASH_INPUT_SIZE SHA1_BLOCK_SIZE +#define HASH_OUTPUT_SIZE SHA1_DIGEST_SIZE +#define sha_ctx sha1_ctx +#define sha_begin sha1_begin +#define sha_hash sha1_hash +#define sha_end sha1_end +#endif + +#ifdef USE_SHA256 +#define HASH_INPUT_SIZE SHA256_BLOCK_SIZE +#define HASH_OUTPUT_SIZE SHA256_DIGEST_SIZE +#define sha_ctx sha256_ctx +#define sha_begin sha256_begin +#define sha_hash sha256_hash +#define sha_end sha256_end +#endif + +#define HMAC_OK 0 +#define HMAC_BAD_MODE -1 +#define HMAC_IN_DATA 0xffffffff + +typedef struct +{ unsigned char key[HASH_INPUT_SIZE]; + sha_ctx ctx[1]; + unsigned int klen; +} hmac_ctx; + +void hmac_sha_begin(hmac_ctx cx[1]); +int hmac_sha_key(const unsigned char key[], unsigned int key_len, hmac_ctx cx[1]); +void hmac_sha_data(const unsigned char data[], unsigned int data_len, hmac_ctx cx[1]); +void hmac_sha_end(unsigned char mac[], unsigned int mac_len, hmac_ctx cx[1]); +void hmac_sha(const unsigned char key[], unsigned int key_len, + const unsigned char data[], unsigned int data_len, + unsigned char mac[], unsigned int mac_len); + +#define RT_HMAC_SHA256(Key, KeyL, Data, DataL, Mac, MacL) \ + hmac_sha((Key), (KeyL), (Data), (DataL), (Mac), (MacL)) + +#if defined(__cplusplus) +} +#endif + + +#endif /* __CRYPT_HMAC_H__ */ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_md5.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_md5.h new file mode 100644 index 000000000..8a1e07c25 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_md5.h @@ -0,0 +1,90 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + + +#ifndef __CRYPT_MD5_H__ +#define __CRYPT_MD5_H__ + + +#ifndef uint8 +#define uint8 unsigned char +#endif + +#ifndef uint32 +#define uint32 unsigned long int +#endif + +#define MD5_MAC_LEN 16 + +typedef struct _MD5_CTX { + ULONG Buf[4]; // buffers of four states + UCHAR Input[64]; // input message + ULONG LenInBitCount[2]; // length counter for input message, 0 up to 64 bits +} MD5_CTX; + +VOID MD5Init(MD5_CTX *pCtx); +VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, ULONG LenInBytes); +VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx); +VOID MD5Transform(ULONG Buf[4], ULONG Mes[16]); + +void md5_mac(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac); +void hmac_md5(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac); + +// +// SHA context +// +typedef struct _SHA_CTX +{ + ULONG Buf[5]; // buffers of five states + UCHAR Input[80]; // input message + ULONG LenInBitCount[2]; // length counter for input message, 0 up to 64 bits + +} SHA_CTX; + +VOID SHAInit(SHA_CTX *pCtx); +UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, ULONG LenInBytes); +VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20]); +VOID SHATransform(ULONG Buf[5], ULONG Mes[20]); + +#define SHA_DIGEST_LEN 20 + +VOID HMAC_SHA1( + IN UCHAR *text, + IN UINT text_len, + IN UCHAR *key, + IN UINT key_len, + IN UCHAR *digest); + +#define RT_HMAC_MD5(Key, KeyL, Meg, MegL, MAC, MACL) \ + hmac_md5((Key), (KeyL), (Meg), (MegL), (MAC)) + +#define RT_HMAC_SHA1(Key, KeyL, Meg, MegL, MAC, MACL) \ + HMAC_SHA1((Meg), (MegL), (Key), (KeyL), (MAC)) + + +#endif /* __CRYPT_MD5_H__ */ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_sha2.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_sha2.h new file mode 100644 index 000000000..18f81d9fd --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/crypt_sha2.h @@ -0,0 +1,158 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + + +#ifndef __CRYPT_SHA2_H__ +#define __CRYPT_SHA2_H__ + + +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 + +typedef unsigned char uint_8t; +typedef unsigned short uint_16t; +typedef unsigned int uint_32t; +typedef unsigned long long uint_64t; + +#define void_ret void +#define int_ret int + + +/* define the hash functions that you need */ +#define SHA_2 /* for dynamic hash length */ +#define SHA_224 +#define SHA_256 + + +#if defined(__cplusplus) +extern "C" +{ +#endif + +/* Note that the following function prototypes are the same */ +/* for both the bit and byte oriented implementations. But */ +/* the length fields are in bytes or bits as is appropriate */ +/* for the version used. Bit sequences are arrays of bytes */ +/* in which bit sequence indexes increase from the most to */ +/* the least significant end of each byte */ + +#define SHA1_BLOCK_SIZE 64 /* 512 bits = 64 bytes */ +#define SHA1_DIGEST_SIZE 20 /* 160 bits = 20 bytes */ +#define SHA224_DIGEST_SIZE 28 +#define SHA224_BLOCK_SIZE 64 +#define SHA256_DIGEST_SIZE 32 +#define SHA256_BLOCK_SIZE 64 + +/* type to hold the SHA256 (and SHA224) context */ + +typedef struct +{ uint_32t count[2]; + uint_32t hash[8]; + uint_32t wbuf[16]; +} sha256_ctx; + +typedef sha256_ctx sha224_ctx; + +void_ret sha256_compile(sha256_ctx ctx[1]); + +void_ret sha224_begin(sha224_ctx ctx[1]); +#define sha224_hash sha256_hash +void_ret sha224_end(unsigned char hval[], sha224_ctx ctx[1]); +void_ret sha224(unsigned char hval[], const unsigned char data[], unsigned int len); + +void_ret sha256_begin(sha256_ctx ctx[1]); +void_ret sha256_hash(const unsigned char data[], unsigned int len, sha256_ctx ctx[1]); +void_ret sha256_end(unsigned char hval[], sha256_ctx ctx[1]); +void_ret sha256(unsigned char hval[], const unsigned char data[], unsigned int len); + + +#ifndef SHA_64BIT + +typedef struct +{ union + { sha256_ctx ctx256[1]; + } uu[1]; + uint_32t sha2_len; +} sha2_ctx; + +#define SHA2_MAX_DIGEST_SIZE SHA256_DIGEST_SIZE + +#else + +#define SHA384_DIGEST_SIZE 48 +#define SHA384_BLOCK_SIZE 128 +#define SHA512_DIGEST_SIZE 64 +#define SHA512_BLOCK_SIZE 128 +#define SHA2_MAX_DIGEST_SIZE SHA512_DIGEST_SIZE + +/* type to hold the SHA384 (and SHA512) context */ + +typedef struct +{ uint_64t count[2]; + uint_64t hash[8]; + uint_64t wbuf[16]; +} sha512_ctx; + +typedef sha512_ctx sha384_ctx; + +typedef struct +{ union + { sha256_ctx ctx256[1]; + sha512_ctx ctx512[1]; + } uu[1]; + uint_32t sha2_len; +} sha2_ctx; + +void_ret sha512_compile(sha512_ctx ctx[1]); + +void_ret sha384_begin(sha384_ctx ctx[1]); +#define sha384_hash sha512_hash +void_ret sha384_end(unsigned char hval[], sha384_ctx ctx[1]); +void_ret sha384(unsigned char hval[], const unsigned char data[], unsigned int len); + +void_ret sha512_begin(sha512_ctx ctx[1]); +void_ret sha512_hash(const unsigned char data[], unsigned int len, sha512_ctx ctx[1]); +void_ret sha512_end(unsigned char hval[], sha512_ctx ctx[1]); +void_ret sha512(unsigned char hval[], const unsigned char data[], unsigned int len); + +int_ret sha2_begin(unsigned int size, sha2_ctx ctx[1]); +void_ret sha2_hash(const unsigned char data[], unsigned int len, sha2_ctx ctx[1]); +void_ret sha2_end(unsigned char hval[], sha2_ctx ctx[1]); +int_ret sha2(unsigned char hval[], unsigned int size, const unsigned char data[], unsigned int len); +#endif + +#define RT_SHA256(Message, MessageL, DMessage) \ + sha256((DMessage), (Message), (MessageL)); + + +#if defined(__cplusplus) +} +#endif + + +#endif /* __CRYPT_SHA2_H__ */ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/dfs.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/dfs.h new file mode 100644 index 000000000..4a056eba9 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/dfs.h @@ -0,0 +1,138 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + dfs.h + + Abstract: + Support DFS function. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Fonchi 03-12-2007 created +*/ + +#define RADAR_PULSE 1 +#define RADAR_WIDTH 2 + +#define WIDTH_RD_IDLE 0 +#define WIDTH_RD_CHECK 1 + + + +/************************************************************************* + * + * DFS Radar related definitions. + * + ************************************************************************/ +//#define CARRIER_DETECT_TASK_NUM 6 +//#define RADAR_DETECT_TASK_NUM 7 + +// McuRadarState && McuCarrierState for 2880-SW-MCU +#define FREE_FOR_TX 0 +#define WAIT_CTS_BEING_SENT 1 +#define DO_DETECTION 2 + +// McuRadarEvent +#define RADAR_EVENT_CTS_SENT 0x01 // Host signal MCU that CTS has been sent +#define RADAR_EVENT_CTS_CARRIER_SENT 0x02 // Host signal MCU that CTS has been sent (Carrier) +#define RADAR_EVENT_RADAR_DETECTING 0x04 // Radar detection is on going, carrier detection hold back +#define RADAR_EVENT_CARRIER_DETECTING 0x08 // Carrier detection is on going, radar detection hold back +#define RADAR_EVENT_WIDTH_RADAR 0x10 // BBP == 2 radar detected +#define RADAR_EVENT_CTS_KICKED 0x20 // Radar detection need to sent double CTS, first CTS sent + +// McuRadarCmd +#define DETECTION_STOP 0 +#define RADAR_DETECTION 1 +#define CARRIER_DETECTION 2 + + + +#ifdef TONE_RADAR_DETECT_SUPPORT +INT Set_CarrierCriteria_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg); +int Set_CarrierReCheck_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg); +INT Set_CarrierStopCheck_Proc(IN PRTMP_ADAPTER pAd, IN PSTRING arg); +void NewCarrierDetectionStart(PRTMP_ADAPTER pAd); +void RTMPHandleRadarInterrupt(PRTMP_ADAPTER pAd); +#endif // TONE_RADAR_DETECT_SUPPORT // + + +VOID BbpRadarDetectionStart( + IN PRTMP_ADAPTER pAd); + +VOID BbpRadarDetectionStop( + IN PRTMP_ADAPTER pAd); + +VOID RadarDetectionStart( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN CTS_Protect, + IN UINT8 CTSPeriod); + +VOID RadarDetectionStop( + IN PRTMP_ADAPTER pAd); + +VOID RadarDetectPeriodic( + IN PRTMP_ADAPTER pAd); + + +BOOLEAN RadarChannelCheck( + IN PRTMP_ADAPTER pAd, + IN UCHAR Ch); + +ULONG JapRadarType( + IN PRTMP_ADAPTER pAd); + +ULONG RTMPBbpReadRadarDuration( + IN PRTMP_ADAPTER pAd); + +ULONG RTMPReadRadarDuration( + IN PRTMP_ADAPTER pAd); + +VOID RTMPCleanRadarDuration( + IN PRTMP_ADAPTER pAd); + +VOID RTMPPrepareRDCTSFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN ULONG Duration, + IN UCHAR RTSRate, + IN ULONG CTSBaseAddr, + IN UCHAR FrameGap); + +VOID RTMPPrepareRadarDetectParams( + IN PRTMP_ADAPTER pAd); + + +INT Set_ChMovingTime_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_LongPulseRadarTh_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/dot11i_wpa.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/dot11i_wpa.h new file mode 100644 index 000000000..c9f3fc606 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/dot11i_wpa.h @@ -0,0 +1,298 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + dot11i_wpa.h + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + +*/ + +#ifndef __DOT11I_WPA_H__ +#define __DOT11I_WPA_H__ + +#include "rtmp_type.h" + +/* The length is the EAPoL-Key frame except key data field. + Please refer to 802.11i-2004 ,Figure 43u in p.78 */ +#define MIN_LEN_OF_EAPOL_KEY_MSG 95 + +/* The related length of the EAPOL Key frame */ +#define LEN_KEY_DESC_NONCE 32 +#define LEN_KEY_DESC_IV 16 +#define LEN_KEY_DESC_RSC 8 +#define LEN_KEY_DESC_ID 8 +#define LEN_KEY_DESC_REPLAY 8 +#define LEN_KEY_DESC_MIC 16 + +/* EAP Code Type */ +#define EAP_CODE_REQUEST 1 +#define EAP_CODE_RESPONSE 2 +#define EAP_CODE_SUCCESS 3 +#define EAP_CODE_FAILURE 4 + +/* EAPOL frame Protocol Version */ +#define EAPOL_VER 1 +#define EAPOL_VER2 2 + +/* EAPOL-KEY Descriptor Type */ +#define WPA1_KEY_DESC 0xfe +#define WPA2_KEY_DESC 0x02 + +/* Key Descriptor Version of Key Information */ +#define KEY_DESC_TKIP 1 +#define KEY_DESC_AES 2 +#define KEY_DESC_EXT 3 + +#define IE_WPA 221 +#define IE_RSN 48 + +#define WPA_KDE_TYPE 0xdd + +//EAP Packet Type +#define EAPPacket 0 +#define EAPOLStart 1 +#define EAPOLLogoff 2 +#define EAPOLKey 3 +#define EAPOLASFAlert 4 +#define EAPTtypeMax 5 + +#define PAIRWISEKEY 1 +#define GROUPKEY 0 + +/* RSN IE Length definition */ +#define MAX_LEN_OF_RSNIE 255 +#define MIN_LEN_OF_RSNIE 18 +#define MAX_LEN_GTK 32 +#define MIN_LEN_GTK 5 + +#define LEN_PMK 32 +#define LEN_PMKID 16 +#define LEN_PMK_NAME 16 + +#define LEN_GMK 32 + +#define LEN_PTK_KCK 16 +#define LEN_PTK_KEK 16 +#define LEN_TK 16 // The length Temporal key. +#define LEN_TKIP_MIC 8 // The length of TX/RX Mic of TKIP +#define LEN_TK2 (2 * LEN_TKIP_MIC) +#define LEN_PTK (LEN_PTK_KCK + LEN_PTK_KEK + LEN_TK + LEN_TK2) + +#define LEN_TKIP_PTK LEN_PTK +#define LEN_AES_PTK (LEN_PTK_KCK + LEN_PTK_KEK + LEN_TK) +#define LEN_TKIP_GTK (LEN_TK + LEN_TK2) +#define LEN_AES_GTK LEN_TK +#define LEN_TKIP_TK (LEN_TK + LEN_TK2) +#define LEN_AES_TK LEN_TK + +#define OFFSET_OF_PTK_TK (LEN_PTK_KCK + LEN_PTK_KEK) // The offset of the PTK Temporal key in PTK +#define OFFSET_OF_AP_TKIP_TX_MIC (OFFSET_OF_PTK_TK + LEN_TK) +#define OFFSET_OF_AP_TKIP_RX_MIC (OFFSET_OF_AP_TKIP_TX_MIC + LEN_TKIP_MIC) +#define OFFSET_OF_STA_TKIP_RX_MIC (OFFSET_OF_PTK_TK + LEN_TK) +#define OFFSET_OF_STA_TKIP_TX_MIC (OFFSET_OF_AP_TKIP_TX_MIC + LEN_TKIP_MIC) + +#define LEN_KDE_HDR 6 +#define LEN_NONCE 32 +#define LEN_PN 6 +#define LEN_TKIP_IV_HDR 8 +#define LEN_CCMP_HDR 8 +#define LEN_CCMP_MIC 8 +#define LEN_OUI_SUITE 4 +#define LEN_WEP_TSC 3 +#define LEN_WPA_TSC 6 +#define LEN_WEP_IV_HDR 4 +#define LEN_ICV 4 + +/* It's defined in IEEE Std 802.11-2007 Table 8-4 */ +typedef enum _WPA_KDE_ID +{ + KDE_RESV0, + KDE_GTK, + KDE_RESV2, + KDE_MAC_ADDR, + KDE_PMKID, + KDE_SMK, + KDE_NONCE, + KDE_LIFETIME, + KDE_ERROR, + KDE_RESV_OTHER +} WPA_KDE_ID; + +// EAPOL Key Information definition within Key descriptor format +typedef struct GNU_PACKED _KEY_INFO +{ +#ifdef RT_BIG_ENDIAN + UCHAR KeyAck:1; + UCHAR Install:1; + UCHAR KeyIndex:2; + UCHAR KeyType:1; + UCHAR KeyDescVer:3; + UCHAR Rsvd:3; + UCHAR EKD_DL:1; // EKD for AP; DL for STA + UCHAR Request:1; + UCHAR Error:1; + UCHAR Secure:1; + UCHAR KeyMic:1; +#else + UCHAR KeyMic:1; + UCHAR Secure:1; + UCHAR Error:1; + UCHAR Request:1; + UCHAR EKD_DL:1; // EKD for AP; DL for STA + UCHAR Rsvd:3; + UCHAR KeyDescVer:3; + UCHAR KeyType:1; + UCHAR KeyIndex:2; + UCHAR Install:1; + UCHAR KeyAck:1; +#endif +} KEY_INFO, *PKEY_INFO; + +// EAPOL Key descriptor format +typedef struct GNU_PACKED _KEY_DESCRIPTER +{ + UCHAR Type; + KEY_INFO KeyInfo; + UCHAR KeyLength[2]; + UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY]; + UCHAR KeyNonce[LEN_KEY_DESC_NONCE]; + UCHAR KeyIv[LEN_KEY_DESC_IV]; + UCHAR KeyRsc[LEN_KEY_DESC_RSC]; + UCHAR KeyId[LEN_KEY_DESC_ID]; + UCHAR KeyMic[LEN_KEY_DESC_MIC]; + UCHAR KeyDataLen[2]; + UCHAR KeyData[0]; +} KEY_DESCRIPTER, *PKEY_DESCRIPTER; + +typedef struct GNU_PACKED _EAPOL_PACKET +{ + UCHAR ProVer; + UCHAR ProType; + UCHAR Body_Len[2]; + KEY_DESCRIPTER KeyDesc; +} EAPOL_PACKET, *PEAPOL_PACKET; + +typedef struct GNU_PACKED _KDE_HDR +{ + UCHAR Type; + UCHAR Len; + UCHAR OUI[3]; + UCHAR DataType; + UCHAR octet[0]; +} KDE_HDR, *PKDE_HDR; + +//802.11i D10 page 83 +typedef struct GNU_PACKED _GTK_KDE +{ +#ifndef RT_BIG_ENDIAN + UCHAR Kid:2; + UCHAR tx:1; + UCHAR rsv:5; + UCHAR rsv1; +#else + UCHAR rsv:5; + UCHAR tx:1; + UCHAR Kid:2; + UCHAR rsv1; +#endif + UCHAR GTK[0]; +} GTK_KDE, *PGTK_KDE; + +// For WPA1 +typedef struct GNU_PACKED _RSNIE { + UCHAR oui[4]; + USHORT version; + UCHAR mcast[4]; + USHORT ucount; + struct GNU_PACKED { + UCHAR oui[4]; + }ucast[1]; +} RSNIE, *PRSNIE; + +// For WPA2 +typedef struct GNU_PACKED _RSNIE2 { + USHORT version; + UCHAR mcast[4]; + USHORT ucount; + struct GNU_PACKED { + UCHAR oui[4]; + }ucast[1]; +} RSNIE2, *PRSNIE2; + +// AKM Suite +typedef struct GNU_PACKED _RSNIE_AUTH { + USHORT acount; + struct GNU_PACKED { + UCHAR oui[4]; + }auth[1]; +} RSNIE_AUTH,*PRSNIE_AUTH; + +// PMKID List +typedef struct GNU_PACKED _RSNIE_PMKID { + USHORT pcount; + struct GNU_PACKED { + UCHAR list[16]; + }pmkid[1]; +} RSNIE_PMKID,*PRSNIE_PMKID; + +typedef union GNU_PACKED _RSN_CAPABILITIES { + struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT Rsvd:8; + USHORT MFPC:1; + USHORT MFPR:1; + USHORT GTKSA_R_Counter:2; + USHORT PTKSA_R_Counter:2; + USHORT No_Pairwise:1; + USHORT PreAuth:1; +#else + USHORT PreAuth:1; + USHORT No_Pairwise:1; + USHORT PTKSA_R_Counter:2; + USHORT GTKSA_R_Counter:2; + USHORT MFPR:1; + USHORT MFPC:1; + USHORT Rsvd:8; +#endif + } field; + USHORT word; +} RSN_CAPABILITIES, *PRSN_CAPABILITIES; + +typedef struct GNU_PACKED _EAP_HDR { + UCHAR ProVer; + UCHAR ProType; + UCHAR Body_Len[2]; + UCHAR code; + UCHAR identifier; + UCHAR length[2]; // including code and identifier, followed by length-2 octets of data +} EAP_HDR, *PEAP_HDR; + + +#endif // __DOT11I_WPA_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/eeprom.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/eeprom.h new file mode 100644 index 000000000..539942b77 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/eeprom.h @@ -0,0 +1,82 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + eeprom.h + + Abstract: + Miniport header file for eeprom related information + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ +#ifndef __EEPROM_H__ +#define __EEPROM_H__ + + + +#ifdef RTMP_PCI_SUPPORT +/************************************************************************* + * Public function declarations for prom-based chipset + ************************************************************************/ +int rtmp_ee_prom_read16( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + OUT USHORT *pValue); + +int rtmp_ee_prom_write16( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT value); +#endif // RTMP_PCI_SUPPORT // + + + + + +#ifdef RT30xx +#ifdef RTMP_EFUSE_SUPPORT +int rtmp_ee_efuse_read16( + IN RTMP_ADAPTER *pAd, + IN USHORT Offset, + OUT USHORT *pValue); + +int rtmp_ee_efuse_write16( + IN RTMP_ADAPTER *pAd, + IN USHORT Offset, + IN USHORT data); +#endif // RTMP_EFUSE_SUPPORT // +#endif // RT30xx // + +/************************************************************************* + * Public function declarations for prom operation callback functions setting + ************************************************************************/ +INT RtmpChipOpsEepromHook( + IN RTMP_ADAPTER *pAd, + IN INT infType); + +#endif // __EEPROM_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/firmware.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/firmware.h new file mode 100644 index 000000000..eef41f67c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/firmware.h @@ -0,0 +1,558 @@ +/* + Copyright (c) 2007, Ralink Technology Corporation + All rights reserved. + + Redistribution. Redistribution and use in binary form, without + modification, are permitted provided that the following conditions are + met: + + * Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. + * Neither the name of Ralink Technology Corporation nor the names of its + suppliers may be used to endorse or promote products derived from this + software without specific prior written permission. + * No reverse engineering, decompilation, or disassembly of this software + is permitted. + + Limited patent license. Ralink Technology Corporation grants a world-wide, + royalty-free, non-exclusive license under patents it now or hereafter + owns or controls to make, have made, use, import, offer to sell and + sell ("Utilize") this software, but solely to the extent that any + such patent is necessary to Utilize the software alone, or in + combination with an operating system licensed under an approved Open + Source license as listed by the Open Source Initiative at + http://opensource.org/licenses. The patent license shall not apply to + any other combinations which include this software. No hardware per + se is licensed hereunder. + + DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. +*/ +/* AUTO GEN PLEASE DO NOT MODIFY IT */ +/* AUTO GEN PLEASE DO NOT MODIFY IT */ + + +UCHAR FirmwareImage [] = { +0x02, 0x03, 0x5b, 0x02, 0x02, 0xa6, 0x22, 0x22, 0xff, 0xff, 0xff, 0x02, 0x01, 0x2c, 0xff, 0xff, +0xff, 0xff, 0xff, 0x02, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0xdd, 0xc0, 0xe0, +0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18, 0xc2, 0xaf, 0x30, 0x45, 0x03, +0x12, 0x10, 0x09, 0x90, 0x04, 0x16, 0xe0, 0x30, 0xe3, 0x03, 0x74, 0x08, 0xf0, 0x90, 0x04, 0x14, +0xe0, 0x20, 0xe7, 0x03, 0x02, 0x00, 0xcb, 0x74, 0x80, 0xf0, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x36, +0x90, 0x04, 0x04, 0xe0, 0x24, 0xcf, 0x60, 0x30, 0x14, 0x60, 0x42, 0x24, 0xe2, 0x60, 0x47, 0x14, +0x60, 0x55, 0x24, 0x21, 0x70, 0x60, 0xe5, 0x55, 0x24, 0xfe, 0x60, 0x07, 0x14, 0x60, 0x08, 0x24, +0x02, 0x70, 0x08, 0x7d, 0x01, 0x80, 0x28, 0x7d, 0x02, 0x80, 0x24, 0x90, 0x70, 0x10, 0xe0, 0xf5, +0x50, 0x85, 0x36, 0x40, 0xd2, 0x01, 0x80, 0x3e, 0xe5, 0x55, 0x64, 0x03, 0x60, 0x04, 0xe5, 0x55, +0x70, 0x04, 0x7d, 0x02, 0x80, 0x09, 0x85, 0x36, 0x41, 0xd2, 0x02, 0x80, 0x29, 0xad, 0x55, 0xaf, +0x36, 0x12, 0x02, 0x82, 0x80, 0x20, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x47, 0x90, 0x70, 0x11, 0xe0, +0xf5, 0x44, 0x12, 0x10, 0x25, 0x80, 0x06, 0x90, 0x70, 0x10, 0xe0, 0xf5, 0x45, 0xe4, 0xfd, 0xaf, +0x36, 0x12, 0x02, 0x82, 0xd2, 0x04, 0x90, 0x70, 0x13, 0xe4, 0xf0, 0x90, 0x70, 0x13, 0xe4, 0xf0, +0xd2, 0xaf, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, +0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0xe8, 0xc0, 0xe0, 0xe9, 0xc0, 0xe0, 0xea, 0xc0, 0xe0, +0xeb, 0xc0, 0xe0, 0xec, 0xc0, 0xe0, 0xed, 0xc0, 0xe0, 0xee, 0xc0, 0xe0, 0xef, 0xc0, 0xe0, 0xc2, +0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x12, 0xd2, 0xaf, 0xd0, 0xe0, 0xff, 0xd0, 0xe0, 0xfe, 0xd0, +0xe0, 0xfd, 0xd0, 0xe0, 0xfc, 0xd0, 0xe0, 0xfb, 0xd0, 0xe0, 0xfa, 0xd0, 0xe0, 0xf9, 0xd0, 0xe0, +0xf8, 0xd0, 0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, +0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x10, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, +0x0c, 0x30, 0x58, 0x0a, 0xe5, 0x54, 0x60, 0x04, 0x15, 0x54, 0x80, 0x02, 0xc2, 0x58, 0x30, 0x59, +0x0a, 0xe5, 0x50, 0x60, 0x04, 0x15, 0x50, 0x80, 0x02, 0xc2, 0x59, 0xd5, 0x53, 0x07, 0x30, 0x60, +0x04, 0x15, 0x46, 0xd2, 0x04, 0x30, 0x45, 0x03, 0x12, 0x10, 0x0f, 0xc2, 0x8d, 0xd2, 0xaf, 0xd0, +0xd0, 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x90, 0x70, 0x2a, 0xe0, 0x30, 0xe1, +0x43, 0xc2, 0xaf, 0x90, 0x70, 0x28, 0xe0, 0x90, 0x10, 0x1c, 0xf0, 0x90, 0x70, 0x29, 0xe0, 0x90, +0x10, 0x1d, 0xf0, 0x90, 0x70, 0x2a, 0xe0, 0x90, 0x10, 0x1e, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, +0x37, 0x90, 0x10, 0x1e, 0xe0, 0x20, 0xe1, 0xf3, 0x90, 0x10, 0x1c, 0xe0, 0x90, 0x70, 0x28, 0xf0, +0x90, 0x10, 0x1d, 0xe0, 0x90, 0x70, 0x29, 0xf0, 0x90, 0x10, 0x1e, 0xe0, 0x90, 0x70, 0x2a, 0xf0, +0xc2, 0x05, 0xd2, 0xaf, 0x22, 0x12, 0x02, 0xc8, 0x30, 0x45, 0x03, 0x12, 0x10, 0x03, 0x30, 0x01, +0x06, 0x20, 0x09, 0x03, 0x12, 0x10, 0x1c, 0x30, 0x02, 0x06, 0x20, 0x0a, 0x03, 0x12, 0x10, 0x1f, +0x30, 0x03, 0x06, 0x20, 0x0b, 0x03, 0x12, 0x10, 0x1f, 0x30, 0x04, 0x06, 0x20, 0x0c, 0x03, 0x12, +0x10, 0x22, 0x20, 0x13, 0x09, 0x20, 0x11, 0x06, 0xe5, 0x2b, 0x45, 0x2c, 0x60, 0x03, 0xd3, 0x80, +0x01, 0xc3, 0x92, 0xa9, 0x12, 0x03, 0x1c, 0x80, 0xbf, 0xc2, 0x43, 0xd2, 0x45, 0xe4, 0xf5, 0x20, +0xf5, 0x21, 0xf5, 0x53, 0xf5, 0x46, 0xf5, 0x2b, 0xf5, 0x2c, 0xc2, 0x42, 0xf5, 0x51, 0xf5, 0x52, +0xf5, 0x55, 0x90, 0x04, 0x18, 0x74, 0x80, 0xf0, 0x90, 0x04, 0x1a, 0x74, 0x08, 0xf0, 0xc2, 0x1a, +0xc2, 0x18, 0xc2, 0x1b, 0x22, 0xc8, 0xef, 0xc8, 0xe6, 0xfa, 0x08, 0xe6, 0x4a, 0x60, 0x0c, 0xc8, +0xef, 0xc8, 0x08, 0xe6, 0x16, 0x18, 0x70, 0x01, 0x16, 0xc3, 0x22, 0xed, 0x24, 0xff, 0xfd, 0xec, +0x34, 0xff, 0xc8, 0xef, 0xc8, 0xf6, 0x08, 0xc6, 0xed, 0xc6, 0xd3, 0x22, 0xd0, 0x83, 0xd0, 0x82, +0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, +0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, +0x80, 0xdf, 0xef, 0xf4, 0x60, 0x1f, 0xe4, 0xfe, 0x12, 0x03, 0x67, 0xe0, 0xb4, 0xff, 0x12, 0x12, +0x03, 0x67, 0xef, 0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0, +0x22, 0x0e, 0xbe, 0x04, 0xe3, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, +0x75, 0xd0, 0x08, 0xc2, 0xaf, 0x30, 0x45, 0x03, 0x12, 0x10, 0x06, 0xd2, 0xaf, 0xd0, 0xd0, 0xd0, +0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0xc2, 0xaf, 0x12, 0x00, 0x06, 0x12, 0x02, 0x09, +0x12, 0x02, 0xe1, 0xe4, 0xf5, 0x22, 0xf5, 0x47, 0x90, 0x04, 0x00, 0x74, 0x80, 0xf0, 0xd2, 0xaf, +0x22, 0x75, 0x89, 0x02, 0xe4, 0xf5, 0x8c, 0xf5, 0x8a, 0xf5, 0x88, 0xf5, 0xb8, 0xf5, 0xe8, 0x75, +0x90, 0x18, 0xd2, 0x8c, 0x75, 0xa8, 0x05, 0x22, 0xef, 0x60, 0x03, 0x1f, 0x80, 0xfa, 0x22, 0xff, +0xc0, 0x26, 0x74, 0x03, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83, 0x75, 0x26, 0x0a, 0x22, 0xc0, 0x26, +0x74, 0x03, 0xc0, 0xe0, 0xc0, 0x82, 0xc0, 0x83, 0x75, 0x26, 0x18, 0x22, 0x30, 0x45, 0x03, 0x12, +0x10, 0x15, 0xe5, 0x20, 0x70, 0x03, 0x20, 0x10, 0x03, 0x30, 0x11, 0x03, 0x43, 0x87, 0x01, 0x22, +0xce, 0xef, 0xce, 0xee, 0x60, 0x08, 0x7f, 0xff, 0x12, 0x02, 0xf8, 0x1e, 0x80, 0xf5, 0x22, 0xc8, +0xef, 0xc8, 0xe6, 0x60, 0x03, 0x16, 0xc3, 0x22, 0xed, 0x14, 0xf6, 0xd3, 0x22, 0xc8, 0xef, 0xc8, +0xe6, 0x60, 0x06, 0x16, 0xe6, 0x24, 0xff, 0xb3, 0x22, 0xc3, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, +0xfd, 0x75, 0x81, 0x5f, 0x02, 0x01, 0xc5, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, +0x83, 0x22, 0xef, 0x90, 0x03, 0x7b, 0x93, 0x90, 0x03, 0x00, 0x73, 0x0a, 0x18, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0x02, 0x10, 0x28, 0x02, 0x10, 0x3b, 0x02, 0x10, 0x3c, 0x02, 0x13, 0xbc, 0x02, +0x13, 0xbd, 0x02, 0x14, 0x72, 0x02, 0x14, 0x73, 0xc3, 0x22, 0xff, 0xff, 0x02, 0x19, 0x4a, 0x02, +0x1a, 0xf4, 0x02, 0x15, 0x6c, 0x02, 0x14, 0xa7, 0x30, 0x05, 0x06, 0x20, 0x0d, 0x03, 0x12, 0x01, +0x7a, 0x30, 0x06, 0x06, 0x20, 0x0e, 0x03, 0x12, 0x1c, 0x2e, 0x22, 0x22, 0x90, 0x04, 0x14, 0xe0, +0x20, 0xe7, 0x03, 0x02, 0x13, 0xbb, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x56, 0x90, 0x04, 0x04, 0xe0, +0x12, 0x02, 0x5c, 0x10, 0xfb, 0x30, 0x10, 0xd2, 0x31, 0x10, 0x93, 0x33, 0x10, 0xa1, 0x34, 0x10, +0xb4, 0x35, 0x10, 0xab, 0x36, 0x11, 0x09, 0x50, 0x11, 0x4e, 0x51, 0x11, 0x57, 0x52, 0x11, 0x57, +0x53, 0x11, 0x57, 0x54, 0x11, 0x93, 0x55, 0x11, 0xf0, 0x56, 0x12, 0x43, 0x70, 0x12, 0x69, 0x71, +0x12, 0x92, 0x72, 0x13, 0x3e, 0x73, 0x13, 0x61, 0x80, 0x13, 0x88, 0x83, 0x13, 0xa0, 0x84, 0x00, +0x00, 0x13, 0xbb, 0xd2, 0x18, 0xd2, 0x61, 0x75, 0x35, 0x2a, 0x75, 0x32, 0x0b, 0x75, 0x33, 0xb8, +0x22, 0xc2, 0x18, 0x90, 0x01, 0x14, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xf5, +0x3c, 0x02, 0x13, 0xb5, 0xe5, 0x55, 0xb4, 0x02, 0x0f, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, +0x0d, 0x74, 0x08, 0xf0, 0x7d, 0x01, 0x80, 0x02, 0x7d, 0x02, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, +0x13, 0xb5, 0x20, 0x02, 0x03, 0x30, 0x03, 0x0a, 0x7d, 0x02, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, +0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x0c, 0x90, 0x01, 0x0c, 0xe0, 0x44, 0x02, 0xf0, +0xa3, 0xe0, 0x44, 0x04, 0xf0, 0x85, 0x56, 0x41, 0xd2, 0x02, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xf4, +0x70, 0x03, 0x02, 0x13, 0xbb, 0xe0, 0xf5, 0x30, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, +0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, 0xbb, 0x90, 0x70, 0x10, 0xe0, 0x54, 0x7f, 0xff, 0xbf, 0x0a, +0x0d, 0x90, 0x70, 0x11, 0xe0, 0xb4, 0x08, 0x06, 0x75, 0x4e, 0x01, 0x75, 0x4f, 0x84, 0x90, 0x70, +0x10, 0xe0, 0x54, 0x7f, 0xff, 0xbf, 0x02, 0x12, 0x90, 0x70, 0x11, 0xe0, 0x64, 0x08, 0x60, 0x04, +0xe0, 0xb4, 0x20, 0x06, 0x75, 0x4e, 0x03, 0x75, 0x4f, 0x20, 0xe4, 0xf5, 0x27, 0x22, 0x90, 0x70, +0x11, 0xe0, 0x24, 0xff, 0x92, 0x47, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, +0x60, 0x03, 0x02, 0x13, 0x49, 0x90, 0x04, 0x04, 0xe0, 0x25, 0xe0, 0x24, 0x5d, 0xf5, 0x57, 0x90, +0x70, 0x10, 0xe0, 0xff, 0x74, 0x47, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0x90, 0x70, 0x11, 0xe0, +0xff, 0x74, 0x48, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, +0x02, 0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, +0x49, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x1d, 0xe5, 0x47, 0x64, 0x08, 0x60, 0x17, 0xe5, 0x47, 0x64, +0x09, 0x60, 0x11, 0xe5, 0x47, 0x64, 0x0a, 0x60, 0x0b, 0xe5, 0x47, 0x64, 0x0b, 0x60, 0x05, 0xe5, +0x47, 0xb4, 0x0c, 0x08, 0x90, 0x70, 0x11, 0xe0, 0x54, 0x0f, 0xf5, 0x3a, 0xe5, 0x47, 0xb4, 0x09, +0x08, 0xe5, 0x3a, 0xb4, 0x03, 0x03, 0xe4, 0xf5, 0x46, 0xe5, 0x47, 0xb4, 0x0a, 0x08, 0xe5, 0x3a, +0xb4, 0x01, 0x03, 0xe4, 0xf5, 0x46, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0xd2, 0x04, 0x22, +0x90, 0x70, 0x11, 0xe0, 0xf4, 0xff, 0x90, 0x70, 0x10, 0xe0, 0x5f, 0xff, 0x90, 0x70, 0x11, 0xe0, +0x55, 0x27, 0x4f, 0x90, 0x70, 0x18, 0xf0, 0x90, 0x70, 0x11, 0xe0, 0x90, 0x70, 0x19, 0xf0, 0xe4, +0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x30, 0x15, 0x03, 0xd2, 0x14, 0x22, 0x90, 0x70, 0x18, 0xe0, +0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e, 0x90, 0x02, +0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90, 0x02, 0x28, +0xef, 0xf0, 0x22, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, 0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, +0x49, 0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed, 0xf8, 0xe6, 0xf5, 0x57, +0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, 0x13, 0xb5, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x07, +0xe5, 0x55, 0x60, 0x03, 0x02, 0x13, 0x49, 0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, +0xfd, 0xed, 0xf5, 0x82, 0x8e, 0x83, 0xe0, 0xf5, 0x57, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x02, +0x13, 0xb5, 0x90, 0x10, 0x00, 0xe0, 0xf5, 0x57, 0xe4, 0xf5, 0x58, 0xf5, 0x59, 0x90, 0x10, 0x03, +0xe0, 0xb4, 0x28, 0x05, 0x75, 0x58, 0x01, 0x80, 0x3c, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x30, 0x05, +0x75, 0x58, 0x02, 0x80, 0x30, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x33, 0x05, 0x75, 0x58, 0x04, 0x80, +0x24, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x35, 0x0c, 0x90, 0x10, 0x02, 0xe0, 0xb4, 0x72, 0x05, 0x75, +0x58, 0x08, 0x80, 0x11, 0x90, 0x10, 0x03, 0xe0, 0xb4, 0x35, 0x0a, 0x90, 0x10, 0x02, 0xe0, 0xb4, +0x93, 0x03, 0x75, 0x58, 0x10, 0xe5, 0x58, 0x30, 0xe1, 0x19, 0x90, 0x05, 0x08, 0xe0, 0x44, 0x01, +0xf0, 0xfd, 0x90, 0x05, 0x05, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x04, 0xf0, 0xed, 0x54, 0xfe, 0x90, +0x05, 0x08, 0xf0, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x75, 0x3a, 0xff, 0xc2, 0x1a, 0xc2, 0x18, 0xc2, +0x1b, 0xf5, 0x34, 0x90, 0x05, 0xa4, 0x74, 0x11, 0xf0, 0xa3, 0x74, 0xff, 0xf0, 0xa3, 0x74, 0x03, +0xf0, 0xe4, 0xf5, 0x30, 0xc2, 0x19, 0x90, 0x01, 0x0d, 0xe0, 0x44, 0x40, 0xf0, 0x75, 0x3c, 0xff, +0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0xe4, 0x90, 0x70, 0x32, 0xf0, 0x80, 0x77, 0xe5, 0x34, +0xd3, 0x94, 0x01, 0x40, 0x0b, 0xe5, 0x55, 0x60, 0x07, 0x7d, 0x03, 0xaf, 0x56, 0x02, 0x02, 0x82, +0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x93, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80, +0x54, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x0d, 0xe5, 0x55, 0x60, 0x09, 0x7d, 0x03, 0xaf, 0x56, +0x12, 0x02, 0x82, 0x80, 0x40, 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x4a, 0xd2, 0x05, 0xad, +0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80, 0x2d, 0xe4, 0xf5, 0x34, 0xf5, 0x30, 0x90, 0x70, 0x10, +0xe0, 0xf4, 0x60, 0x03, 0xe0, 0xf5, 0x34, 0xad, 0x57, 0xaf, 0x56, 0x12, 0x02, 0x82, 0x80, 0x15, +0xd2, 0x19, 0x05, 0x2f, 0xe5, 0x2f, 0xb4, 0x1a, 0x03, 0xe4, 0xf5, 0x2f, 0xd2, 0x04, 0xad, 0x57, +0xaf, 0x56, 0x12, 0x02, 0x82, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0x22, 0x22, 0xe5, 0x34, 0xc3, +0x94, 0x03, 0x40, 0x17, 0xe5, 0x55, 0xb4, 0x02, 0x12, 0xe5, 0x30, 0x60, 0x0e, 0x30, 0x60, 0x0b, +0x74, 0xfd, 0x25, 0x46, 0xf5, 0x46, 0xd2, 0x04, 0xe4, 0xf5, 0x53, 0xe5, 0x53, 0x60, 0x03, 0x02, +0x14, 0x71, 0x30, 0x60, 0x21, 0xb2, 0x4d, 0x30, 0x4d, 0x1c, 0xe5, 0x34, 0xc3, 0x94, 0x03, 0x40, +0x11, 0xe5, 0x55, 0xb4, 0x02, 0x0c, 0xe5, 0x30, 0x60, 0x08, 0x74, 0x03, 0x25, 0x46, 0xf5, 0x46, +0x80, 0x02, 0x05, 0x46, 0xc2, 0x04, 0xe5, 0x4f, 0x45, 0x4e, 0x60, 0x08, 0xe5, 0x4f, 0x15, 0x4f, +0x70, 0x02, 0x15, 0x4e, 0x30, 0x1a, 0x49, 0x7f, 0x32, 0x7d, 0xb8, 0x7c, 0x0b, 0x12, 0x02, 0x35, +0x50, 0x06, 0x90, 0x04, 0x10, 0x74, 0x40, 0xf0, 0x7f, 0x35, 0x7d, 0x32, 0x12, 0x03, 0x3f, 0x50, +0x09, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xf7, 0xf0, 0xd2, 0x06, 0xe5, 0x35, 0xd3, 0x94, 0x2d, 0x40, +0x30, 0x30, 0x1b, 0x2d, 0xc2, 0x1b, 0xa2, 0x18, 0x92, 0x1a, 0x20, 0x1a, 0x24, 0x90, 0x04, 0x09, +0xe0, 0x54, 0xdd, 0xf0, 0x90, 0x10, 0x04, 0xe0, 0x44, 0x08, 0xf0, 0xc2, 0x61, 0xd2, 0x03, 0x22, +0xe4, 0xf5, 0x35, 0xa2, 0x18, 0x92, 0x1a, 0x30, 0x1a, 0x07, 0x90, 0x04, 0x09, 0xe0, 0x44, 0x22, +0xf0, 0x22, 0x22, 0x30, 0x14, 0x30, 0x90, 0x70, 0x19, 0xe0, 0x55, 0x27, 0xff, 0x90, 0x70, 0x18, +0xe0, 0x4f, 0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e, +0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90, +0x02, 0x28, 0xef, 0xf0, 0xc2, 0x14, 0x22, 0xc2, 0x4b, 0xc2, 0x4c, 0xe5, 0x44, 0x12, 0x02, 0x5c, +0x14, 0xc9, 0x00, 0x15, 0x57, 0x04, 0x15, 0x53, 0x08, 0x15, 0x33, 0x10, 0x14, 0xdd, 0x20, 0x14, +0xfd, 0x60, 0x15, 0x0e, 0xa0, 0x00, 0x00, 0x15, 0x59, 0x85, 0x48, 0x43, 0x85, 0x4a, 0x42, 0x85, +0x4c, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x60, 0x03, 0x02, 0x15, 0x59, 0x80, 0x1b, 0xe5, 0x48, 0xc4, +0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4a, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4c, 0xc4, 0x54, 0x0f, +0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x61, 0x53, 0x43, 0x0f, 0x80, 0x5c, 0x85, 0x49, 0x43, +0x85, 0x4b, 0x42, 0x85, 0x4d, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x4d, 0x80, 0x1b, 0xe5, 0x49, +0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4b, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4d, 0xc4, 0x54, +0x0f, 0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x30, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x10, 0xf5, +0x43, 0x80, 0x26, 0xe5, 0x47, 0x64, 0x04, 0x60, 0x05, 0xe5, 0x47, 0xb4, 0x05, 0x06, 0x43, 0x5e, +0x04, 0x75, 0x42, 0x09, 0xe5, 0x47, 0xb4, 0x06, 0x10, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x30, 0xf5, +0x43, 0x80, 0x06, 0xd2, 0x4b, 0x80, 0x02, 0xd2, 0x4c, 0xe4, 0xf5, 0x2a, 0xe5, 0x42, 0xc4, 0x54, +0xf0, 0xff, 0xe5, 0x43, 0x54, 0x0f, 0x4f, 0xf5, 0x5f, 0xd2, 0x60, 0x22, 0xd2, 0x15, 0xe5, 0x47, +0x24, 0xf5, 0x60, 0x0b, 0x24, 0xcb, 0x60, 0x07, 0x24, 0x40, 0x70, 0x06, 0xc2, 0x15, 0x22, 0x12, +0x19, 0x15, 0x12, 0x15, 0x8e, 0xc2, 0x15, 0xc2, 0xaf, 0xc2, 0x04, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, +0x90, 0x04, 0x14, 0xe0, 0x54, 0x0e, 0x60, 0x04, 0xd2, 0x1c, 0x80, 0x08, 0xe5, 0x4e, 0x45, 0x4f, +0x24, 0xff, 0x92, 0x1c, 0xd2, 0xaf, 0x90, 0x04, 0x14, 0xe0, 0xa2, 0xe4, 0x92, 0x1d, 0x74, 0x1e, +0xf0, 0xe5, 0x5f, 0x54, 0x0f, 0xf5, 0x2d, 0xe5, 0x2a, 0x70, 0x13, 0x30, 0x1c, 0x05, 0xe5, 0x5f, +0x20, 0xe5, 0x0b, 0x30, 0x1d, 0x29, 0xe5, 0x5f, 0x54, 0x30, 0x64, 0x30, 0x70, 0x21, 0xe5, 0x2a, +0x70, 0x15, 0xe5, 0x34, 0xc3, 0x94, 0x03, 0x40, 0x09, 0xe5, 0x30, 0x60, 0x05, 0x75, 0x2a, 0x05, +0x80, 0x07, 0x75, 0x2a, 0x0c, 0x80, 0x02, 0x15, 0x2a, 0xd2, 0x6c, 0xd2, 0x6d, 0x80, 0x0f, 0xe5, +0x5f, 0x30, 0xe6, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0xe5, 0x47, +0x64, 0x03, 0x70, 0x21, 0x30, 0x4b, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x18, 0xe5, 0x2a, 0x70, +0x03, 0x30, 0x4c, 0x11, 0xc2, 0x4c, 0xe5, 0x2a, 0x70, 0x05, 0x75, 0x2a, 0x07, 0x80, 0x02, 0x15, +0x2a, 0xd2, 0x6c, 0xd2, 0x6d, 0xe5, 0x47, 0xb4, 0x09, 0x14, 0xe5, 0x44, 0x20, 0xe3, 0x0b, 0xe5, +0x3a, 0x64, 0x02, 0x60, 0x05, 0xe5, 0x3a, 0xb4, 0x03, 0x04, 0xc2, 0x6c, 0xd2, 0x6d, 0xe5, 0x47, +0xb4, 0x0a, 0x13, 0xe5, 0x3a, 0xb4, 0x01, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x08, 0xe5, 0x3a, +0x70, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0x20, 0x69, 0x07, 0xe5, 0x5e, 0x20, 0xe0, 0x02, 0xb2, 0x68, +0x20, 0x6b, 0x07, 0xe5, 0x5e, 0x20, 0xe1, 0x02, 0xb2, 0x6a, 0x20, 0x6d, 0x07, 0xe5, 0x5e, 0x20, +0xe2, 0x02, 0xb2, 0x6c, 0x75, 0x2e, 0x40, 0x20, 0x69, 0x04, 0xa2, 0x68, 0x80, 0x45, 0x30, 0x68, +0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30, 0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f, +0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4, 0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, +0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, +0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, +0x6f, 0x24, 0xff, 0x92, 0x73, 0x92, 0x72, 0x20, 0x6b, 0x04, 0xa2, 0x6a, 0x80, 0x45, 0x30, 0x6a, +0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30, 0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f, +0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4, 0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, +0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, +0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, +0x6f, 0x24, 0xff, 0x92, 0x75, 0x92, 0x74, 0x20, 0x6d, 0x04, 0xa2, 0x6c, 0x80, 0x26, 0xe5, 0x47, +0x64, 0x0a, 0x70, 0x22, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x17, 0xe5, 0x3a, 0xb4, +0x01, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x53, 0xe5, 0x46, 0x20, 0xe4, 0x03, 0x30, 0xe5, 0x03, +0xd3, 0x80, 0x01, 0xc3, 0x80, 0x45, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x3c, 0x30, +0x19, 0x1c, 0xe5, 0x5e, 0x20, 0xe2, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x2f, 0xb4, +0x19, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x80, 0x1d, 0xe5, 0x5e, +0x20, 0xe2, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, +0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x71, 0x92, 0x70, 0x90, +0x10, 0x00, 0xe0, 0x90, 0x10, 0x2c, 0xf0, 0x90, 0x10, 0x03, 0xe0, 0xc3, 0x94, 0x30, 0x40, 0x14, +0xa2, 0x71, 0x92, 0x77, 0xa2, 0x70, 0x92, 0x76, 0xe5, 0x2e, 0x13, 0x13, 0x54, 0x3f, 0xf5, 0x2e, +0xc2, 0x77, 0xd2, 0x76, 0x90, 0x10, 0x2f, 0xe5, 0x2e, 0xf0, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x39, +0x90, 0x02, 0x29, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x43, 0xc4, 0x54, 0x0f, 0x14, 0x60, 0x0c, 0x24, +0xfe, 0x60, 0x0c, 0x24, 0x03, 0x70, 0x13, 0xc2, 0x38, 0x80, 0x0f, 0xd2, 0x38, 0x80, 0x0b, 0xe5, +0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x38, 0x30, 0x47, 0x05, 0xaf, 0x27, 0x02, +0x19, 0x0f, 0xe5, 0x27, 0xf4, 0xff, 0x02, 0x19, 0x0f, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x0f, 0xe5, +0x47, 0x64, 0x08, 0x60, 0x09, 0xe5, 0x47, 0x64, 0x09, 0x60, 0x03, 0x02, 0x18, 0x8e, 0x90, 0x02, +0x29, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x22, 0x14, 0x60, 0x25, 0x14, 0x60, 0x2d, +0x24, 0xfc, 0x60, 0x49, 0x24, 0xf9, 0x60, 0x14, 0x24, 0x0e, 0x70, 0x50, 0xe5, 0x46, 0x13, 0x13, +0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x24, 0xff, 0x80, 0x3a, 0xd2, 0x39, 0xc2, 0x38, +0x80, 0x3e, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x1d, 0xc3, 0x80, 0x1a, 0xe5, 0x46, 0x30, +0xe2, 0x0d, 0x54, 0x38, 0xc3, 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, +0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0x38, 0xc2, 0x39, 0x80, 0x13, 0xe5, 0x46, 0x30, +0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, 0xc2, 0x38, 0x80, 0x04, 0xc2, 0x38, 0xc2, 0x39, +0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x02, 0x19, 0x0f, 0xe5, 0x47, +0x64, 0x0c, 0x60, 0x06, 0xe5, 0x47, 0x64, 0x0b, 0x70, 0x7a, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfd, +0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x20, 0x14, 0x60, 0x21, 0x14, 0x60, 0x2b, 0x24, 0xfc, 0x60, 0x45, +0x24, 0xf9, 0x60, 0x12, 0x24, 0x0e, 0x70, 0x4a, 0xe5, 0x46, 0x13, 0x13, 0x54, 0x3f, 0x75, 0xf0, +0x03, 0x84, 0xe5, 0xf0, 0x80, 0x29, 0xd2, 0x39, 0x80, 0x3a, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, +0x80, 0x01, 0xc3, 0x92, 0x39, 0x80, 0x2d, 0xe5, 0x46, 0x30, 0xe2, 0x0d, 0x54, 0x38, 0xc3, 0x94, +0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24, +0xff, 0x92, 0x39, 0x80, 0x0f, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, +0x80, 0x02, 0xc2, 0x39, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90, +0x02, 0x28, 0xef, 0xf0, 0x22, 0xe5, 0x47, 0xb4, 0x0b, 0x10, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xeb, +0xf0, 0xe5, 0x27, 0x54, 0xeb, 0x45, 0x45, 0xf5, 0x27, 0x22, 0xe4, 0x90, 0x02, 0x29, 0xf0, 0x30, +0x47, 0x04, 0xaf, 0x45, 0x80, 0x04, 0xe5, 0x45, 0xf4, 0xff, 0x90, 0x02, 0x28, 0xef, 0xf0, 0x22, +0x8f, 0x50, 0xd2, 0x59, 0x22, 0x8f, 0x54, 0xd2, 0x58, 0x22, 0xe4, 0xf5, 0x37, 0xc2, 0xaf, 0xe5, +0x51, 0x14, 0x60, 0x4a, 0x14, 0x60, 0x6b, 0x24, 0x02, 0x60, 0x03, 0x02, 0x1a, 0xd5, 0xd2, 0x59, +0x75, 0x55, 0x01, 0x20, 0x1a, 0x1c, 0x90, 0x02, 0x08, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x20, 0xe1, +0x23, 0x90, 0x04, 0x34, 0xe0, 0xb4, 0x02, 0x1c, 0xa3, 0xe0, 0xb4, 0x02, 0x17, 0xa3, 0xe0, 0xb4, +0x02, 0x12, 0x7f, 0x20, 0x12, 0x19, 0x40, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xf3, 0xf0, 0x75, 0x51, +0x01, 0x02, 0x1a, 0xd5, 0xe5, 0x50, 0x70, 0x06, 0x75, 0x37, 0x03, 0x02, 0x1a, 0xd5, 0x90, 0x12, +0x00, 0xe0, 0x54, 0x03, 0x70, 0x15, 0x7f, 0x20, 0x12, 0x19, 0x40, 0x20, 0x1a, 0x07, 0x90, 0x02, +0x08, 0xe0, 0x54, 0xfb, 0xf0, 0x75, 0x51, 0x02, 0x02, 0x1a, 0xd5, 0xe5, 0x50, 0x70, 0x03, 0x02, +0x1a, 0xd0, 0x20, 0x1a, 0x15, 0x90, 0x02, 0x08, 0xe0, 0x30, 0xe3, 0x03, 0x02, 0x1a, 0xcc, 0x90, +0x04, 0x37, 0xe0, 0x64, 0x22, 0x60, 0x03, 0x02, 0x1a, 0xcc, 0x90, 0x12, 0x04, 0x74, 0x0a, 0xf0, +0xe5, 0x58, 0x30, 0xe3, 0x15, 0xe4, 0x90, 0x05, 0x00, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, +0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12, 0x03, 0x30, 0x90, 0x13, 0x28, 0xe0, 0x90, 0x70, +0x1a, 0xf0, 0x90, 0x13, 0x29, 0xe0, 0x90, 0x70, 0x1b, 0xf0, 0x90, 0x13, 0x2b, 0xe0, 0x90, 0x70, +0x22, 0xf0, 0x90, 0x13, 0x28, 0xe0, 0x54, 0xf0, 0xf0, 0xa3, 0xe0, 0x54, 0xf0, 0xf0, 0x90, 0x13, +0x2b, 0xe0, 0x54, 0xcc, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x17, 0xe5, 0x34, 0x70, 0x13, 0xe5, 0x3c, +0xf4, 0x90, 0x13, 0x2a, 0x60, 0x05, 0xe0, 0x54, 0xf3, 0x80, 0x11, 0xe0, 0x54, 0xfb, 0xf0, 0x80, +0x14, 0xe5, 0x3c, 0xf4, 0x90, 0x13, 0x2a, 0x60, 0x08, 0xe0, 0x54, 0xf2, 0x45, 0x3c, 0xf0, 0x80, +0x04, 0xe0, 0x54, 0xfa, 0xf0, 0x20, 0x1a, 0x07, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x10, 0xf0, 0xe5, +0x34, 0xd3, 0x94, 0x01, 0x40, 0x09, 0xe5, 0x30, 0x70, 0x05, 0x75, 0x8c, 0x40, 0x80, 0x03, 0x75, +0x8c, 0x80, 0x90, 0x04, 0x01, 0xe0, 0x54, 0xfd, 0xf0, 0x20, 0x1a, 0x07, 0x90, 0x12, 0x04, 0xe0, +0x44, 0x04, 0xf0, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0xe0, 0xf5, 0x31, 0xe5, 0x34, +0xd3, 0x94, 0x01, 0x40, 0x2c, 0x90, 0x01, 0x0d, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x58, 0x20, 0xe3, +0x0c, 0xe5, 0x34, 0xb4, 0x03, 0x07, 0x90, 0x12, 0x04, 0xe0, 0x54, 0xfd, 0xf0, 0x20, 0x02, 0x11, +0x20, 0x03, 0x0e, 0x90, 0x01, 0x0d, 0xe0, 0x54, 0xfb, 0xf0, 0x90, 0x01, 0x0c, 0xe0, 0x54, 0xfd, +0xf0, 0x75, 0x37, 0x01, 0x75, 0x55, 0x02, 0xe4, 0xf5, 0x51, 0x80, 0x09, 0xe5, 0x50, 0x70, 0x05, +0x75, 0x37, 0x03, 0xf5, 0x51, 0xe5, 0x37, 0x60, 0x18, 0xc2, 0x01, 0xe4, 0xf5, 0x51, 0xc2, 0x59, +0x20, 0x1a, 0x0e, 0xad, 0x37, 0xaf, 0x40, 0x12, 0x1b, 0xfa, 0xe5, 0x37, 0xb4, 0x03, 0x02, 0xd2, +0x03, 0xd2, 0xaf, 0x22, 0xc2, 0xaf, 0x30, 0x01, 0x0e, 0xe4, 0xf5, 0x51, 0xc2, 0x59, 0xc2, 0x01, +0x7d, 0x02, 0xaf, 0x40, 0x12, 0x1b, 0xfa, 0xe5, 0x52, 0x14, 0x60, 0x56, 0x14, 0x60, 0x33, 0x24, +0x02, 0x60, 0x03, 0x02, 0x1b, 0xf7, 0xe5, 0x34, 0xd3, 0x94, 0x01, 0x40, 0x1f, 0x90, 0x01, 0x0c, +0xe0, 0x44, 0x02, 0xf0, 0xa3, 0xe0, 0x44, 0x04, 0xf0, 0x90, 0x12, 0x04, 0xe0, 0x44, 0x02, 0xf0, +0x7f, 0x32, 0x12, 0x03, 0x30, 0x90, 0x01, 0x0d, 0xe0, 0x54, 0xfe, 0xf0, 0x75, 0x52, 0x02, 0x75, +0x55, 0x03, 0xe5, 0x58, 0x30, 0xe0, 0x06, 0x90, 0x01, 0x0d, 0xe5, 0x31, 0xf0, 0x90, 0x12, 0x04, +0xe0, 0x54, 0xfb, 0xf0, 0x7f, 0x20, 0x12, 0x19, 0x45, 0x75, 0x52, 0x01, 0x75, 0x55, 0x03, 0x02, +0x1b, 0xf7, 0xe5, 0x54, 0x60, 0x03, 0x02, 0x1b, 0xf7, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x0e, 0xf0, +0x20, 0x1a, 0x04, 0xe0, 0x54, 0xef, 0xf0, 0xe4, 0xf5, 0x8c, 0xe5, 0x58, 0x54, 0x18, 0x60, 0x1e, +0x90, 0x70, 0x1a, 0xe0, 0x90, 0x13, 0x28, 0xf0, 0x90, 0x70, 0x1b, 0xe0, 0x90, 0x13, 0x29, 0xf0, +0xa3, 0x74, 0x05, 0xf0, 0x90, 0x70, 0x22, 0xe0, 0x90, 0x13, 0x2b, 0xf0, 0x80, 0x11, 0x90, 0x13, +0x28, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x05, 0xf0, 0x90, +0x12, 0x04, 0x74, 0x03, 0xf0, 0xe5, 0x58, 0x30, 0xe3, 0x16, 0x90, 0x05, 0x00, 0x74, 0xe2, 0xf0, +0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12, 0x03, 0x30, +0x20, 0x1a, 0x07, 0x90, 0x02, 0x08, 0xe0, 0x44, 0x05, 0xf0, 0x90, 0x10, 0x04, 0xe0, 0x44, 0x0c, +0xf0, 0xe4, 0xf5, 0x52, 0xf5, 0x55, 0x30, 0x02, 0x09, 0xc2, 0x02, 0x7d, 0x01, 0xaf, 0x41, 0x12, +0x1b, 0xfa, 0x30, 0x03, 0x02, 0xc2, 0x03, 0xd2, 0xaf, 0x22, 0xef, 0xf4, 0x60, 0x2d, 0xe4, 0xfe, +0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xe0, 0xb4, 0xff, 0x19, 0x74, 0x14, +0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xef, 0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, +0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0, 0x22, 0x0e, 0xbe, 0x04, 0xd5, 0x22, 0x22, 0x22, 0x30, 0x1a, +0x77, 0x90, 0x04, 0x37, 0xe0, 0x20, 0xe5, 0x6c, 0x90, 0x04, 0x28, 0xe0, 0xf5, 0x38, 0xa3, 0xe0, +0xf5, 0x37, 0xf5, 0x39, 0xe4, 0xf5, 0x25, 0xe5, 0x39, 0x75, 0xf0, 0x80, 0xa4, 0x24, 0x00, 0xff, +0xe5, 0xf0, 0x34, 0x80, 0xfe, 0xe5, 0x37, 0x65, 0x39, 0x70, 0x05, 0xfc, 0x7d, 0x28, 0x80, 0x04, +0x7c, 0x00, 0x7d, 0x00, 0xef, 0x2d, 0xff, 0xee, 0x3c, 0xfe, 0x12, 0x1c, 0xa9, 0x50, 0x07, 0x90, +0x01, 0x14, 0xe0, 0x44, 0x02, 0xf0, 0xe5, 0x39, 0x65, 0x38, 0x60, 0x10, 0xe4, 0x25, 0x39, 0xff, +0xe4, 0x34, 0x80, 0x8f, 0x82, 0xf5, 0x83, 0xe0, 0xf5, 0x39, 0x80, 0xbb, 0x90, 0x04, 0x10, 0x74, +0x01, 0xf0, 0x90, 0x04, 0x28, 0xe5, 0x38, 0xf0, 0xa3, 0xe5, 0x37, 0xf0, 0x90, 0x04, 0x11, 0x74, +0x01, 0xf0, 0x80, 0x8d, 0xc2, 0x06, 0xd2, 0x1b, 0x22, 0xe5, 0x25, 0xc3, 0x94, 0x06, 0x50, 0x19, +0x8f, 0x82, 0x8e, 0x83, 0xe0, 0xb4, 0xff, 0x07, 0x05, 0x25, 0xe4, 0xf5, 0x24, 0x80, 0x2e, 0xe4, +0xf5, 0x25, 0x8f, 0x82, 0x8e, 0x83, 0xf0, 0x80, 0x24, 0xe5, 0x24, 0x75, 0xf0, 0x06, 0x84, 0x74, +0x08, 0x25, 0xf0, 0xf5, 0x82, 0xe4, 0x34, 0x10, 0xf5, 0x83, 0xe0, 0xfd, 0x8f, 0x82, 0x8e, 0x83, +0xe0, 0x6d, 0x70, 0x06, 0x05, 0x25, 0x05, 0x24, 0x80, 0x03, 0xe4, 0xf5, 0x25, 0x0f, 0xbf, 0x00, +0x01, 0x0e, 0xef, 0x54, 0x7f, 0x60, 0x07, 0xe5, 0x25, 0xc3, 0x94, 0x2a, 0x40, 0xab, 0xe5, 0x25, +0xb4, 0x2a, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x53, 0x88, } ; diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/iface/rtmp_pci.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/iface/rtmp_pci.h new file mode 100644 index 000000000..0665a77b4 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/iface/rtmp_pci.h @@ -0,0 +1,99 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_pci.h + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- +*/ + +#ifndef __RTMP_PCI_H__ +#define __RTMP_PCI_H__ + +#define RT28XX_HANDLE_DEV_ASSIGN(handle, dev_p) \ + ((POS_COOKIE)handle)->pci_dev = dev_p; + + +#ifdef LINUX +// set driver data +#define RT28XX_DRVDATA_SET(_a) pci_set_drvdata(_a, net_dev); + +#define RT28XX_PUT_DEVICE(dev_p) + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +#ifndef SA_SHIRQ +#define SA_SHIRQ IRQF_SHARED +#endif +#endif + +#ifdef PCI_MSI_SUPPORT +#define RTMP_MSI_ENABLE(_pAd) \ + { POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \ + (_pAd)->HaveMsi = pci_enable_msi(_pObj->pci_dev) == 0 ? TRUE : FALSE; \ + } + +#define RTMP_MSI_DISABLE(_pAd) \ + { POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \ + if (_pAd->HaveMsi == TRUE) \ + pci_disable_msi(_pObj->pci_dev); \ + _pAd->HaveMsi = FALSE; \ + } +#else +#define RTMP_MSI_ENABLE(_pAd) do{}while(0) +#define RTMP_MSI_DISABLE(_pAd) do{}while(0) +#endif // PCI_MSI_SUPPORT // + +#define RTMP_PCI_DEV_UNMAP() \ +{ if (net_dev->base_addr) { \ + iounmap((void *)(net_dev->base_addr)); \ + release_mem_region(pci_resource_start(dev_p, 0), \ + pci_resource_len(dev_p, 0)); } \ + if (net_dev->irq) pci_release_regions(dev_p); } + + +#define PCI_REG_READ_WORD(pci_dev, offset, Configuration) \ + if (pci_read_config_word(pci_dev, offset, ®16) == 0) \ + Configuration = le2cpu16(reg16); \ + else \ + Configuration = 0; + +#define PCI_REG_WIRTE_WORD(pci_dev, offset, Configuration) \ + reg16 = cpu2le16(Configuration); \ + pci_write_config_word(pci_dev, offset, reg16); + +#endif // LINUX // + +#define CMDTHREAD_CHAN_RESCAN 0x0D730101 // cmd +#define CMDTHREAD_REG_HINT 0x0D730102 // cmd +#define CMDTHREAD_REG_HINT_11D 0x0D730103 // cmd +#define CMDTHREAD_SCAN_END 0x0D730104 // cmd +#define CMDTHREAD_CONNECT_RESULT_INFORM 0x0D730105 // cmd + +#endif // __RTMP_PCI_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/link_list.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/link_list.h new file mode 100644 index 000000000..a2358e165 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/link_list.h @@ -0,0 +1,134 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + +#ifndef __LINK_LIST_H__ +#define __LINK_LIST_H__ + +typedef struct _LIST_ENTRY +{ + struct _LIST_ENTRY *pNext; +} LIST_ENTRY, *PLIST_ENTRY; + +typedef struct _LIST_HEADR +{ + PLIST_ENTRY pHead; + PLIST_ENTRY pTail; + UCHAR size; +} LIST_HEADER, *PLIST_HEADER; + +static inline VOID initList( + IN PLIST_HEADER pList) +{ + pList->pHead = pList->pTail = NULL; + pList->size = 0; + return; +} + +static inline VOID insertTailList( + IN PLIST_HEADER pList, + IN PLIST_ENTRY pEntry) +{ + pEntry->pNext = NULL; + if (pList->pTail) + pList->pTail->pNext = pEntry; + else + pList->pHead = pEntry; + pList->pTail = pEntry; + pList->size++; + + return; +} + +static inline PLIST_ENTRY removeHeadList( + IN PLIST_HEADER pList) +{ + PLIST_ENTRY pNext; + PLIST_ENTRY pEntry; + + pEntry = pList->pHead; + if (pList->pHead != NULL) + { + pNext = pList->pHead->pNext; + pList->pHead = pNext; + if (pNext == NULL) + pList->pTail = NULL; + pList->size--; + } + return pEntry; +} + +static inline int getListSize( + IN PLIST_HEADER pList) +{ + return pList->size; +} + +static inline PLIST_ENTRY delEntryList( + IN PLIST_HEADER pList, + IN PLIST_ENTRY pEntry) +{ + PLIST_ENTRY pCurEntry; + PLIST_ENTRY pPrvEntry; + + if(pList->pHead == NULL) + return NULL; + + if(pEntry == pList->pHead) + { + pCurEntry = pList->pHead; + pList->pHead = pCurEntry->pNext; + + if(pList->pHead == NULL) + pList->pTail = NULL; + + pList->size--; + return pCurEntry; + } + + pPrvEntry = pList->pHead; + pCurEntry = pPrvEntry->pNext; + while(pCurEntry != NULL) + { + if (pEntry == pCurEntry) + { + pPrvEntry->pNext = pCurEntry->pNext; + + if(pEntry == pList->pTail) + pList->pTail = pPrvEntry; + + pList->size--; + break; + } + pPrvEntry = pCurEntry; + pCurEntry = pPrvEntry->pNext; + } + + return pCurEntry; +} + +#endif // ___LINK_LIST_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/mlme.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/mlme.h new file mode 100644 index 000000000..c94178a36 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/mlme.h @@ -0,0 +1,1360 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + mlme.h + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John Chang 2003-08-28 Created + John Chang 2004-09-06 modified for RT2600 + +*/ +#ifndef __MLME_H__ +#define __MLME_H__ + +#include "rtmp_dot11.h" + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + +// maximum supported capability information - +// ESS, IBSS, Privacy, Short Preamble, Spectrum mgmt, Short Slot +#define SUPPORTED_CAPABILITY_INFO 0x0533 + +#define END_OF_ARGS -1 +#define LFSR_MASK 0x80000057 +#define MLME_TASK_EXEC_INTV 100/*200*/ // +#define LEAD_TIME 5 +#define MLME_TASK_EXEC_MULTIPLE 10 /*5*/ // MLME_TASK_EXEC_MULTIPLE * MLME_TASK_EXEC_INTV = 1 sec +#define REORDER_EXEC_INTV 100 // 0.1 sec +//#define TBTT_PRELOAD_TIME 384 // usec. LomgPreamble + 24-byte at 1Mbps + +// The definition of Radar detection duration region +#define CE 0 +#define FCC 1 +#define JAP 2 +#define JAP_W53 3 +#define JAP_W56 4 +#define MAX_RD_REGION 5 + +#define BEACON_LOST_TIME 4 * OS_HZ // 2048 msec = 2 sec + +#define DLS_TIMEOUT 1200 // unit: msec +#define AUTH_TIMEOUT 300 // unit: msec +#define ASSOC_TIMEOUT 300 // unit: msec +#define JOIN_TIMEOUT 2000 // unit: msec +#define SHORT_CHANNEL_TIME 90 // unit: msec +#define MIN_CHANNEL_TIME 110 // unit: msec, for dual band scan +#define MAX_CHANNEL_TIME 140 // unit: msec, for single band scan +#define FAST_ACTIVE_SCAN_TIME 30 // Active scan waiting for probe response time +#define CW_MIN_IN_BITS 4 // actual CwMin = 2^CW_MIN_IN_BITS - 1 +#define LINK_DOWN_TIMEOUT 20000 // unit: msec +#define AUTO_WAKEUP_TIMEOUT 70 //unit: msec + + +#ifdef CONFIG_STA_SUPPORT +#define CW_MAX_IN_BITS 10 // actual CwMax = 2^CW_MAX_IN_BITS - 1 +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_APSTA_MIXED_SUPPORT +extern UINT32 CW_MAX_IN_BITS; +#endif // CONFIG_APSTA_MIXED_SUPPORT // + +// Note: RSSI_TO_DBM_OFFSET has been changed to variable for new RF (2004-0720). +// SHould not refer to this constant anymore +//#define RSSI_TO_DBM_OFFSET 120 // for RT2530 RSSI-115 = dBm +#define RSSI_FOR_MID_TX_POWER -55 // -55 db is considered mid-distance +#define RSSI_FOR_LOW_TX_POWER -45 // -45 db is considered very short distance and + // eligible to use a lower TX power +#define RSSI_FOR_LOWEST_TX_POWER -30 +//#define MID_TX_POWER_DELTA 0 // 0 db from full TX power upon mid-distance to AP +#define LOW_TX_POWER_DELTA 6 // -3 db from full TX power upon very short distance. 1 grade is 0.5 db +#define LOWEST_TX_POWER_DELTA 16 // -8 db from full TX power upon shortest distance. 1 grade is 0.5 db + +#define RSSI_TRIGGERED_UPON_BELOW_THRESHOLD 0 +#define RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD 1 +#define RSSI_THRESHOLD_FOR_ROAMING 25 +#define RSSI_DELTA 5 + +// Channel Quality Indication +#define CQI_IS_GOOD(cqi) ((cqi) >= 50) +//#define CQI_IS_FAIR(cqi) (((cqi) >= 20) && ((cqi) < 50)) +#define CQI_IS_POOR(cqi) (cqi < 50) //(((cqi) >= 5) && ((cqi) < 20)) +#define CQI_IS_BAD(cqi) (cqi < 5) +#define CQI_IS_DEAD(cqi) (cqi == 0) + +// weighting factor to calculate Channel quality, total should be 100% +#define RSSI_WEIGHTING 50 +#define TX_WEIGHTING 30 +#define RX_WEIGHTING 20 + +//#define PEER_KEY_NOT_USED 0 +//#define PEER_KEY_64_BIT 64 +//#define PEER_KEY_128_BIT 128 + +//#define PEER_KEY_64BIT_LEN 8 +//#define PEER_KEY_128BIT_LEN 16 + +#define BSS_NOT_FOUND 0xFFFFFFFF + + +#ifdef CONFIG_STA_SUPPORT +#define MAX_LEN_OF_MLME_QUEUE 40 //10 +#endif // CONFIG_STA_SUPPORT // + +#define SCAN_PASSIVE 18 // scan with no probe request, only wait beacon and probe response +#define SCAN_ACTIVE 19 // scan with probe request, and wait beacon and probe response +#define SCAN_CISCO_PASSIVE 20 // Single channel passive scan +#define SCAN_CISCO_ACTIVE 21 // Single channel active scan +#define SCAN_CISCO_NOISE 22 // Single channel passive scan for noise histogram collection +#define SCAN_CISCO_CHANNEL_LOAD 23 // Single channel passive scan for channel load collection +#define FAST_SCAN_ACTIVE 24 // scan with probe request, and wait beacon and probe response + +#ifdef DOT11N_DRAFT3 +#define SCAN_2040_BSS_COEXIST 26 +#endif // DOT11N_DRAFT3 // + +//#define BSS_TABLE_EMPTY(x) ((x).BssNr == 0) +#define MAC_ADDR_IS_GROUP(Addr) (((Addr[0]) & 0x01)) +#define MAC_ADDR_HASH(Addr) (Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5]) +#define MAC_ADDR_HASH_INDEX(Addr) (MAC_ADDR_HASH(Addr) & (HASH_TABLE_SIZE - 1)) +#define TID_MAC_HASH(Addr,TID) (TID^Addr[0] ^ Addr[1] ^ Addr[2] ^ Addr[3] ^ Addr[4] ^ Addr[5]) +#define TID_MAC_HASH_INDEX(Addr,TID) (TID_MAC_HASH(Addr,TID) & (HASH_TABLE_SIZE - 1)) + +// LED Control +// assoiation ON. one LED ON. another blinking when TX, OFF when idle +// no association, both LED off +#define ASIC_LED_ACT_ON(pAd) RTMP_IO_WRITE32(pAd, MAC_CSR14, 0x00031e46) +#define ASIC_LED_ACT_OFF(pAd) RTMP_IO_WRITE32(pAd, MAC_CSR14, 0x00001e46) + +// bit definition of the 2-byte pBEACON->Capability field +#define CAP_IS_ESS_ON(x) (((x) & 0x0001) != 0) +#define CAP_IS_IBSS_ON(x) (((x) & 0x0002) != 0) +#define CAP_IS_CF_POLLABLE_ON(x) (((x) & 0x0004) != 0) +#define CAP_IS_CF_POLL_REQ_ON(x) (((x) & 0x0008) != 0) +#define CAP_IS_PRIVACY_ON(x) (((x) & 0x0010) != 0) +#define CAP_IS_SHORT_PREAMBLE_ON(x) (((x) & 0x0020) != 0) +#define CAP_IS_PBCC_ON(x) (((x) & 0x0040) != 0) +#define CAP_IS_AGILITY_ON(x) (((x) & 0x0080) != 0) +#define CAP_IS_SPECTRUM_MGMT(x) (((x) & 0x0100) != 0) // 802.11e d9 +#define CAP_IS_QOS(x) (((x) & 0x0200) != 0) // 802.11e d9 +#define CAP_IS_SHORT_SLOT(x) (((x) & 0x0400) != 0) +#define CAP_IS_APSD(x) (((x) & 0x0800) != 0) // 802.11e d9 +#define CAP_IS_IMMED_BA(x) (((x) & 0x1000) != 0) // 802.11e d9 +#define CAP_IS_DSSS_OFDM(x) (((x) & 0x2000) != 0) +#define CAP_IS_DELAY_BA(x) (((x) & 0x4000) != 0) // 802.11e d9 + +#define CAP_GENERATE(ess,ibss,priv,s_pre,s_slot,spectrum) (((ess) ? 0x0001 : 0x0000) | ((ibss) ? 0x0002 : 0x0000) | ((priv) ? 0x0010 : 0x0000) | ((s_pre) ? 0x0020 : 0x0000) | ((s_slot) ? 0x0400 : 0x0000) | ((spectrum) ? 0x0100 : 0x0000)) + +//#define STA_QOS_CAPABILITY 0 // 1-byte. see 802.11e d9.0 for bit definition + +#define ERP_IS_NON_ERP_PRESENT(x) (((x) & 0x01) != 0) // 802.11g +#define ERP_IS_USE_PROTECTION(x) (((x) & 0x02) != 0) // 802.11g +#define ERP_IS_USE_BARKER_PREAMBLE(x) (((x) & 0x04) != 0) // 802.11g + +#define DRS_TX_QUALITY_WORST_BOUND 8// 3 // just test by gary +#define DRS_PENALTY 8 + +#define BA_NOTUSE 2 +//BA Policy subfiled value in ADDBA frame +#define IMMED_BA 1 +#define DELAY_BA 0 + +// BA Initiator subfield in DELBA frame +#define ORIGINATOR 1 +#define RECIPIENT 0 + +// ADDBA Status Code +#define ADDBA_RESULTCODE_SUCCESS 0 +#define ADDBA_RESULTCODE_REFUSED 37 +#define ADDBA_RESULTCODE_INVALID_PARAMETERS 38 + +// DELBA Reason Code +#define DELBA_REASONCODE_QSTA_LEAVING 36 +#define DELBA_REASONCODE_END_BA 37 +#define DELBA_REASONCODE_UNKNOWN_BA 38 +#define DELBA_REASONCODE_TIMEOUT 39 + +// reset all OneSecTx counters +#define RESET_ONE_SEC_TX_CNT(__pEntry) \ +if (((__pEntry)) != NULL) \ +{ \ + (__pEntry)->OneSecTxRetryOkCount = 0; \ + (__pEntry)->OneSecTxFailCount = 0; \ + (__pEntry)->OneSecTxNoRetryOkCount = 0; \ +} + + +// +// 802.11 frame formats +// +// HT Capability INFO field in HT Cap IE . +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT LSIGTxopProSup:1; + USHORT Forty_Mhz_Intolerant:1; + USHORT PSMP:1; + USHORT CCKmodein40:1; + USHORT AMsduSize:1; + USHORT DelayedBA:1; //rt2860c not support + USHORT RxSTBC:2; + USHORT TxSTBC:1; + USHORT ShortGIfor40:1; //for40MHz + USHORT ShortGIfor20:1; + USHORT GF:1; //green field + USHORT MimoPs:2;//momi power safe + USHORT ChannelWidth:1; + USHORT AdvCoding:1; +#else + USHORT AdvCoding:1; + USHORT ChannelWidth:1; + USHORT MimoPs:2;//momi power safe + USHORT GF:1; //green field + USHORT ShortGIfor20:1; + USHORT ShortGIfor40:1; //for40MHz + USHORT TxSTBC:1; + USHORT RxSTBC:2; + USHORT DelayedBA:1; //rt2860c not support + USHORT AMsduSize:1; // only support as zero + USHORT CCKmodein40:1; + USHORT PSMP:1; + USHORT Forty_Mhz_Intolerant:1; + USHORT LSIGTxopProSup:1; +#endif /* !RT_BIG_ENDIAN */ +} HT_CAP_INFO, *PHT_CAP_INFO; + +// HT Capability INFO field in HT Cap IE . +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + UCHAR rsv:3;//momi power safe + UCHAR MpduDensity:3; + UCHAR MaxRAmpduFactor:2; +#else + UCHAR MaxRAmpduFactor:2; + UCHAR MpduDensity:3; + UCHAR rsv:3;//momi power safe +#endif /* !RT_BIG_ENDIAN */ +} HT_CAP_PARM, *PHT_CAP_PARM; + +// HT Capability INFO field in HT Cap IE . +typedef struct GNU_PACKED { + UCHAR MCSSet[10]; + UCHAR SupRate[2]; // unit : 1Mbps +#ifdef RT_BIG_ENDIAN + UCHAR rsv:3; + UCHAR MpduDensity:1; + UCHAR TxStream:2; + UCHAR TxRxNotEqual:1; + UCHAR TxMCSSetDefined:1; +#else + UCHAR TxMCSSetDefined:1; + UCHAR TxRxNotEqual:1; + UCHAR TxStream:2; + UCHAR MpduDensity:1; + UCHAR rsv:3; +#endif // RT_BIG_ENDIAN // + UCHAR rsv3[3]; +} HT_MCS_SET, *PHT_MCS_SET; + +// HT Capability INFO field in HT Cap IE . +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT rsv2:4; + USHORT RDGSupport:1; //reverse Direction Grant support + USHORT PlusHTC:1; //+HTC control field support + USHORT MCSFeedback:2; //0:no MCS feedback, 2:unsolicited MCS feedback, 3:Full MCS feedback, 1:rsv. + USHORT rsv:5;//momi power safe + USHORT TranTime:2; + USHORT Pco:1; +#else + USHORT Pco:1; + USHORT TranTime:2; + USHORT rsv:5;//momi power safe + USHORT MCSFeedback:2; //0:no MCS feedback, 2:unsolicited MCS feedback, 3:Full MCS feedback, 1:rsv. + USHORT PlusHTC:1; //+HTC control field support + USHORT RDGSupport:1; //reverse Direction Grant support + USHORT rsv2:4; +#endif /* RT_BIG_ENDIAN */ +} EXT_HT_CAP_INFO, *PEXT_HT_CAP_INFO; + +// HT Beamforming field in HT Cap IE . +typedef struct GNU_PACKED _HT_BF_CAP{ +#ifdef RT_BIG_ENDIAN + ULONG rsv:3; + ULONG ChanEstimation:2; + ULONG CSIRowBFSup:2; + ULONG ComSteerBFAntSup:2; + ULONG NoComSteerBFAntSup:2; + ULONG CSIBFAntSup:2; + ULONG MinGrouping:2; + ULONG ExpComBF:2; + ULONG ExpNoComBF:2; + ULONG ExpCSIFbk:2; + ULONG ExpComSteerCapable:1; + ULONG ExpNoComSteerCapable:1; + ULONG ExpCSICapable:1; + ULONG Calibration:2; + ULONG ImpTxBFCapable:1; + ULONG TxNDPCapable:1; + ULONG RxNDPCapable:1; + ULONG TxSoundCapable:1; + ULONG RxSoundCapable:1; + ULONG TxBFRecCapable:1; +#else + ULONG TxBFRecCapable:1; + ULONG RxSoundCapable:1; + ULONG TxSoundCapable:1; + ULONG RxNDPCapable:1; + ULONG TxNDPCapable:1; + ULONG ImpTxBFCapable:1; + ULONG Calibration:2; + ULONG ExpCSICapable:1; + ULONG ExpNoComSteerCapable:1; + ULONG ExpComSteerCapable:1; + ULONG ExpCSIFbk:2; + ULONG ExpNoComBF:2; + ULONG ExpComBF:2; + ULONG MinGrouping:2; + ULONG CSIBFAntSup:2; + ULONG NoComSteerBFAntSup:2; + ULONG ComSteerBFAntSup:2; + ULONG CSIRowBFSup:2; + ULONG ChanEstimation:2; + ULONG rsv:3; +#endif // RT_BIG_ENDIAN // +} HT_BF_CAP, *PHT_BF_CAP; + +// HT antenna selection field in HT Cap IE . +typedef struct GNU_PACKED _HT_AS_CAP{ +#ifdef RT_BIG_ENDIAN + UCHAR rsv:1; + UCHAR TxSoundPPDU:1; + UCHAR RxASel:1; + UCHAR AntIndFbk:1; + UCHAR ExpCSIFbk:1; + UCHAR AntIndFbkTxASEL:1; + UCHAR ExpCSIFbkTxASEL:1; + UCHAR AntSelect:1; +#else + UCHAR AntSelect:1; + UCHAR ExpCSIFbkTxASEL:1; + UCHAR AntIndFbkTxASEL:1; + UCHAR ExpCSIFbk:1; + UCHAR AntIndFbk:1; + UCHAR RxASel:1; + UCHAR TxSoundPPDU:1; + UCHAR rsv:1; +#endif // RT_BIG_ENDIAN // +} HT_AS_CAP, *PHT_AS_CAP; + +// Draft 1.0 set IE length 26, but is extensible.. +#define SIZE_HT_CAP_IE 26 +// The structure for HT Capability IE. +typedef struct GNU_PACKED _HT_CAPABILITY_IE{ + HT_CAP_INFO HtCapInfo; + HT_CAP_PARM HtCapParm; +// HT_MCS_SET HtMCSSet; + UCHAR MCSSet[16]; + EXT_HT_CAP_INFO ExtHtCapInfo; + HT_BF_CAP TxBFCap; // beamforming cap. rt2860c not support beamforming. + HT_AS_CAP ASCap; //antenna selection. +} HT_CAPABILITY_IE, *PHT_CAPABILITY_IE; + + +// 802.11n draft3 related structure definitions. +// 7.3.2.60 +#define dot11OBSSScanPassiveDwell 20 // in TU. min amount of time that the STA continously scans each channel when performing an active OBSS scan. +#define dot11OBSSScanActiveDwell 10 // in TU.min amount of time that the STA continously scans each channel when performing an passive OBSS scan. +#define dot11BSSWidthTriggerScanInterval 300 // in sec. max interval between scan operations to be performed to detect BSS channel width trigger events. +#define dot11OBSSScanPassiveTotalPerChannel 200 // in TU. min total amount of time that the STA scans each channel when performing a passive OBSS scan. +#define dot11OBSSScanActiveTotalPerChannel 20 //in TU. min total amount of time that the STA scans each channel when performing a active OBSS scan +#define dot11BSSWidthChannelTransactionDelayFactor 5 // min ratio between the delay time in performing a switch from 20MHz BSS to 20/40 BSS operation and the maximum + // interval between overlapping BSS scan operations. +#define dot11BSSScanActivityThreshold 25 // in %%, max total time that a STA may be active on the medium during a period of + // (dot11BSSWidthChannelTransactionDelayFactor * dot11BSSWidthTriggerScanInterval) seconds without + // being obligated to perform OBSS Scan operations. default is 25(== 0.25%) + +typedef struct GNU_PACKED _OVERLAP_BSS_SCAN_IE{ + USHORT ScanPassiveDwell; + USHORT ScanActiveDwell; + USHORT TriggerScanInt; // Trigger scan interval + USHORT PassiveTalPerChannel; // passive total per channel + USHORT ActiveTalPerChannel; // active total per channel + USHORT DelayFactor; // BSS width channel transition delay factor + USHORT ScanActThre; // Scan Activity threshold +}OVERLAP_BSS_SCAN_IE, *POVERLAP_BSS_SCAN_IE; + + +// 7.3.2.56. 20/40 Coexistence element used in Element ID = 72 = IE_2040_BSS_COEXIST +typedef union GNU_PACKED _BSS_2040_COEXIST_IE{ + struct GNU_PACKED { + #ifdef RT_BIG_ENDIAN + UCHAR rsv:3; + UCHAR ObssScanExempGrant:1; + UCHAR ObssScanExempReq:1; + UCHAR BSS20WidthReq:1; + UCHAR Intolerant40:1; + UCHAR InfoReq:1; + #else + UCHAR InfoReq:1; + UCHAR Intolerant40:1; // Inter-BSS. set 1 when prohibits a receiving BSS from operating as a 20/40 Mhz BSS. + UCHAR BSS20WidthReq:1; // Intra-BSS set 1 when prohibits a receiving AP from operating its BSS as a 20/40MHz BSS. + UCHAR ObssScanExempReq:1; + UCHAR ObssScanExempGrant:1; + UCHAR rsv:3; +#endif // RT_BIG_ENDIAN // + } field; + UCHAR word; +} BSS_2040_COEXIST_IE, *PBSS_2040_COEXIST_IE; + + +typedef struct _TRIGGER_EVENTA{ + BOOLEAN bValid; + UCHAR BSSID[6]; + UCHAR RegClass; // Regulatory Class + USHORT Channel; +} TRIGGER_EVENTA, *PTRIGGER_EVENTA; + +// 20/40 trigger event table +// If one Event A delete or created, or if Event B is detected or not detected, STA should send 2040BSSCoexistence to AP. +#define MAX_TRIGGER_EVENT 64 +typedef struct _TRIGGER_EVENT_TAB{ + UCHAR EventANo; + TRIGGER_EVENTA EventA[MAX_TRIGGER_EVENT]; + ULONG EventBCountDown; // Count down counter for Event B. +} TRIGGER_EVENT_TAB, *PTRIGGER_EVENT_TAB; + +// 7.3.27 20/40 Bss Coexistence Mgmt capability used in extended capabilities information IE( ID = 127 = IE_EXT_CAPABILITY). +// This is the first octet and was defined in 802.11n D3.03 and 802.11yD9.0 +typedef struct GNU_PACKED _EXT_CAP_INFO_ELEMENT{ +#ifdef RT_BIG_ENDIAN + UCHAR rsv2:5; + UCHAR ExtendChannelSwitch:1; + UCHAR rsv:1; + UCHAR BssCoexistMgmtSupport:1; +#else + UCHAR BssCoexistMgmtSupport:1; + UCHAR rsv:1; + UCHAR ExtendChannelSwitch:1; + UCHAR rsv2:5; +#endif // RT_BIG_ENDIAN // +}EXT_CAP_INFO_ELEMENT, *PEXT_CAP_INFO_ELEMENT; + + +// 802.11n 7.3.2.61 +typedef struct GNU_PACKED _BSS_2040_COEXIST_ELEMENT{ + UCHAR ElementID; // ID = IE_2040_BSS_COEXIST = 72 + UCHAR Len; + BSS_2040_COEXIST_IE BssCoexistIe; +}BSS_2040_COEXIST_ELEMENT, *PBSS_2040_COEXIST_ELEMENT; + + +//802.11n 7.3.2.59 +typedef struct GNU_PACKED _BSS_2040_INTOLERANT_CH_REPORT{ + UCHAR ElementID; // ID = IE_2040_BSS_INTOLERANT_REPORT = 73 + UCHAR Len; + UCHAR RegulatoryClass; + UCHAR ChList[0]; +}BSS_2040_INTOLERANT_CH_REPORT, *PBSS_2040_INTOLERANT_CH_REPORT; + + +// The structure for channel switch annoucement IE. This is in 802.11n D3.03 +typedef struct GNU_PACKED _CHA_SWITCH_ANNOUNCE_IE{ + UCHAR SwitchMode; //channel switch mode + UCHAR NewChannel; // + UCHAR SwitchCount; // +} CHA_SWITCH_ANNOUNCE_IE, *PCHA_SWITCH_ANNOUNCE_IE; + + +// The structure for channel switch annoucement IE. This is in 802.11n D3.03 +typedef struct GNU_PACKED _SEC_CHA_OFFSET_IE{ + UCHAR SecondaryChannelOffset; // 1: Secondary above, 3: Secondary below, 0: no Secondary +} SEC_CHA_OFFSET_IE, *PSEC_CHA_OFFSET_IE; + + +// This structure is extracted from struct RT_HT_CAPABILITY +typedef struct { + BOOLEAN bHtEnable; // If we should use ht rate. + BOOLEAN bPreNHt; // If we should use ht rate. + //Substract from HT Capability IE + UCHAR MCSSet[16]; +} RT_HT_PHY_INFO, *PRT_HT_PHY_INFO; + +//This structure substracts ralink supports from all 802.11n-related features. +//Features not listed here but contained in 802.11n spec are not supported in rt2860. +typedef struct { +#ifdef RT_BIG_ENDIAN + USHORT rsv:5; + USHORT AmsduSize:1; // Max receiving A-MSDU size + USHORT AmsduEnable:1; // Enable to transmit A-MSDU. Suggest disable. We should use A-MPDU to gain best benifit of 802.11n + USHORT RxSTBC:2; // 2 bits + USHORT TxSTBC:1; + USHORT ShortGIfor40:1; //for40MHz + USHORT ShortGIfor20:1; + USHORT GF:1; //green field + USHORT MimoPs:2;//mimo power safe MMPS_ + USHORT ChannelWidth:1; +#else + USHORT ChannelWidth:1; + USHORT MimoPs:2;//mimo power safe MMPS_ + USHORT GF:1; //green field + USHORT ShortGIfor20:1; + USHORT ShortGIfor40:1; //for40MHz + USHORT TxSTBC:1; + USHORT RxSTBC:2; // 2 bits + USHORT AmsduEnable:1; // Enable to transmit A-MSDU. Suggest disable. We should use A-MPDU to gain best benifit of 802.11n + USHORT AmsduSize:1; // Max receiving A-MSDU size + USHORT rsv:5; +#endif + + //Substract from Addiont HT INFO IE +#ifdef RT_BIG_ENDIAN + UCHAR RecomWidth:1; + UCHAR ExtChanOffset:2; // Please not the difference with following UCHAR NewExtChannelOffset; from 802.11n + UCHAR MpduDensity:3; + UCHAR MaxRAmpduFactor:2; +#else + UCHAR MaxRAmpduFactor:2; + UCHAR MpduDensity:3; + UCHAR ExtChanOffset:2; // Please not the difference with following UCHAR NewExtChannelOffset; from 802.11n + UCHAR RecomWidth:1; +#endif + +#ifdef RT_BIG_ENDIAN + USHORT rsv2:11; + USHORT OBSS_NonHTExist:1; + USHORT rsv3:1; + USHORT NonGfPresent:1; + USHORT OperaionMode:2; +#else + USHORT OperaionMode:2; + USHORT NonGfPresent:1; + USHORT rsv3:1; + USHORT OBSS_NonHTExist:1; + USHORT rsv2:11; +#endif + + // New Extension Channel Offset IE + UCHAR NewExtChannelOffset; + // Extension Capability IE = 127 + UCHAR BSSCoexist2040; +} RT_HT_CAPABILITY, *PRT_HT_CAPABILITY; + +// field in Addtional HT Information IE . +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + UCHAR SerInterGranu:3; + UCHAR S_PSMPSup:1; + UCHAR RifsMode:1; + UCHAR RecomWidth:1; + UCHAR ExtChanOffset:2; +#else + UCHAR ExtChanOffset:2; + UCHAR RecomWidth:1; + UCHAR RifsMode:1; + UCHAR S_PSMPSup:1; //Indicate support for scheduled PSMP + UCHAR SerInterGranu:3; //service interval granularity +#endif +} ADD_HTINFO, *PADD_HTINFO; + +typedef struct GNU_PACKED{ +#ifdef RT_BIG_ENDIAN + USHORT rsv2:11; + USHORT OBSS_NonHTExist:1; + USHORT rsv:1; + USHORT NonGfPresent:1; + USHORT OperaionMode:2; +#else + USHORT OperaionMode:2; + USHORT NonGfPresent:1; + USHORT rsv:1; + USHORT OBSS_NonHTExist:1; + USHORT rsv2:11; +#endif +} ADD_HTINFO2, *PADD_HTINFO2; + + +// TODO: Need sync with spec about the definition of StbcMcs. In Draft 3.03, it's reserved. +typedef struct GNU_PACKED{ +#ifdef RT_BIG_ENDIAN + USHORT rsv:4; + USHORT PcoPhase:1; + USHORT PcoActive:1; + USHORT LsigTxopProt:1; + USHORT STBCBeacon:1; + USHORT DualCTSProtect:1; + USHORT DualBeacon:1; + USHORT StbcMcs:6; +#else + USHORT StbcMcs:6; + USHORT DualBeacon:1; + USHORT DualCTSProtect:1; + USHORT STBCBeacon:1; + USHORT LsigTxopProt:1; // L-SIG TXOP protection full support + USHORT PcoActive:1; + USHORT PcoPhase:1; + USHORT rsv:4; +#endif // RT_BIG_ENDIAN // +} ADD_HTINFO3, *PADD_HTINFO3; + +#define SIZE_ADD_HT_INFO_IE 22 +typedef struct GNU_PACKED{ + UCHAR ControlChan; + ADD_HTINFO AddHtInfo; + ADD_HTINFO2 AddHtInfo2; + ADD_HTINFO3 AddHtInfo3; + UCHAR MCSSet[16]; // Basic MCS set +} ADD_HT_INFO_IE, *PADD_HT_INFO_IE; + +typedef struct GNU_PACKED{ + UCHAR NewExtChanOffset; +} NEW_EXT_CHAN_IE, *PNEW_EXT_CHAN_IE; + +typedef struct GNU_PACKED _FRAME_802_11 { + HEADER_802_11 Hdr; + UCHAR Octet[1]; +} FRAME_802_11, *PFRAME_802_11; + +// QoSNull embedding of management action. When HT Control MA field set to 1. +typedef struct GNU_PACKED _MA_BODY { + UCHAR Category; + UCHAR Action; + UCHAR Octet[1]; +} MA_BODY, *PMA_BODY; + +typedef struct GNU_PACKED _HEADER_802_3 { + UCHAR DAAddr1[MAC_ADDR_LEN]; + UCHAR SAAddr2[MAC_ADDR_LEN]; + UCHAR Octet[2]; +} HEADER_802_3, *PHEADER_802_3; +////Block ACK related format +// 2-byte BA Parameter field in DELBA frames to terminate an already set up bA +typedef struct GNU_PACKED{ +#ifdef RT_BIG_ENDIAN + USHORT TID:4; // value of TC os TS + USHORT Initiator:1; // 1: originator 0:recipient + USHORT Rsv:11; // always set to 0 +#else + USHORT Rsv:11; // always set to 0 + USHORT Initiator:1; // 1: originator 0:recipient + USHORT TID:4; // value of TC os TS +#endif /* !RT_BIG_ENDIAN */ +} DELBA_PARM, *PDELBA_PARM; + +// 2-byte BA Parameter Set field in ADDBA frames to signal parm for setting up a BA +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT BufSize:10; // number of buffe of size 2304 octetsr + USHORT TID:4; // value of TC os TS + USHORT BAPolicy:1; // 1: immediately BA 0:delayed BA + USHORT AMSDUSupported:1; // 0: not permitted 1: permitted +#else + USHORT AMSDUSupported:1; // 0: not permitted 1: permitted + USHORT BAPolicy:1; // 1: immediately BA 0:delayed BA + USHORT TID:4; // value of TC os TS + USHORT BufSize:10; // number of buffe of size 2304 octetsr +#endif /* !RT_BIG_ENDIAN */ +} BA_PARM, *PBA_PARM; + +// 2-byte BA Starting Seq CONTROL field +typedef union GNU_PACKED { + struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT StartSeq:12; // sequence number of the 1st MSDU for which this BAR is sent + USHORT FragNum:4; // always set to 0 +#else + USHORT FragNum:4; // always set to 0 + USHORT StartSeq:12; // sequence number of the 1st MSDU for which this BAR is sent +#endif /* RT_BIG_ENDIAN */ + } field; + USHORT word; +} BASEQ_CONTROL, *PBASEQ_CONTROL; + +//BAControl and BARControl are the same +// 2-byte BA CONTROL field in BA frame +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT TID:4; + USHORT Rsv:9; + USHORT Compressed:1; + USHORT MTID:1; //EWC V1.24 + USHORT ACKPolicy:1; // only related to N-Delayed BA. But not support in RT2860b. 0:NormalACK 1:No ACK +#else + USHORT ACKPolicy:1; // only related to N-Delayed BA. But not support in RT2860b. 0:NormalACK 1:No ACK + USHORT MTID:1; //EWC V1.24 + USHORT Compressed:1; + USHORT Rsv:9; + USHORT TID:4; +#endif /* !RT_BIG_ENDIAN */ +} BA_CONTROL, *PBA_CONTROL; + +// 2-byte BAR CONTROL field in BAR frame +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT TID:4; + USHORT Rsv1:9; + USHORT Compressed:1; + USHORT MTID:1; //if this bit1, use FRAME_MTBA_REQ, if 0, use FRAME_BA_REQ + USHORT ACKPolicy:1; +#else + USHORT ACKPolicy:1; // 0:normal ack, 1:no ack. + USHORT MTID:1; //if this bit1, use FRAME_MTBA_REQ, if 0, use FRAME_BA_REQ + USHORT Compressed:1; + USHORT Rsv1:9; + USHORT TID:4; +#endif /* !RT_BIG_ENDIAN */ +} BAR_CONTROL, *PBAR_CONTROL; + +// BARControl in MTBAR frame +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT NumTID:4; + USHORT Rsv1:9; + USHORT Compressed:1; + USHORT MTID:1; + USHORT ACKPolicy:1; +#else + USHORT ACKPolicy:1; + USHORT MTID:1; + USHORT Compressed:1; + USHORT Rsv1:9; + USHORT NumTID:4; +#endif /* !RT_BIG_ENDIAN */ +} MTBAR_CONTROL, *PMTBAR_CONTROL; + +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT TID:4; + USHORT Rsv1:12; +#else + USHORT Rsv1:12; + USHORT TID:4; +#endif /* !RT_BIG_ENDIAN */ +} PER_TID_INFO, *PPER_TID_INFO; + +typedef struct { + PER_TID_INFO PerTID; + BASEQ_CONTROL BAStartingSeq; +} EACH_TID, *PEACH_TID; + + +// BAREQ AND MTBAREQ have the same subtype BAR, 802.11n BAR use compressed bitmap. +typedef struct GNU_PACKED _FRAME_BA_REQ { + FRAME_CONTROL FC; + USHORT Duration; + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; + BAR_CONTROL BARControl; + BASEQ_CONTROL BAStartingSeq; +} FRAME_BA_REQ, *PFRAME_BA_REQ; + +typedef struct GNU_PACKED _FRAME_MTBA_REQ { + FRAME_CONTROL FC; + USHORT Duration; + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; + MTBAR_CONTROL MTBARControl; + PER_TID_INFO PerTIDInfo; + BASEQ_CONTROL BAStartingSeq; +} FRAME_MTBA_REQ, *PFRAME_MTBA_REQ; + +// Compressed format is mandantory in HT STA +typedef struct GNU_PACKED _FRAME_MTBA { + FRAME_CONTROL FC; + USHORT Duration; + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; + BA_CONTROL BAControl; + BASEQ_CONTROL BAStartingSeq; + UCHAR BitMap[8]; +} FRAME_MTBA, *PFRAME_MTBA; + +typedef struct GNU_PACKED _FRAME_PSMP_ACTION { + HEADER_802_11 Hdr; + UCHAR Category; + UCHAR Action; + UCHAR Psmp; // 7.3.1.25 +} FRAME_PSMP_ACTION, *PFRAME_PSMP_ACTION; + +typedef struct GNU_PACKED _FRAME_ACTION_HDR { + HEADER_802_11 Hdr; + UCHAR Category; + UCHAR Action; +} FRAME_ACTION_HDR, *PFRAME_ACTION_HDR; + +//Action Frame +//Action Frame Category:Spectrum, Action:Channel Switch. 7.3.2.20 +typedef struct GNU_PACKED _CHAN_SWITCH_ANNOUNCE { + UCHAR ElementID; // ID = IE_CHANNEL_SWITCH_ANNOUNCEMENT = 37 + UCHAR Len; + CHA_SWITCH_ANNOUNCE_IE CSAnnounceIe; +} CHAN_SWITCH_ANNOUNCE, *PCHAN_SWITCH_ANNOUNCE; + + +//802.11n : 7.3.2.20a +typedef struct GNU_PACKED _SECOND_CHAN_OFFSET { + UCHAR ElementID; // ID = IE_SECONDARY_CH_OFFSET = 62 + UCHAR Len; + SEC_CHA_OFFSET_IE SecChOffsetIe; +} SECOND_CHAN_OFFSET, *PSECOND_CHAN_OFFSET; + + +typedef struct GNU_PACKED _FRAME_SPETRUM_CS { + HEADER_802_11 Hdr; + UCHAR Category; + UCHAR Action; + CHAN_SWITCH_ANNOUNCE CSAnnounce; + SECOND_CHAN_OFFSET SecondChannel; +} FRAME_SPETRUM_CS, *PFRAME_SPETRUM_CS; + + +typedef struct GNU_PACKED _FRAME_ADDBA_REQ { + HEADER_802_11 Hdr; + UCHAR Category; + UCHAR Action; + UCHAR Token; // 1 + BA_PARM BaParm; // 2 - 10 + USHORT TimeOutValue; // 0 - 0 + BASEQ_CONTROL BaStartSeq; // 0-0 +} FRAME_ADDBA_REQ, *PFRAME_ADDBA_REQ; + +typedef struct GNU_PACKED _FRAME_ADDBA_RSP { + HEADER_802_11 Hdr; + UCHAR Category; + UCHAR Action; + UCHAR Token; + USHORT StatusCode; + BA_PARM BaParm; //0 - 2 + USHORT TimeOutValue; +} FRAME_ADDBA_RSP, *PFRAME_ADDBA_RSP; + +typedef struct GNU_PACKED _FRAME_DELBA_REQ { + HEADER_802_11 Hdr; + UCHAR Category; + UCHAR Action; + DELBA_PARM DelbaParm; + USHORT ReasonCode; +} FRAME_DELBA_REQ, *PFRAME_DELBA_REQ; + + +//7.2.1.7 +typedef struct GNU_PACKED _FRAME_BAR { + FRAME_CONTROL FC; + USHORT Duration; + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; + BAR_CONTROL BarControl; + BASEQ_CONTROL StartingSeq; +} FRAME_BAR, *PFRAME_BAR; + +//7.2.1.7 +typedef struct GNU_PACKED _FRAME_BA { + FRAME_CONTROL FC; + USHORT Duration; + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; + BAR_CONTROL BarControl; + BASEQ_CONTROL StartingSeq; + UCHAR bitmask[8]; +} FRAME_BA, *PFRAME_BA; + + +// Radio Measuement Request Frame Format +typedef struct GNU_PACKED _FRAME_RM_REQ_ACTION { + HEADER_802_11 Hdr; + UCHAR Category; + UCHAR Action; + UCHAR Token; + USHORT Repetition; + UCHAR data[0]; +} FRAME_RM_REQ_ACTION, *PFRAME_RM_REQ_ACTION; + +typedef struct GNU_PACKED { + UCHAR ID; + UCHAR Length; + UCHAR ChannelSwitchMode; + UCHAR NewRegClass; + UCHAR NewChannelNum; + UCHAR ChannelSwitchCount; +} HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE, *PHT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE; + + +// +// _Limit must be the 2**n - 1 +// _SEQ1 , _SEQ2 must be within 0 ~ _Limit +// +#define SEQ_STEPONE(_SEQ1, _SEQ2, _Limit) ((_SEQ1 == ((_SEQ2+1) & _Limit))) +#define SEQ_SMALLER(_SEQ1, _SEQ2, _Limit) (((_SEQ1-_SEQ2) & ((_Limit+1)>>1))) +#define SEQ_LARGER(_SEQ1, _SEQ2, _Limit) ((_SEQ1 != _SEQ2) && !(((_SEQ1-_SEQ2) & ((_Limit+1)>>1)))) +#define SEQ_WITHIN_WIN(_SEQ1, _SEQ2, _WIN, _Limit) (SEQ_LARGER(_SEQ1, _SEQ2, _Limit) && \ + SEQ_SMALLER(_SEQ1, ((_SEQ2+_WIN+1)&_Limit), _Limit)) + +// +// Contention-free parameter (without ID and Length) +// +typedef struct GNU_PACKED { + BOOLEAN bValid; // 1: variable contains valid value + UCHAR CfpCount; + UCHAR CfpPeriod; + USHORT CfpMaxDuration; + USHORT CfpDurRemaining; +} CF_PARM, *PCF_PARM; + +typedef struct _CIPHER_SUITE { + NDIS_802_11_ENCRYPTION_STATUS PairCipher; // Unicast cipher 1, this one has more secured cipher suite + NDIS_802_11_ENCRYPTION_STATUS PairCipherAux; // Unicast cipher 2 if AP announce two unicast cipher suite + NDIS_802_11_ENCRYPTION_STATUS GroupCipher; // Group cipher + USHORT RsnCapability; // RSN capability from beacon + BOOLEAN bMixMode; // Indicate Pair & Group cipher might be different +} CIPHER_SUITE, *PCIPHER_SUITE; + +// EDCA configuration from AP's BEACON/ProbeRsp +typedef struct { + BOOLEAN bValid; // 1: variable contains valid value + BOOLEAN bAdd; // 1: variable contains valid value + BOOLEAN bQAck; + BOOLEAN bQueueRequest; + BOOLEAN bTxopRequest; + BOOLEAN bAPSDCapable; +// BOOLEAN bMoreDataAck; + UCHAR EdcaUpdateCount; + UCHAR Aifsn[4]; // 0:AC_BK, 1:AC_BE, 2:AC_VI, 3:AC_VO + UCHAR Cwmin[4]; + UCHAR Cwmax[4]; + USHORT Txop[4]; // in unit of 32-us + BOOLEAN bACM[4]; // 1: Admission Control of AC_BK is mandattory +} EDCA_PARM, *PEDCA_PARM; + +// QBSS LOAD information from QAP's BEACON/ProbeRsp +typedef struct { + BOOLEAN bValid; // 1: variable contains valid value + USHORT StaNum; + UCHAR ChannelUtilization; + USHORT RemainingAdmissionControl; // in unit of 32-us +} QBSS_LOAD_PARM, *PQBSS_LOAD_PARM; + +// QBSS Info field in QSTA's assoc req +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + UCHAR Rsv2:1; + UCHAR MaxSPLength:2; + UCHAR Rsv1:1; + UCHAR UAPSD_AC_BE:1; + UCHAR UAPSD_AC_BK:1; + UCHAR UAPSD_AC_VI:1; + UCHAR UAPSD_AC_VO:1; +#else + UCHAR UAPSD_AC_VO:1; + UCHAR UAPSD_AC_VI:1; + UCHAR UAPSD_AC_BK:1; + UCHAR UAPSD_AC_BE:1; + UCHAR Rsv1:1; + UCHAR MaxSPLength:2; + UCHAR Rsv2:1; +#endif /* !RT_BIG_ENDIAN */ +} QBSS_STA_INFO_PARM, *PQBSS_STA_INFO_PARM; + +typedef struct { + QBSS_STA_INFO_PARM QosInfo; + UCHAR Rsv; + UCHAR Q_AC_BE[4]; + UCHAR Q_AC_BK[4]; + UCHAR Q_AC_VI[4]; + UCHAR Q_AC_VO[4]; +} QBSS_STA_EDCA_PARM, *PQBSS_STA_EDCA_PARM; + +// QBSS Info field in QAP's Beacon/ProbeRsp +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + UCHAR UAPSD:1; + UCHAR Rsv:3; + UCHAR ParamSetCount:4; +#else + UCHAR ParamSetCount:4; + UCHAR Rsv:3; + UCHAR UAPSD:1; +#endif /* !RT_BIG_ENDIAN */ +} QBSS_AP_INFO_PARM, *PQBSS_AP_INFO_PARM; + +// QOS Capability reported in QAP's BEACON/ProbeRsp +// QOS Capability sent out in QSTA's AssociateReq/ReAssociateReq +typedef struct { + BOOLEAN bValid; // 1: variable contains valid value + BOOLEAN bQAck; + BOOLEAN bQueueRequest; + BOOLEAN bTxopRequest; +// BOOLEAN bMoreDataAck; + UCHAR EdcaUpdateCount; +} QOS_CAPABILITY_PARM, *PQOS_CAPABILITY_PARM; + +#ifdef CONFIG_STA_SUPPORT +typedef struct { + UCHAR IELen; + UCHAR IE[MAX_CUSTOM_LEN]; +} WPA_IE_; +#endif // CONFIG_STA_SUPPORT // + + +typedef struct { + UCHAR Bssid[MAC_ADDR_LEN]; + UCHAR Channel; + UCHAR CentralChannel; //Store the wide-band central channel for 40MHz. .used in 40MHz AP. Or this is the same as Channel. + UCHAR BssType; + USHORT AtimWin; + USHORT BeaconPeriod; + + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR SupRateLen; + UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR ExtRateLen; + HT_CAPABILITY_IE HtCapability; + UCHAR HtCapabilityLen; + ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE + UCHAR AddHtInfoLen; + EXT_CAP_INFO_ELEMENT ExtCapInfo; // this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. + UCHAR NewExtChanOffset; + CHAR Rssi; + CHAR MinSNR; + UCHAR Privacy; // Indicate security function ON/OFF. Don't mess up with auth mode. + UCHAR Hidden; + + USHORT DtimPeriod; + USHORT CapabilityInfo; + + USHORT CfpCount; + USHORT CfpPeriod; + USHORT CfpMaxDuration; + USHORT CfpDurRemaining; + UCHAR SsidLen; + CHAR Ssid[MAX_LEN_OF_SSID]; + + ULONG LastBeaconRxTime; // OS's timestamp + + BOOLEAN bSES; + + // New for WPA2 + CIPHER_SUITE WPA; // AP announced WPA cipher suite + CIPHER_SUITE WPA2; // AP announced WPA2 cipher suite + + // New for microsoft WPA support + NDIS_802_11_FIXED_IEs FixIEs; + NDIS_802_11_AUTHENTICATION_MODE AuthModeAux; // Addition mode for WPA2 / WPA capable AP + NDIS_802_11_AUTHENTICATION_MODE AuthMode; + NDIS_802_11_WEP_STATUS WepStatus; // Unicast Encryption Algorithm extract from VAR_IE + USHORT VarIELen; // Length of next VIE include EID & Length + UCHAR VarIEs[MAX_VIE_LEN]; + USHORT VarIeFromProbeRspLen; + UCHAR *pVarIeFromProbRsp; + + // CCX Ckip information + UCHAR CkipFlag; + + // CCX 2 TSF + UCHAR PTSF[4]; // Parent TSF + UCHAR TTSF[8]; // Target TSF + + // 802.11e d9, and WMM + EDCA_PARM EdcaParm; + QOS_CAPABILITY_PARM QosCapability; + QBSS_LOAD_PARM QbssLoad; + + +#ifdef CONFIG_STA_SUPPORT + WPA_IE_ WpaIE; + WPA_IE_ RsnIE; + +#ifdef EXT_BUILD_CHANNEL_LIST + UCHAR CountryString[3]; + BOOLEAN bHasCountryIE; +#endif // EXT_BUILD_CHANNEL_LIST // +#endif // CONFIG_STA_SUPPORT // + + UCHAR MacAddr[MAC_ADDR_LEN]; + +#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + VOID *pCfg80211_Chan; +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // +#endif // AP_SCAN_SUPPORT || CONFIG_STA_SUPPORT // +} BSS_ENTRY, *PBSS_ENTRY; + +typedef struct { + UCHAR BssNr; + UCHAR BssOverlapNr; + BSS_ENTRY BssEntry[MAX_LEN_OF_BSS_TABLE]; +} BSS_TABLE, *PBSS_TABLE; + + +typedef struct _MLME_QUEUE_ELEM { + UCHAR Msg[MGMT_DMA_BUFFER_SIZE]; // move here to fix the bug of alignment for ARM CPU + ULONG Machine; + ULONG MsgType; + ULONG MsgLen; + //UCHAR Msg[MGMT_DMA_BUFFER_SIZE]; // move above to fix the bug of alignment for ARM CPU + LARGE_INTEGER TimeStamp; + UCHAR Rssi0; + UCHAR Rssi1; + UCHAR Rssi2; + UCHAR Signal; + UCHAR Channel; + UCHAR Wcid; + BOOLEAN Occupied; + ULONG Priv; +} MLME_QUEUE_ELEM, *PMLME_QUEUE_ELEM; + +typedef struct _MLME_QUEUE { + ULONG Num; + ULONG Head; + ULONG Tail; + NDIS_SPIN_LOCK Lock; + MLME_QUEUE_ELEM Entry[MAX_LEN_OF_MLME_QUEUE]; +} MLME_QUEUE, *PMLME_QUEUE; + +typedef VOID (*STATE_MACHINE_FUNC)(VOID *Adaptor, MLME_QUEUE_ELEM *Elem); + +typedef struct _STATE_MACHINE { + ULONG Base; + ULONG NrState; + ULONG NrMsg; + ULONG CurrState; + STATE_MACHINE_FUNC *TransFunc; +} STATE_MACHINE, *PSTATE_MACHINE; + + +// MLME AUX data structure that hold temporarliy settings during a connection attempt. +// Once this attemp succeeds, all settings will be copy to pAd->StaActive. +// A connection attempt (user set OID, roaming, CCX fast roaming,..) consists of +// several steps (JOIN, AUTH, ASSOC or REASSOC) and may fail at any step. We purposely +// separate this under-trial settings away from pAd->StaActive so that once +// this new attempt failed, driver can auto-recover back to the active settings. +typedef struct _MLME_AUX { + UCHAR BssType; + UCHAR Ssid[MAX_LEN_OF_SSID]; + UCHAR SsidLen; + UCHAR Bssid[MAC_ADDR_LEN]; + UCHAR AutoReconnectSsid[MAX_LEN_OF_SSID]; + UCHAR AutoReconnectSsidLen; + USHORT Alg; + UCHAR ScanType; + UCHAR Channel; + UCHAR CentralChannel; + USHORT Aid; + USHORT CapabilityInfo; + USHORT BeaconPeriod; + USHORT CfpMaxDuration; + USHORT CfpPeriod; + USHORT AtimWin; + + // Copy supported rate from desired AP's beacon. We are trying to match + // AP's supported and extended rate settings. + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR SupRateLen; + UCHAR ExtRateLen; + HT_CAPABILITY_IE HtCapability; + UCHAR HtCapabilityLen; + ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE + EXT_CAP_INFO_ELEMENT ExtCapInfo; // this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. + UCHAR NewExtChannelOffset; + //RT_HT_CAPABILITY SupportedHtPhy; + + // new for QOS + QOS_CAPABILITY_PARM APQosCapability; // QOS capability of the current associated AP + EDCA_PARM APEdcaParm; // EDCA parameters of the current associated AP + QBSS_LOAD_PARM APQbssLoad; // QBSS load of the current associated AP + + // new to keep Ralink specific feature + ULONG APRalinkIe; + + BSS_TABLE SsidBssTab; // AP list for the same SSID + BSS_TABLE RoamTab; // AP list eligible for roaming + ULONG BssIdx; + ULONG RoamIdx; + + BOOLEAN CurrReqIsFromNdis; + + RALINK_TIMER_STRUCT BeaconTimer, ScanTimer; + RALINK_TIMER_STRUCT AuthTimer; + RALINK_TIMER_STRUCT AssocTimer, ReassocTimer, DisassocTimer; + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // +} MLME_AUX, *PMLME_AUX; + +typedef struct _MLME_ADDBA_REQ_STRUCT{ + UCHAR Wcid; // + UCHAR pAddr[MAC_ADDR_LEN]; + UCHAR BaBufSize; + USHORT TimeOutValue; + UCHAR TID; + UCHAR Token; + USHORT BaStartSeq; +} MLME_ADDBA_REQ_STRUCT, *PMLME_ADDBA_REQ_STRUCT; + + +typedef struct _MLME_DELBA_REQ_STRUCT{ + UCHAR Wcid; // + UCHAR Addr[MAC_ADDR_LEN]; + UCHAR TID; + UCHAR Initiator; +} MLME_DELBA_REQ_STRUCT, *PMLME_DELBA_REQ_STRUCT; + +// assoc struct is equal to reassoc +typedef struct _MLME_ASSOC_REQ_STRUCT{ + UCHAR Addr[MAC_ADDR_LEN]; + USHORT CapabilityInfo; + USHORT ListenIntv; + ULONG Timeout; +} MLME_ASSOC_REQ_STRUCT, *PMLME_ASSOC_REQ_STRUCT, MLME_REASSOC_REQ_STRUCT, *PMLME_REASSOC_REQ_STRUCT; + +typedef struct _MLME_DISASSOC_REQ_STRUCT{ + UCHAR Addr[MAC_ADDR_LEN]; + USHORT Reason; +} MLME_DISASSOC_REQ_STRUCT, *PMLME_DISASSOC_REQ_STRUCT; + +typedef struct _MLME_AUTH_REQ_STRUCT { + UCHAR Addr[MAC_ADDR_LEN]; + USHORT Alg; + ULONG Timeout; +} MLME_AUTH_REQ_STRUCT, *PMLME_AUTH_REQ_STRUCT; + +typedef struct _MLME_DEAUTH_REQ_STRUCT { + UCHAR Addr[MAC_ADDR_LEN]; + USHORT Reason; +} MLME_DEAUTH_REQ_STRUCT, *PMLME_DEAUTH_REQ_STRUCT; + +typedef struct { + ULONG BssIdx; +} MLME_JOIN_REQ_STRUCT; + +typedef struct _MLME_SCAN_REQ_STRUCT { + UCHAR Bssid[MAC_ADDR_LEN]; + UCHAR BssType; + UCHAR ScanType; + UCHAR SsidLen; + CHAR Ssid[MAX_LEN_OF_SSID]; +} MLME_SCAN_REQ_STRUCT, *PMLME_SCAN_REQ_STRUCT; + +typedef struct _MLME_START_REQ_STRUCT { + CHAR Ssid[MAX_LEN_OF_SSID]; + UCHAR SsidLen; +} MLME_START_REQ_STRUCT, *PMLME_START_REQ_STRUCT; + +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT +// structure for DLS +typedef struct _RT_802_11_DLS { + USHORT TimeOut; // Use to time out while slience, unit: second , set by UI + USHORT CountDownTimer; // Use to time out while slience,unit: second , used by driver only + NDIS_802_11_MAC_ADDRESS MacAddr; // set by UI + UCHAR Status; // 0: none , 1: wait STAkey, 2: finish DLS setup , set by driver only + BOOLEAN Valid; // 1: valid , 0: invalid , set by UI, use to setup or tear down DLS link + RALINK_TIMER_STRUCT Timer; // Use to time out while handshake + USHORT Sequence; + USHORT MacTabMatchWCID; // ASIC + BOOLEAN bHTCap; + PVOID pAd; +} RT_802_11_DLS, *PRT_802_11_DLS; + +typedef struct _MLME_DLS_REQ_STRUCT { + PRT_802_11_DLS pDLS; + USHORT Reason; +} MLME_DLS_REQ_STRUCT, *PMLME_DLS_REQ_STRUCT; +#endif // QOS_DLS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +typedef struct GNU_PACKED { + UCHAR Eid; + UCHAR Len; + UCHAR Octet[1]; +} EID_STRUCT,*PEID_STRUCT, BEACON_EID_STRUCT, *PBEACON_EID_STRUCT; + +typedef struct GNU_PACKED _RTMP_TX_RATE_SWITCH +{ + UCHAR ItemNo; +#ifdef RT_BIG_ENDIAN + UCHAR Rsv2:2; + UCHAR Mode:2; + UCHAR Rsv1:1; + UCHAR BW:1; + UCHAR ShortGI:1; + UCHAR STBC:1; +#else + UCHAR STBC:1; + UCHAR ShortGI:1; + UCHAR BW:1; + UCHAR Rsv1:1; + UCHAR Mode:2; + UCHAR Rsv2:2; +#endif + UCHAR CurrMCS; + UCHAR TrainUp; + UCHAR TrainDown; +} RRTMP_TX_RATE_SWITCH, *PRTMP_TX_RATE_SWITCH; + + +// ========================== AP mlme.h =============================== +#define TBTT_PRELOAD_TIME 384 // usec. LomgPreamble + 24-byte at 1Mbps +#define DEFAULT_DTIM_PERIOD 1 + +// weighting factor to calculate Channel quality, total should be 100% +//#define RSSI_WEIGHTING 0 +//#define TX_WEIGHTING 40 +//#define RX_WEIGHTING 60 + +#define MAC_TABLE_AGEOUT_TIME 300 // unit: sec +#define MAC_TABLE_MIN_AGEOUT_TIME 60 // unit: sec +#define MAC_TABLE_ASSOC_TIMEOUT 5 // unit: sec +#define MAC_TABLE_FULL(Tab) ((Tab).size == MAX_LEN_OF_MAC_TABLE) + +// AP shall drop the sta if contine Tx fail count reach it. +#define MAC_ENTRY_LIFE_CHECK_CNT 20 // packet cnt. + +// Value domain of pMacEntry->Sst +typedef enum _Sst { + SST_NOT_AUTH, // 0: equivalent to IEEE 802.11/1999 state 1 + SST_AUTH, // 1: equivalent to IEEE 802.11/1999 state 2 + SST_ASSOC // 2: equivalent to IEEE 802.11/1999 state 3 +} SST; + +// value domain of pMacEntry->AuthState +typedef enum _AuthState { + AS_NOT_AUTH, + AS_AUTH_OPEN, // STA has been authenticated using OPEN SYSTEM + AS_AUTH_KEY, // STA has been authenticated using SHARED KEY + AS_AUTHENTICATING // STA is waiting for AUTH seq#3 using SHARED KEY +} AUTH_STATE; + +// ====================== end of AP mlme.h ============================ + + +#endif // MLME_H__ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/netif_block.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/netif_block.h new file mode 100644 index 000000000..1528a5cd0 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/netif_block.h @@ -0,0 +1,57 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + +#ifndef __NET_IF_BLOCK_H__ +#define __NET_IF_BLOCK_H__ + +#include "link_list.h" +#include "rtmp.h" + +#define FREE_NETIF_POOL_SIZE 32 + +typedef struct _NETIF_ENTRY +{ + struct _NETIF_ENTRY *pNext; + PNET_DEV pNetDev; +} NETIF_ENTRY, *PNETIF_ENTRY; + +void initblockQueueTab( + IN PRTMP_ADAPTER pAd); + +BOOLEAN blockNetIf( + IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry, + IN PNET_DEV pNetDev); + +VOID releaseNetIf( + IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry); + +VOID StopNetIfQueue( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket); +#endif // __NET_IF_BLOCK_H__ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/oid.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/oid.h new file mode 100644 index 000000000..774f1c0e0 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/oid.h @@ -0,0 +1,1294 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + oid.h + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs +*/ +#ifndef _OID_H_ +#define _OID_H_ + +//#include <linux/wireless.h> + +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif +// +// IEEE 802.11 Structures and definitions +// +#define MAX_TX_POWER_LEVEL 100 /* mW */ +#define MAX_RSSI_TRIGGER -10 /* dBm */ +#define MIN_RSSI_TRIGGER -200 /* dBm */ +#define MAX_FRAG_THRESHOLD 2346 /* byte count */ +#define MIN_FRAG_THRESHOLD 256 /* byte count */ +#define MAX_RTS_THRESHOLD 2347 /* byte count */ + +// new types for Media Specific Indications +// Extension channel offset +#define EXTCHA_NONE 0 +#define EXTCHA_ABOVE 0x1 +#define EXTCHA_BELOW 0x3 + +// BW +#define BAND_WIDTH_20 0 +#define BAND_WIDTH_40 1 +#define BAND_WIDTH_BOTH 2 +#define BAND_WIDTH_10 3 // 802.11j has 10MHz. This definition is for internal usage. doesn't fill in the IE or other field. +// SHORTGI +#define GAP_INTERVAL_400 1 // only support in HT mode +#define GAP_INTERVAL_800 0 +#define GAP_INTERVAL_BOTH 2 + +#define NdisMediaStateConnected 1 +#define NdisMediaStateDisconnected 0 + +#define NDIS_802_11_LENGTH_SSID 32 + +#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */ +#define IEEE80211_NWID_LEN 32 + +#define NDIS_802_11_LENGTH_RATES 8 +#define NDIS_802_11_LENGTH_RATES_EX 16 +#define MAC_ADDR_LENGTH 6 +//#define MAX_NUM_OF_CHS 49 // 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL terminationc +#define MAX_NUM_OF_CHS 54 // 14 channels @2.4G + 12@UNII(lower/middle) + 16@HiperLAN2 + 11@UNII(upper) + 0 @Japan + 1 as NULL termination +#define MAX_NUMBER_OF_EVENT 10 // entry # in EVENT table +#define MAX_NUMBER_OF_MAC 32 // if MAX_MBSSID_NUM is 8, this value can't be larger than 211 +#define MAX_NUMBER_OF_ACL 64 +#define MAX_LENGTH_OF_SUPPORT_RATES 12 // 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 +#define MAX_NUMBER_OF_DLS_ENTRY 4 + + +#define RT_QUERY_SIGNAL_CONTEXT 0x0402 +#define RT_SET_IAPP_PID 0x0404 +#define RT_SET_APD_PID 0x0405 +#define RT_SET_DEL_MAC_ENTRY 0x0406 +#define RT_QUERY_EVENT_TABLE 0x0407 +// +// IEEE 802.11 OIDs +// +#define OID_GET_SET_TOGGLE 0x8000 +#define OID_GET_SET_FROM_UI 0x4000 + +#define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0103 +#define OID_802_11_NETWORK_TYPE_IN_USE 0x0104 +#define OID_802_11_RSSI_TRIGGER 0x0107 +#define RT_OID_802_11_RSSI 0x0108 //rt2860 only , kathy +#define RT_OID_802_11_RSSI_1 0x0109 //rt2860 only , kathy +#define RT_OID_802_11_RSSI_2 0x010A //rt2860 only , kathy +#define OID_802_11_NUMBER_OF_ANTENNAS 0x010B +#define OID_802_11_RX_ANTENNA_SELECTED 0x010C +#define OID_802_11_TX_ANTENNA_SELECTED 0x010D +#define OID_802_11_SUPPORTED_RATES 0x010E +#define OID_802_11_ADD_WEP 0x0112 +#define OID_802_11_REMOVE_WEP 0x0113 +#define OID_802_11_DISASSOCIATE 0x0114 +#define OID_802_11_PRIVACY_FILTER 0x0118 +#define OID_802_11_ASSOCIATION_INFORMATION 0x011E +#define OID_802_11_TEST 0x011F + + +#define RT_OID_802_11_COUNTRY_REGION 0x0507 +#define OID_802_11_BSSID_LIST_SCAN 0x0508 +#define OID_802_11_SSID 0x0509 +#define OID_802_11_BSSID 0x050A +#define RT_OID_802_11_RADIO 0x050B +#define RT_OID_802_11_PHY_MODE 0x050C +#define RT_OID_802_11_STA_CONFIG 0x050D +#define OID_802_11_DESIRED_RATES 0x050E +#define RT_OID_802_11_PREAMBLE 0x050F +#define OID_802_11_WEP_STATUS 0x0510 +#define OID_802_11_AUTHENTICATION_MODE 0x0511 +#define OID_802_11_INFRASTRUCTURE_MODE 0x0512 +#define RT_OID_802_11_RESET_COUNTERS 0x0513 +#define OID_802_11_RTS_THRESHOLD 0x0514 +#define OID_802_11_FRAGMENTATION_THRESHOLD 0x0515 +#define OID_802_11_POWER_MODE 0x0516 +#define OID_802_11_TX_POWER_LEVEL 0x0517 +#define RT_OID_802_11_ADD_WPA 0x0518 +#define OID_802_11_REMOVE_KEY 0x0519 +#define OID_802_11_ADD_KEY 0x0520 +#define OID_802_11_CONFIGURATION 0x0521 +#define OID_802_11_TX_PACKET_BURST 0x0522 +#define RT_OID_802_11_QUERY_NOISE_LEVEL 0x0523 +#define RT_OID_802_11_EXTRA_INFO 0x0524 +#define RT_OID_802_11_HARDWARE_REGISTER 0x0525 +#define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS +#define OID_802_11_DEAUTHENTICATION 0x0526 +#define OID_802_11_DROP_UNENCRYPTED 0x0527 +#define OID_802_11_MIC_FAILURE_REPORT_FRAME 0x0528 +#define OID_802_11_EAP_METHOD 0x0529 + +/* For 802.1x daemin using */ +#ifdef DOT1X_SUPPORT +#define OID_802_DOT1X_CONFIGURATION 0x0540 +#define OID_802_DOT1X_PMKID_CACHE 0x0541 +#define OID_802_DOT1X_RADIUS_DATA 0x0542 +#define OID_802_DOT1X_WPA_KEY 0x0543 +#define OID_802_DOT1X_STATIC_WEP_COPY 0x0544 +#define OID_802_DOT1X_IDLE_TIMEOUT 0x0545 +#endif // DOT1X_SUPPORT // + +#define RT_OID_DEVICE_NAME 0x0607 +#define RT_OID_VERSION_INFO 0x0608 +#define OID_802_11_BSSID_LIST 0x0609 +#define OID_802_3_CURRENT_ADDRESS 0x060A +#define OID_GEN_MEDIA_CONNECT_STATUS 0x060B +#define RT_OID_802_11_QUERY_LINK_STATUS 0x060C +#define OID_802_11_RSSI 0x060D +#define OID_802_11_STATISTICS 0x060E +#define OID_GEN_RCV_OK 0x060F +#define OID_GEN_RCV_NO_BUFFER 0x0610 +#define RT_OID_802_11_QUERY_EEPROM_VERSION 0x0611 +#define RT_OID_802_11_QUERY_FIRMWARE_VERSION 0x0612 +#define RT_OID_802_11_QUERY_LAST_RX_RATE 0x0613 +#define RT_OID_802_11_TX_POWER_LEVEL_1 0x0614 +#define RT_OID_802_11_QUERY_PIDVID 0x0615 +//for WPA_SUPPLICANT_SUPPORT +#define OID_SET_COUNTERMEASURES 0x0616 +#define OID_802_11_SET_IEEE8021X 0x0617 +#define OID_802_11_SET_IEEE8021X_REQUIRE_KEY 0x0618 +#define OID_802_11_PMKID 0x0620 +#define RT_OID_WPA_SUPPLICANT_SUPPORT 0x0621 +#define RT_OID_WE_VERSION_COMPILED 0x0622 +#define RT_OID_NEW_DRIVER 0x0623 +#define OID_AUTO_PROVISION_BSSID_LIST 0x0624 +#define RT_OID_WPS_PROBE_REQ_IE 0x0625 + +#define RT_OID_802_11_SNR_0 0x0630 +#define RT_OID_802_11_SNR_1 0x0631 +#define RT_OID_802_11_QUERY_LAST_TX_RATE 0x0632 +#define RT_OID_802_11_QUERY_HT_PHYMODE 0x0633 +#define RT_OID_802_11_SET_HT_PHYMODE 0x0634 +#define OID_802_11_RELOAD_DEFAULTS 0x0635 +#define RT_OID_802_11_QUERY_APSD_SETTING 0x0636 +#define RT_OID_802_11_SET_APSD_SETTING 0x0637 +#define RT_OID_802_11_QUERY_APSD_PSM 0x0638 +#define RT_OID_802_11_SET_APSD_PSM 0x0639 +#define RT_OID_802_11_QUERY_DLS 0x063A +#define RT_OID_802_11_SET_DLS 0x063B +#define RT_OID_802_11_QUERY_DLS_PARAM 0x063C +#define RT_OID_802_11_SET_DLS_PARAM 0x063D +#define RT_OID_802_11_QUERY_WMM 0x063E +#define RT_OID_802_11_SET_WMM 0x063F +#define RT_OID_802_11_QUERY_IMME_BA_CAP 0x0640 +#define RT_OID_802_11_SET_IMME_BA_CAP 0x0641 +#define RT_OID_802_11_QUERY_BATABLE 0x0642 +#define RT_OID_802_11_ADD_IMME_BA 0x0643 +#define RT_OID_802_11_TEAR_IMME_BA 0x0644 +#define RT_OID_DRIVER_DEVICE_NAME 0x0645 +#define RT_OID_802_11_QUERY_DAT_HT_PHYMODE 0x0646 +#define RT_OID_QUERY_MULTIPLE_CARD_SUPPORT 0x0647 +#define OID_802_11_SET_PSPXLINK_MODE 0x0648 +/*+++ add by woody +++*/ +#define OID_802_11_SET_PASSPHRASE 0x0649 +#define RT_OID_802_11_QUERY_TX_PHYMODE 0x0650 +#define RT_OID_802_11_QUERY_MAP_REAL_TX_RATE 0x0678 +#define RT_OID_802_11_QUERY_MAP_REAL_RX_RATE 0x0679 + + + + +#ifdef HOSTAPD_SUPPORT +#define SIOCSIWGENIE 0x8B30 +#define OID_HOSTAPD_SUPPORT 0x0661 + +#define HOSTAPD_OID_STATIC_WEP_COPY 0x0662 +#define HOSTAPD_OID_GET_1X_GROUP_KEY 0x0663 + +#define HOSTAPD_OID_SET_STA_AUTHORIZED 0x0664 +#define HOSTAPD_OID_SET_STA_DISASSOC 0x0665 +#define HOSTAPD_OID_SET_STA_DEAUTH 0x0666 +#define HOSTAPD_OID_DEL_KEY 0x0667 +#define HOSTAPD_OID_SET_KEY 0x0668 +#define HOSTAPD_OID_SET_802_1X 0x0669 +#define HOSTAPD_OID_GET_SEQ 0x0670 +#define HOSTAPD_OID_GETWPAIE 0x0671 +#define HOSTAPD_OID_COUNTERMEASURES 0x0672 +#define HOSTAPD_OID_SET_WPAPSK 0x0673 +#define HOSTAPD_OID_SET_WPS_BEACON_IE 0x0674 +#define HOSTAPD_OID_SET_WPS_PROBE_RESP_IE 0x0675 + +#define RT_HOSTAPD_OID_HOSTAPD_SUPPORT (OID_GET_SET_TOGGLE | OID_HOSTAPD_SUPPORT) +#define RT_HOSTAPD_OID_STATIC_WEP_COPY (OID_GET_SET_TOGGLE | HOSTAPD_OID_STATIC_WEP_COPY) +#define RT_HOSTAPD_OID_GET_1X_GROUP_KEY (OID_GET_SET_TOGGLE | HOSTAPD_OID_GET_1X_GROUP_KEY) +#define RT_HOSTAPD_OID_SET_STA_AUTHORIZED (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_STA_AUTHORIZED) +#define RT_HOSTAPD_OID_SET_STA_DISASSOC (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_STA_DISASSOC) +#define RT_HOSTAPD_OID_SET_STA_DEAUTH (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_STA_DEAUTH) +#define RT_HOSTAPD_OID_DEL_KEY (OID_GET_SET_TOGGLE | HOSTAPD_OID_DEL_KEY) +#define RT_HOSTAPD_OID_SET_KEY (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_KEY) +#define RT_HOSTAPD_OID_SET_802_1X (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_802_1X) +#define RT_HOSTAPD_OID_COUNTERMEASURES (OID_GET_SET_TOGGLE | HOSTAPD_OID_COUNTERMEASURES) +#define RT_HOSTAPD_OID_SET_WPAPSK (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_WPAPSK) +#define RT_HOSTAPD_OID_SET_WPS_BEACON_IE (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_WPS_BEACON_IE) +#define RT_HOSTAPD_OID_SET_WPS_PROBE_RESP_IE (OID_GET_SET_TOGGLE | HOSTAPD_OID_SET_WPS_PROBE_RESP_IE) + + +#define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01) +#define IEEE80211_KEYBUF_SIZE 16 +#define IEEE80211_MICBUF_SIZE (8 + 8) /* space for both tx+rx keys */ +#define IEEE80211_TID_SIZE 17 /* total number of TIDs */ + +#define IEEE80211_MLME_ASSOC 1 /* associate station */ +#define IEEE80211_MLME_DISASSOC 2 /* disassociate station */ +#define IEEE80211_MLME_DEAUTH 3 /* deauthenticate station */ +#define IEEE80211_MLME_AUTHORIZE 4 /* authorize station */ +#define IEEE80211_MLME_UNAUTHORIZE 5 /* unauthorize station */ +#define IEEE80211_MLME_CLEAR_STATS 6 /* clear station statistic */ +#define IEEE80211_1X_COPY_KEY 7 /* copy static-wep unicast key */ + +#define IEEE80211_MAX_OPT_IE 256 +#define IWEVEXPIRED 0x8C04 + +struct ieee80211req_mlme { + UINT8 im_op; /* operation to perform */ + UINT8 im_ssid_len; /* length of optional ssid */ + UINT16 im_reason; /* 802.11 reason code */ + UINT8 im_macaddr[IEEE80211_ADDR_LEN]; + UINT8 im_ssid[IEEE80211_NWID_LEN]; +}; + +struct ieee80211req_key { + UINT8 ik_type; /* key/cipher type */ + UINT8 ik_pad; + UINT16 ik_keyix; /* key index */ + UINT8 ik_keylen; /* key length in bytes */ + UINT8 ik_flags; + UINT8 ik_macaddr[IEEE80211_ADDR_LEN]; + UINT64 ik_keyrsc; /* key receive sequence counter */ + UINT64 ik_keytsc; /* key transmit sequence counter */ + UINT8 ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE]; + int txkey; +}; + +struct ieee80211req_del_key { + UINT8 idk_keyix; /* key index */ + UINT8 idk_macaddr[IEEE80211_ADDR_LEN]; +}; + +struct default_group_key { + UINT16 ik_keyix; /* key index */ + UINT8 ik_keylen; /* key length in bytes */ + UINT8 ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE]; +}; + +struct ieee80211req_wpaie { + UINT8 wpa_macaddr[IEEE80211_ADDR_LEN]; + UINT8 wpa_ie[IEEE80211_MAX_OPT_IE]; + UINT8 rsn_ie[IEEE80211_MAX_OPT_IE]; +}; + +struct hostapd_wpa_psk { + struct hostapd_wpa_psk *next; + int group; + UCHAR psk[32]; + UCHAR addr[6]; +}; + +#endif //HOSTAPD_SUPPORT// + +#define RT_OID_802_11_QUERY_TDLS_PARAM 0x0676 +#define RT_OID_802_11_QUERY_TDLS 0x0677 + +// Ralink defined OIDs +// Dennis Lee move to platform specific + +#define RT_OID_802_11_BSSID (OID_GET_SET_TOGGLE | OID_802_11_BSSID) +#define RT_OID_802_11_SSID (OID_GET_SET_TOGGLE | OID_802_11_SSID) +#define RT_OID_802_11_INFRASTRUCTURE_MODE (OID_GET_SET_TOGGLE | OID_802_11_INFRASTRUCTURE_MODE) +#define RT_OID_802_11_ADD_WEP (OID_GET_SET_TOGGLE | OID_802_11_ADD_WEP) +#define RT_OID_802_11_ADD_KEY (OID_GET_SET_TOGGLE | OID_802_11_ADD_KEY) +#define RT_OID_802_11_REMOVE_WEP (OID_GET_SET_TOGGLE | OID_802_11_REMOVE_WEP) +#define RT_OID_802_11_REMOVE_KEY (OID_GET_SET_TOGGLE | OID_802_11_REMOVE_KEY) +#define RT_OID_802_11_DISASSOCIATE (OID_GET_SET_TOGGLE | OID_802_11_DISASSOCIATE) +#define RT_OID_802_11_AUTHENTICATION_MODE (OID_GET_SET_TOGGLE | OID_802_11_AUTHENTICATION_MODE) +#define RT_OID_802_11_PRIVACY_FILTER (OID_GET_SET_TOGGLE | OID_802_11_PRIVACY_FILTER) +#define RT_OID_802_11_BSSID_LIST_SCAN (OID_GET_SET_TOGGLE | OID_802_11_BSSID_LIST_SCAN) +#define RT_OID_802_11_WEP_STATUS (OID_GET_SET_TOGGLE | OID_802_11_WEP_STATUS) +#define RT_OID_802_11_RELOAD_DEFAULTS (OID_GET_SET_TOGGLE | OID_802_11_RELOAD_DEFAULTS) +#define RT_OID_802_11_NETWORK_TYPE_IN_USE (OID_GET_SET_TOGGLE | OID_802_11_NETWORK_TYPE_IN_USE) +#define RT_OID_802_11_TX_POWER_LEVEL (OID_GET_SET_TOGGLE | OID_802_11_TX_POWER_LEVEL) +#define RT_OID_802_11_RSSI_TRIGGER (OID_GET_SET_TOGGLE | OID_802_11_RSSI_TRIGGER) +#define RT_OID_802_11_FRAGMENTATION_THRESHOLD (OID_GET_SET_TOGGLE | OID_802_11_FRAGMENTATION_THRESHOLD) +#define RT_OID_802_11_RTS_THRESHOLD (OID_GET_SET_TOGGLE | OID_802_11_RTS_THRESHOLD) +#define RT_OID_802_11_RX_ANTENNA_SELECTED (OID_GET_SET_TOGGLE | OID_802_11_RX_ANTENNA_SELECTED) +#define RT_OID_802_11_TX_ANTENNA_SELECTED (OID_GET_SET_TOGGLE | OID_802_11_TX_ANTENNA_SELECTED) +#define RT_OID_802_11_SUPPORTED_RATES (OID_GET_SET_TOGGLE | OID_802_11_SUPPORTED_RATES) +#define RT_OID_802_11_DESIRED_RATES (OID_GET_SET_TOGGLE | OID_802_11_DESIRED_RATES) +#define RT_OID_802_11_CONFIGURATION (OID_GET_SET_TOGGLE | OID_802_11_CONFIGURATION) +#define RT_OID_802_11_POWER_MODE (OID_GET_SET_TOGGLE | OID_802_11_POWER_MODE) +#define RT_OID_802_11_SET_PSPXLINK_MODE (OID_GET_SET_TOGGLE | OID_802_11_SET_PSPXLINK_MODE) +#define RT_OID_802_11_EAP_METHOD (OID_GET_SET_TOGGLE | OID_802_11_EAP_METHOD) +#define RT_OID_802_11_SET_PASSPHRASE (OID_GET_SET_TOGGLE | OID_802_11_SET_PASSPHRASE) + +#ifdef DOT1X_SUPPORT +#define RT_OID_802_DOT1X_PMKID_CACHE (OID_GET_SET_TOGGLE | OID_802_DOT1X_PMKID_CACHE) +#define RT_OID_802_DOT1X_RADIUS_DATA (OID_GET_SET_TOGGLE | OID_802_DOT1X_RADIUS_DATA) +#define RT_OID_802_DOT1X_WPA_KEY (OID_GET_SET_TOGGLE | OID_802_DOT1X_WPA_KEY) +#define RT_OID_802_DOT1X_STATIC_WEP_COPY (OID_GET_SET_TOGGLE | OID_802_DOT1X_STATIC_WEP_COPY) +#define RT_OID_802_DOT1X_IDLE_TIMEOUT (OID_GET_SET_TOGGLE | OID_802_DOT1X_IDLE_TIMEOUT) +#endif // DOT1X_SUPPORT // + +#define RT_OID_802_11_SET_TDLS_PARAM (OID_GET_SET_TOGGLE | RT_OID_802_11_QUERY_TDLS_PARAM) +#define RT_OID_802_11_SET_TDLS (OID_GET_SET_TOGGLE | RT_OID_802_11_QUERY_TDLS) + + +typedef enum _NDIS_802_11_STATUS_TYPE +{ + Ndis802_11StatusType_Authentication, + Ndis802_11StatusType_MediaStreamMode, + Ndis802_11StatusType_PMKID_CandidateList, + Ndis802_11StatusTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; + +typedef UCHAR NDIS_802_11_MAC_ADDRESS[6]; + +typedef struct _NDIS_802_11_STATUS_INDICATION +{ + NDIS_802_11_STATUS_TYPE StatusType; +} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; + +// mask for authentication/integrity fields +#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f + +#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 +#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 +#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 +#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E + +typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST +{ + ULONG Length; // Length of structure + NDIS_802_11_MAC_ADDRESS Bssid; + ULONG Flags; +} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; + +//Added new types for PMKID Candidate lists. +typedef struct _PMKID_CANDIDATE { + NDIS_802_11_MAC_ADDRESS BSSID; + ULONG Flags; +} PMKID_CANDIDATE, *PPMKID_CANDIDATE; + +typedef struct _NDIS_802_11_PMKID_CANDIDATE_LIST +{ + ULONG Version; // Version of the structure + ULONG NumCandidates; // No. of pmkid candidates + PMKID_CANDIDATE CandidateList[1]; +} NDIS_802_11_PMKID_CANDIDATE_LIST, *PNDIS_802_11_PMKID_CANDIDATE_LIST; + +//Flags for PMKID Candidate list structure +#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED 0x01 + +// Added new types for OFDM 5G and 2.4G +typedef enum _NDIS_802_11_NETWORK_TYPE +{ + Ndis802_11FH, + Ndis802_11DS, + Ndis802_11OFDM5, + Ndis802_11OFDM24, + Ndis802_11Automode, + Ndis802_11OFDM5_N, + Ndis802_11OFDM24_N, + Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound +} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; + +typedef struct _NDIS_802_11_NETWORK_TYPE_LIST +{ + UINT NumberOfItems; // in list below, at least 1 + NDIS_802_11_NETWORK_TYPE NetworkType [1]; +} NDIS_802_11_NETWORK_TYPE_LIST, *PNDIS_802_11_NETWORK_TYPE_LIST; + +typedef enum _NDIS_802_11_POWER_MODE +{ + Ndis802_11PowerModeCAM, + Ndis802_11PowerModeMAX_PSP, + Ndis802_11PowerModeFast_PSP, + Ndis802_11PowerModeLegacy_PSP, + Ndis802_11PowerModeMax // not a real mode, defined as an upper bound +} NDIS_802_11_POWER_MODE, *PNDIS_802_11_POWER_MODE; + +typedef ULONG NDIS_802_11_TX_POWER_LEVEL; // in milliwatts + +// +// Received Signal Strength Indication +// +typedef LONG NDIS_802_11_RSSI; // in dBm + +typedef struct _NDIS_802_11_CONFIGURATION_FH +{ + ULONG Length; // Length of structure + ULONG HopPattern; // As defined by 802.11, MSB set + ULONG HopSet; // to one if non-802.11 + ULONG DwellTime; // units are Kusec +} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; + +typedef struct _NDIS_802_11_CONFIGURATION +{ + ULONG Length; // Length of structure + ULONG BeaconPeriod; // units are Kusec + ULONG ATIMWindow; // units are Kusec + ULONG DSConfig; // Frequency, units are kHz + NDIS_802_11_CONFIGURATION_FH FHConfig; +} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; + +typedef struct _NDIS_802_11_STATISTICS +{ + ULONG Length; // Length of structure + LARGE_INTEGER TransmittedFragmentCount; + LARGE_INTEGER MulticastTransmittedFrameCount; + LARGE_INTEGER FailedCount; + LARGE_INTEGER RetryCount; + LARGE_INTEGER MultipleRetryCount; + LARGE_INTEGER RTSSuccessCount; + LARGE_INTEGER RTSFailureCount; + LARGE_INTEGER ACKFailureCount; + LARGE_INTEGER FrameDuplicateCount; + LARGE_INTEGER ReceivedFragmentCount; + LARGE_INTEGER MulticastReceivedFrameCount; + LARGE_INTEGER FCSErrorCount; + LARGE_INTEGER TKIPLocalMICFailures; + LARGE_INTEGER TKIPRemoteMICErrors; + LARGE_INTEGER TKIPICVErrors; + LARGE_INTEGER TKIPCounterMeasuresInvoked; + LARGE_INTEGER TKIPReplays; + LARGE_INTEGER CCMPFormatErrors; + LARGE_INTEGER CCMPReplays; + LARGE_INTEGER CCMPDecryptErrors; + LARGE_INTEGER FourWayHandshakeFailures; +} NDIS_802_11_STATISTICS, *PNDIS_802_11_STATISTICS; + +typedef ULONG NDIS_802_11_KEY_INDEX; +typedef ULONGLONG NDIS_802_11_KEY_RSC; + +#ifdef DOT1X_SUPPORT +#define MAX_RADIUS_SRV_NUM 2 // 802.1x failover number + +/* The dot1x related structure. + It's used to communicate with DOT1X daemon */ +typedef struct GNU_PACKED _RADIUS_SRV_INFO { + UINT32 radius_ip; + UINT32 radius_port; + UCHAR radius_key[64]; + UCHAR radius_key_len; +} RADIUS_SRV_INFO, *PRADIUS_SRV_INFO; + +typedef struct GNU_PACKED _DOT1X_BSS_INFO +{ + UCHAR radius_srv_num; + RADIUS_SRV_INFO radius_srv_info[MAX_RADIUS_SRV_NUM]; + UCHAR ieee8021xWEP; // dynamic WEP + UCHAR key_index; + UCHAR key_length; // length of key in bytes + UCHAR key_material[13]; + UCHAR nasId[IFNAMSIZ]; + UCHAR nasId_len; +} DOT1X_BSS_INFO, *PDOT1X_BSS_INFO; + +typedef struct GNU_PACKED _DOT1X_CMM_CONF +{ + UINT32 Length; // Length of this structure + UCHAR mbss_num; // indicate multiple BSS number + UINT32 own_ip_addr; + UINT32 retry_interval; + UINT32 session_timeout_interval; + UINT32 quiet_interval; + UCHAR EAPifname[8][IFNAMSIZ]; + UCHAR EAPifname_len[8]; + UCHAR PreAuthifname[8][IFNAMSIZ]; + UCHAR PreAuthifname_len[8]; + DOT1X_BSS_INFO Dot1xBssInfo[8]; +} DOT1X_CMM_CONF, *PDOT1X_CMM_CONF; + +typedef struct GNU_PACKED _DOT1X_IDLE_TIMEOUT +{ + UCHAR StaAddr[6]; + UINT32 idle_timeout; +} DOT1X_IDLE_TIMEOUT, *PDOT1X_IDLE_TIMEOUT; +#endif // DOT1X_SUPPORT // + + + +#ifdef CONFIG_STA_SUPPORT +// Key mapping keys require a BSSID +typedef struct _NDIS_802_11_KEY +{ + UINT Length; // Length of this structure + UINT KeyIndex; + UINT KeyLength; // length of key in bytes + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_KEY_RSC KeyRSC; + UCHAR KeyMaterial[1]; // variable length depending on above field +} NDIS_802_11_KEY, *PNDIS_802_11_KEY; + +typedef struct _NDIS_802_11_PASSPHRASE +{ + UINT KeyLength; // length of key in bytes + NDIS_802_11_MAC_ADDRESS BSSID; + UCHAR KeyMaterial[1]; // variable length depending on above field +} NDIS_802_11_PASSPHRASE, *PNDIS_802_11_PASSPHRASE; +#endif // CONFIG_STA_SUPPORT // + +typedef struct _NDIS_802_11_REMOVE_KEY +{ + UINT Length; // Length of this structure + UINT KeyIndex; + NDIS_802_11_MAC_ADDRESS BSSID; +} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; + +typedef struct _NDIS_802_11_WEP +{ + UINT Length; // Length of this structure + UINT KeyIndex; // 0 is the per-client key, 1-N are the + // global keys + UINT KeyLength; // length of key in bytes + UCHAR KeyMaterial[1];// variable length depending on above field +} NDIS_802_11_WEP, *PNDIS_802_11_WEP; + + +typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE +{ + Ndis802_11IBSS, + Ndis802_11Infrastructure, + Ndis802_11AutoUnknown, + Ndis802_11Monitor, + Ndis802_11InfrastructureMax // Not a real value, defined as upper bound +} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; + +// Add new authentication modes +typedef enum _NDIS_802_11_AUTHENTICATION_MODE +{ + Ndis802_11AuthModeOpen, + Ndis802_11AuthModeShared, + Ndis802_11AuthModeAutoSwitch, + Ndis802_11AuthModeWPA, + Ndis802_11AuthModeWPAPSK, + Ndis802_11AuthModeWPANone, + Ndis802_11AuthModeWPA2, + Ndis802_11AuthModeWPA2PSK, + Ndis802_11AuthModeWPA1WPA2, + Ndis802_11AuthModeWPA1PSKWPA2PSK, + Ndis802_11AuthModeMax // Not a real mode, defined as upper bound +} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE; + +typedef UCHAR NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; // Set of 8 data rates +typedef UCHAR NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; // Set of 16 data rates + +typedef struct GNU_PACKED _NDIS_802_11_SSID +{ + UINT SsidLength; // length of SSID field below, in bytes; + // this can be zero. + UCHAR Ssid[NDIS_802_11_LENGTH_SSID]; // SSID information field +} NDIS_802_11_SSID, *PNDIS_802_11_SSID; + + +typedef struct GNU_PACKED _NDIS_WLAN_BSSID +{ + ULONG Length; // Length of this structure + NDIS_802_11_MAC_ADDRESS MacAddress; // BSSID + UCHAR Reserved[2]; + NDIS_802_11_SSID Ssid; // SSID + ULONG Privacy; // WEP encryption requirement + NDIS_802_11_RSSI Rssi; // receive signal strength in dBm + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES SupportedRates; +} NDIS_WLAN_BSSID, *PNDIS_WLAN_BSSID; + +typedef struct GNU_PACKED _NDIS_802_11_BSSID_LIST +{ + UINT NumberOfItems; // in list below, at least 1 + NDIS_WLAN_BSSID Bssid[1]; +} NDIS_802_11_BSSID_LIST, *PNDIS_802_11_BSSID_LIST; + +typedef struct { + BOOLEAN bValid; // 1: variable contains valid value + USHORT StaNum; + UCHAR ChannelUtilization; + USHORT RemainingAdmissionControl; // in unit of 32-us +} QBSS_LOAD_UI, *PQBSS_LOAD_UI; + +// Added Capabilities, IELength and IEs for each BSSID +typedef struct GNU_PACKED _NDIS_WLAN_BSSID_EX +{ + ULONG Length; // Length of this structure + NDIS_802_11_MAC_ADDRESS MacAddress; // BSSID + UCHAR Reserved[2]; + NDIS_802_11_SSID Ssid; // SSID + UINT Privacy; // WEP encryption requirement + NDIS_802_11_RSSI Rssi; // receive signal + // strength in dBm + NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; + NDIS_802_11_CONFIGURATION Configuration; + NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; + NDIS_802_11_RATES_EX SupportedRates; + ULONG IELength; + UCHAR IEs[1]; +} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; + +typedef struct GNU_PACKED _NDIS_802_11_BSSID_LIST_EX +{ + UINT NumberOfItems; // in list below, at least 1 + NDIS_WLAN_BSSID_EX Bssid[1]; +} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; + +typedef struct GNU_PACKED _NDIS_802_11_FIXED_IEs +{ + UCHAR Timestamp[8]; + USHORT BeaconInterval; + USHORT Capabilities; +} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; + +typedef struct _NDIS_802_11_VARIABLE_IEs +{ + UCHAR ElementID; + UCHAR Length; // Number of bytes in data field + UCHAR data[1]; +} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; + +typedef ULONG NDIS_802_11_FRAGMENTATION_THRESHOLD; + +typedef ULONG NDIS_802_11_RTS_THRESHOLD; + +typedef ULONG NDIS_802_11_ANTENNA; + +typedef enum _NDIS_802_11_PRIVACY_FILTER +{ + Ndis802_11PrivFilterAcceptAll, + Ndis802_11PrivFilter8021xWEP +} NDIS_802_11_PRIVACY_FILTER, *PNDIS_802_11_PRIVACY_FILTER; + +// Added new encryption types +// Also aliased typedef to new name +typedef enum _NDIS_802_11_WEP_STATUS +{ + Ndis802_11WEPEnabled, + Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, + Ndis802_11WEPDisabled, + Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, + Ndis802_11WEPKeyAbsent, + Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, + Ndis802_11WEPNotSupported, + Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, + Ndis802_11Encryption2Enabled, + Ndis802_11Encryption2KeyAbsent, + Ndis802_11Encryption3Enabled, + Ndis802_11Encryption3KeyAbsent, + Ndis802_11Encryption4Enabled, // TKIP or AES mix + Ndis802_11Encryption4KeyAbsent, + Ndis802_11GroupWEP40Enabled, + Ndis802_11GroupWEP104Enabled, +} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, + NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; + +typedef enum _NDIS_802_11_RELOAD_DEFAULTS +{ + Ndis802_11ReloadWEPKeys +} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS; + +#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 +#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 +#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 + +#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 +#define NDIS_802_11_AI_RESFI_STATUSCODE 2 +#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 + +typedef struct _NDIS_802_11_AI_REQFI +{ + USHORT Capabilities; + USHORT ListenInterval; + NDIS_802_11_MAC_ADDRESS CurrentAPAddress; +} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; + +typedef struct _NDIS_802_11_AI_RESFI +{ + USHORT Capabilities; + USHORT StatusCode; + USHORT AssociationId; +} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; + +typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION +{ + ULONG Length; + USHORT AvailableRequestFixedIEs; + NDIS_802_11_AI_REQFI RequestFixedIEs; + ULONG RequestIELength; + ULONG OffsetRequestIEs; + USHORT AvailableResponseFixedIEs; + NDIS_802_11_AI_RESFI ResponseFixedIEs; + ULONG ResponseIELength; + ULONG OffsetResponseIEs; +} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; + +typedef struct _NDIS_802_11_AUTHENTICATION_EVENT +{ + NDIS_802_11_STATUS_INDICATION Status; + NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; +} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; + +/* +typedef struct _NDIS_802_11_TEST +{ + ULONG Length; + ULONG Type; + union + { + NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; + NDIS_802_11_RSSI RssiTrigger; + }; +} NDIS_802_11_TEST, *PNDIS_802_11_TEST; + */ + +// 802.11 Media stream constraints, associated with OID_802_11_MEDIA_STREAM_MODE +typedef enum _NDIS_802_11_MEDIA_STREAM_MODE +{ + Ndis802_11MediaStreamOff, + Ndis802_11MediaStreamOn, +} NDIS_802_11_MEDIA_STREAM_MODE, *PNDIS_802_11_MEDIA_STREAM_MODE; + +// PMKID Structures +typedef UCHAR NDIS_802_11_PMKID_VALUE[16]; + +#ifdef CONFIG_STA_SUPPORT +typedef struct _BSSID_INFO +{ + NDIS_802_11_MAC_ADDRESS BSSID; + NDIS_802_11_PMKID_VALUE PMKID; +} BSSID_INFO, *PBSSID_INFO; + +typedef struct _NDIS_802_11_PMKID +{ + UINT Length; + UINT BSSIDInfoCount; + BSSID_INFO BSSIDInfo[1]; +} NDIS_802_11_PMKID, *PNDIS_802_11_PMKID; +#endif // CONFIG_STA_SUPPORT // + + +typedef struct _NDIS_802_11_AUTHENTICATION_ENCRYPTION +{ + NDIS_802_11_AUTHENTICATION_MODE AuthModeSupported; + NDIS_802_11_ENCRYPTION_STATUS EncryptStatusSupported; +} NDIS_802_11_AUTHENTICATION_ENCRYPTION, *PNDIS_802_11_AUTHENTICATION_ENCRYPTION; + +typedef struct _NDIS_802_11_CAPABILITY +{ + ULONG Length; + ULONG Version; + ULONG NoOfPMKIDs; + ULONG NoOfAuthEncryptPairsSupported; + NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1]; +} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY; + +#ifdef LINUX +#if WIRELESS_EXT <= 11 +#ifndef SIOCDEVPRIVATE +#define SIOCDEVPRIVATE 0x8BE0 +#endif +#define SIOCIWFIRSTPRIV SIOCDEVPRIVATE +#endif +#endif // LINUX // + + +#ifdef CONFIG_STA_SUPPORT +#define RT_PRIV_IOCTL (SIOCIWFIRSTPRIV + 0x01) // Sync. with AP for wsc upnp daemon +#define RTPRIV_IOCTL_SET (SIOCIWFIRSTPRIV + 0x02) + +#ifdef DBG +#define RTPRIV_IOCTL_BBP (SIOCIWFIRSTPRIV + 0x03) +#define RTPRIV_IOCTL_MAC (SIOCIWFIRSTPRIV + 0x05) + +#ifdef RTMP_RF_RW_SUPPORT +#define RTPRIV_IOCTL_RF (SIOCIWFIRSTPRIV + 0x13) // edit by johnli, fix read rf register problem +#endif // RTMP_RF_RW_SUPPORT // +#define RTPRIV_IOCTL_E2P (SIOCIWFIRSTPRIV + 0x07) +#endif // DBG // + +#ifdef RALINK_ATE +#ifdef RALINK_28xx_QA +#define RTPRIV_IOCTL_ATE (SIOCIWFIRSTPRIV + 0x08) +#endif // RALINK_28xx_QA // +#endif // RALINK_ATE // + +#define RTPRIV_IOCTL_STATISTICS (SIOCIWFIRSTPRIV + 0x09) +#define RTPRIV_IOCTL_ADD_PMKID_CACHE (SIOCIWFIRSTPRIV + 0x0A) +#define RTPRIV_IOCTL_RADIUS_DATA (SIOCIWFIRSTPRIV + 0x0C) +#define RTPRIV_IOCTL_GSITESURVEY (SIOCIWFIRSTPRIV + 0x0D) +#define RT_PRIV_IOCTL_EXT (SIOCIWFIRSTPRIV + 0x0E) // Sync. with RT61 (for wpa_supplicant) +#define RTPRIV_IOCTL_GET_MAC_TABLE (SIOCIWFIRSTPRIV + 0x0F) + +#define RTPRIV_IOCTL_SHOW (SIOCIWFIRSTPRIV + 0x11) +enum { + SHOW_CONN_STATUS = 4, + SHOW_DRVIER_VERION = 5, + SHOW_BA_INFO = 6, + SHOW_DESC_INFO = 7, + RAIO_OFF = 10, + RAIO_ON = 11, +#ifdef QOS_DLS_SUPPORT + SHOW_DLS_ENTRY_INFO = 20, +#endif // QOS_DLS_SUPPORT // + SHOW_CFG_VALUE = 21, + SHOW_ADHOC_ENTRY_INFO = 22, +}; + + +#endif // CONFIG_STA_SUPPORT // + + + +#ifdef SNMP_SUPPORT +//SNMP ieee 802dot11, kathy , 2008_0220 +// dot11res(3) +#define RT_OID_802_11_MANUFACTUREROUI 0x0700 +#define RT_OID_802_11_MANUFACTURERNAME 0x0701 +#define RT_OID_802_11_RESOURCETYPEIDNAME 0x0702 + +// dot11smt(1) +#define RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED 0x0703 +#define RT_OID_802_11_POWERMANAGEMENTMODE 0x0704 +#define OID_802_11_WEPDEFAULTKEYVALUE 0x0705 // read , write +#define OID_802_11_WEPDEFAULTKEYID 0x0706 +#define RT_OID_802_11_WEPKEYMAPPINGLENGTH 0x0707 +#define OID_802_11_SHORTRETRYLIMIT 0x0708 +#define OID_802_11_LONGRETRYLIMIT 0x0709 +#define RT_OID_802_11_PRODUCTID 0x0710 +#define RT_OID_802_11_MANUFACTUREID 0x0711 + +// //dot11Phy(4) +#define OID_802_11_CURRENTCHANNEL 0x0712 + +//dot11mac +#define RT_OID_802_11_MAC_ADDRESS 0x0713 +#endif // SNMP_SUPPORT // + +#define OID_802_11_BUILD_CHANNEL_EX 0x0714 +#define OID_802_11_GET_CH_LIST 0x0715 +#define OID_802_11_GET_COUNTRY_CODE 0x0716 +#define OID_802_11_GET_CHANNEL_GEOGRAPHY 0x0717 + +//#define RT_OID_802_11_STATISTICS (OID_GET_SET_TOGGLE | OID_802_11_STATISTICS) + +#ifdef CONFIG_STA_SUPPORT +#define RT_OID_WSC_SET_PASSPHRASE 0x0740 // passphrase for wpa(2)-psk +#define RT_OID_WSC_DRIVER_AUTO_CONNECT 0x0741 +#define RT_OID_WSC_QUERY_DEFAULT_PROFILE 0x0742 +#define RT_OID_WSC_SET_CONN_BY_PROFILE_INDEX 0x0743 +#define RT_OID_WSC_SET_ACTION 0x0744 +#define RT_OID_WSC_SET_SSID 0x0745 +#define RT_OID_WSC_SET_PIN_CODE 0x0746 +#define RT_OID_WSC_SET_MODE 0x0747 // PIN or PBC +#define RT_OID_WSC_SET_CONF_MODE 0x0748 // Enrollee or Registrar +#define RT_OID_WSC_SET_PROFILE 0x0749 +#endif // CONFIG_STA_SUPPORT // +#define RT_OID_WSC_CONFIG_STATUS 0x074F +#define RT_OID_802_11_WSC_QUERY_PROFILE 0x0750 +// for consistency with RT61 +#define RT_OID_WSC_QUERY_STATUS 0x0751 +#define RT_OID_WSC_PIN_CODE 0x0752 +#define RT_OID_WSC_UUID 0x0753 +#define RT_OID_WSC_SET_SELECTED_REGISTRAR 0x0754 +#define RT_OID_WSC_EAPMSG 0x0755 +#define RT_OID_WSC_MANUFACTURER 0x0756 +#define RT_OID_WSC_MODEL_NAME 0x0757 +#define RT_OID_WSC_MODEL_NO 0x0758 +#define RT_OID_WSC_SERIAL_NO 0x0759 +#define RT_OID_WSC_READ_UFD_FILE 0x075A +#define RT_OID_WSC_WRITE_UFD_FILE 0x075B +#define RT_OID_WSC_MAC_ADDRESS 0x0760 + +#ifdef LLTD_SUPPORT +// for consistency with RT61 +#define RT_OID_GET_PHY_MODE 0x761 +#endif // LLTD_SUPPORT // + +#ifdef NINTENDO_AP +//#define RT_OID_NINTENDO 0x0D010770 +#define RT_OID_802_11_NINTENDO_GET_TABLE 0x0771 //((RT_OID_NINTENDO + 0x01) & 0xffff) +#define RT_OID_802_11_NINTENDO_SET_TABLE 0x0772 //((RT_OID_NINTENDO + 0x02) & 0xffff) +#define RT_OID_802_11_NINTENDO_CAPABLE 0x0773 //((RT_OID_NINTENDO + 0x03) & 0xffff) +#endif // NINTENDO_AP // + + +// New for MeetingHouse Api support +#define OID_MH_802_1X_SUPPORTED 0xFFEDC100 + +// MIMO Tx parameter, ShortGI, MCS, STBC, etc. these are fields in TXWI. Don't change this definition!!! +typedef union _HTTRANSMIT_SETTING { +#ifdef RT_BIG_ENDIAN + struct { + USHORT MODE:2; // Use definition MODE_xxx. +// USHORT rsv:3; + USHORT TxBF:1; + USHORT rsv:2; + USHORT STBC:2; //SPACE + USHORT ShortGI:1; + USHORT BW:1; //channel bandwidth 20MHz or 40 MHz + USHORT MCS:7; // MCS + } field; +#else + struct { + USHORT MCS:7; // MCS + USHORT BW:1; //channel bandwidth 20MHz or 40 MHz + USHORT ShortGI:1; + USHORT STBC:2; //SPACE +// USHORT rsv:3; + USHORT rsv:2; + USHORT TxBF:1; + USHORT MODE:2; // Use definition MODE_xxx. + } field; +#endif + USHORT word; + } HTTRANSMIT_SETTING, *PHTTRANSMIT_SETTING; + +typedef enum _RT_802_11_PREAMBLE { + Rt802_11PreambleLong, + Rt802_11PreambleShort, + Rt802_11PreambleAuto +} RT_802_11_PREAMBLE, *PRT_802_11_PREAMBLE; + +typedef enum _RT_802_11_PHY_MODE { + PHY_11BG_MIXED = 0, + PHY_11B, + PHY_11A, + PHY_11ABG_MIXED, + PHY_11G, +#ifdef DOT11_N_SUPPORT + PHY_11ABGN_MIXED, // both band 5 + PHY_11N_2_4G, // 11n-only with 2.4G band 6 + PHY_11GN_MIXED, // 2.4G band 7 + PHY_11AN_MIXED, // 5G band 8 + PHY_11BGN_MIXED, // if check 802.11b. 9 + PHY_11AGN_MIXED, // if check 802.11b. 10 + PHY_11N_5G, // 11n-only with 5G band 11 +#endif // DOT11_N_SUPPORT // +} RT_802_11_PHY_MODE; + + +// put all proprietery for-query objects here to reduce # of Query_OID +typedef struct _RT_802_11_LINK_STATUS { + ULONG CurrTxRate; // in units of 0.5Mbps + ULONG ChannelQuality; // 0..100 % + ULONG TxByteCount; // both ok and fail + ULONG RxByteCount; // both ok and fail + ULONG CentralChannel; // 40MHz central channel number +} RT_802_11_LINK_STATUS, *PRT_802_11_LINK_STATUS; + +typedef struct _RT_802_11_EVENT_LOG { + LARGE_INTEGER SystemTime; // timestammp via NdisGetCurrentSystemTime() + UCHAR Addr[MAC_ADDR_LENGTH]; + USHORT Event; // EVENT_xxx +} RT_802_11_EVENT_LOG, *PRT_802_11_EVENT_LOG; + +typedef struct _RT_802_11_EVENT_TABLE { + ULONG Num; + ULONG Rsv; // to align Log[] at LARGE_INEGER boundary + RT_802_11_EVENT_LOG Log[MAX_NUMBER_OF_EVENT]; +} RT_802_11_EVENT_TABLE, PRT_802_11_EVENT_TABLE; + +// MIMO Tx parameter, ShortGI, MCS, STBC, etc. these are fields in TXWI. Don't change this definition!!! +typedef union _MACHTTRANSMIT_SETTING { + struct { + USHORT MCS:7; // MCS + USHORT BW:1; //channel bandwidth 20MHz or 40 MHz + USHORT ShortGI:1; + USHORT STBC:2; //SPACE + USHORT rsv:3; + USHORT MODE:2; // Use definition MODE_xxx. + } field; + USHORT word; + } MACHTTRANSMIT_SETTING, *PMACHTTRANSMIT_SETTING; + +typedef struct _RT_802_11_MAC_ENTRY { + UCHAR Addr[MAC_ADDR_LENGTH]; + UCHAR Aid; + UCHAR Psm; // 0:PWR_ACTIVE, 1:PWR_SAVE + UCHAR MimoPs; // 0:MMPS_STATIC, 1:MMPS_DYNAMIC, 3:MMPS_Enabled + CHAR AvgRssi0; + CHAR AvgRssi1; + CHAR AvgRssi2; + UINT32 ConnectedTime; + MACHTTRANSMIT_SETTING TxRate; +} RT_802_11_MAC_ENTRY, *PRT_802_11_MAC_ENTRY; + +typedef struct _RT_802_11_MAC_TABLE { + ULONG Num; + RT_802_11_MAC_ENTRY Entry[MAX_NUMBER_OF_MAC]; +} RT_802_11_MAC_TABLE, *PRT_802_11_MAC_TABLE; + +// structure for query/set hardware register - MAC, BBP, RF register +typedef struct _RT_802_11_HARDWARE_REGISTER { + ULONG HardwareType; // 0:MAC, 1:BBP, 2:RF register, 3:EEPROM + ULONG Offset; // Q/S register offset addr + ULONG Data; // R/W data buffer +} RT_802_11_HARDWARE_REGISTER, *PRT_802_11_HARDWARE_REGISTER; + +typedef struct _RT_802_11_AP_CONFIG { + ULONG EnableTxBurst; // 0-disable, 1-enable + ULONG EnableTurboRate; // 0-disable, 1-enable 72/100mbps turbo rate + ULONG IsolateInterStaTraffic; // 0-disable, 1-enable isolation + ULONG HideSsid; // 0-disable, 1-enable hiding + ULONG UseBGProtection; // 0-AUTO, 1-always ON, 2-always OFF + ULONG UseShortSlotTime; // 0-no use, 1-use 9-us short slot time + ULONG Rsv1; // must be 0 + ULONG SystemErrorBitmap; // ignore upon SET, return system error upon QUERY +} RT_802_11_AP_CONFIG, *PRT_802_11_AP_CONFIG; + +// structure to query/set STA_CONFIG +typedef struct _RT_802_11_STA_CONFIG { + ULONG EnableTxBurst; // 0-disable, 1-enable + ULONG EnableTurboRate; // 0-disable, 1-enable 72/100mbps turbo rate + ULONG UseBGProtection; // 0-AUTO, 1-always ON, 2-always OFF + ULONG UseShortSlotTime; // 0-no use, 1-use 9-us short slot time when applicable + ULONG AdhocMode; // 0-11b rates only (WIFI spec), 1 - b/g mixed, 2 - g only + ULONG HwRadioStatus; // 0-OFF, 1-ON, default is 1, Read-Only + ULONG Rsv1; // must be 0 + ULONG SystemErrorBitmap; // ignore upon SET, return system error upon QUERY +} RT_802_11_STA_CONFIG, *PRT_802_11_STA_CONFIG; + +// +// For OID Query or Set about BA structure +// +typedef struct _OID_BACAP_STRUC { + UCHAR RxBAWinLimit; + UCHAR TxBAWinLimit; + UCHAR Policy; // 0: DELAY_BA 1:IMMED_BA (//BA Policy subfiled value in ADDBA frame) 2:BA-not use. other value invalid + UCHAR MpduDensity; // 0: DELAY_BA 1:IMMED_BA (//BA Policy subfiled value in ADDBA frame) 2:BA-not use. other value invalid + UCHAR AmsduEnable; //Enable AMSDU transmisstion + UCHAR AmsduSize; // 0:3839, 1:7935 bytes. UINT MSDUSizeToBytes[] = { 3839, 7935}; + UCHAR MMPSmode; // MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable + BOOLEAN AutoBA; // Auto BA will automatically +} OID_BACAP_STRUC, *POID_BACAP_STRUC; + +typedef struct _RT_802_11_ACL_ENTRY { + UCHAR Addr[MAC_ADDR_LENGTH]; + USHORT Rsv; +} RT_802_11_ACL_ENTRY, *PRT_802_11_ACL_ENTRY; + +typedef struct GNU_PACKED _RT_802_11_ACL { + ULONG Policy; // 0-disable, 1-positive list, 2-negative list + ULONG Num; + RT_802_11_ACL_ENTRY Entry[MAX_NUMBER_OF_ACL]; +} RT_802_11_ACL, *PRT_802_11_ACL; + +typedef struct _RT_802_11_WDS { + ULONG Num; + NDIS_802_11_MAC_ADDRESS Entry[24/*MAX_NUM_OF_WDS_LINK*/]; + ULONG KeyLength; + UCHAR KeyMaterial[32]; +} RT_802_11_WDS, *PRT_802_11_WDS; + +typedef struct _RT_802_11_TX_RATES_ { + UCHAR SupRateLen; + UCHAR SupRate[MAX_LENGTH_OF_SUPPORT_RATES]; + UCHAR ExtRateLen; + UCHAR ExtRate[MAX_LENGTH_OF_SUPPORT_RATES]; +} RT_802_11_TX_RATES, *PRT_802_11_TX_RATES; + + +// Definition of extra information code +#define GENERAL_LINK_UP 0x0 // Link is Up +#define GENERAL_LINK_DOWN 0x1 // Link is Down +#define HW_RADIO_OFF 0x2 // Hardware radio off +#define SW_RADIO_OFF 0x3 // Software radio off +#define AUTH_FAIL 0x4 // Open authentication fail +#define AUTH_FAIL_KEYS 0x5 // Shared authentication fail +#define ASSOC_FAIL 0x6 // Association failed +#define EAP_MIC_FAILURE 0x7 // Deauthencation because MIC failure +#define EAP_4WAY_TIMEOUT 0x8 // Deauthencation on 4-way handshake timeout +#define EAP_GROUP_KEY_TIMEOUT 0x9 // Deauthencation on group key handshake timeout +#define EAP_SUCCESS 0xa // EAP succeed +#define DETECT_RADAR_SIGNAL 0xb // Radar signal occur in current channel +#define EXTRA_INFO_MAX 0xb // Indicate Last OID + +#define EXTRA_INFO_CLEAR 0xffffffff + +// This is OID setting structure. So only GF or MM as Mode. This is valid when our wirelss mode has 802.11n in use. +typedef struct { + RT_802_11_PHY_MODE PhyMode; // + UCHAR TransmitNo; + UCHAR HtMode; //HTMODE_GF or HTMODE_MM + UCHAR ExtOffset; //extension channel above or below + UCHAR MCS; + UCHAR BW; + UCHAR STBC; + UCHAR SHORTGI; + UCHAR rsv; +} OID_SET_HT_PHYMODE, *POID_SET_HT_PHYMODE; + +#ifdef NINTENDO_AP +#define NINTENDO_MAX_ENTRY 16 +#define NINTENDO_SSID_NAME_LN 8 +#define NINTENDO_SSID_NAME "NWCUSBAP" +#define NINTENDO_PROBE_REQ_FLAG_MASK 0x03 +#define NINTENDO_PROBE_REQ_ON 0x01 +#define NINTENDO_PROBE_REQ_SIGNAL 0x02 +#define NINTENDO_PROBE_RSP_ON 0x01 +#define NINTENDO_SSID_NICKNAME_LN 20 + +#define NINTENDO_WEPKEY_LN 13 + +typedef struct _NINTENDO_SSID +{ + UCHAR NINTENDOFixChar[NINTENDO_SSID_NAME_LN]; + UCHAR zero1; + UCHAR registe; + UCHAR ID; + UCHAR zero2; + UCHAR NICKname[NINTENDO_SSID_NICKNAME_LN]; +} RT_NINTENDO_SSID, *PRT_NINTENDO_SSID; + +typedef struct _NINTENDO_ENTRY +{ + UCHAR NICKname[NINTENDO_SSID_NICKNAME_LN]; + UCHAR DS_Addr[ETH_LENGTH_OF_ADDRESS]; + UCHAR registe; + UCHAR UserSpaceAck; +} RT_NINTENDO_ENTRY, *PRT_NINTENDO_ENTRY; + +//RTPRIV_IOCTL_NINTENDO_GET_TABLE +//RTPRIV_IOCTL_NINTENDO_SET_TABLE +typedef struct _NINTENDO_TABLE +{ + UINT number; + RT_NINTENDO_ENTRY entry[NINTENDO_MAX_ENTRY]; +} RT_NINTENDO_TABLE, *PRT_NINTENDO_TABLE; + +//RTPRIV_IOCTL_NINTENDO_SEED_WEPKEY +typedef struct _NINTENDO_SEED_WEPKEY +{ + UCHAR seed[NINTENDO_SSID_NICKNAME_LN]; + UCHAR wepkey[16];//use 13 for 104 bits wep key +} RT_NINTENDO_SEED_WEPKEY, *PRT_NINTENDO_SEED_WEPKEY; +#endif // NINTENDO_AP // + +#ifdef LLTD_SUPPORT +typedef struct _RT_LLTD_ASSOICATION_ENTRY { + UCHAR Addr[ETH_LENGTH_OF_ADDRESS]; + unsigned short MOR; // maximum operational rate + UCHAR phyMode; +} RT_LLTD_ASSOICATION_ENTRY, *PRT_LLTD_ASSOICATION_ENTRY; + +typedef struct _RT_LLTD_ASSOICATION_TABLE { + unsigned int Num; + RT_LLTD_ASSOICATION_ENTRY Entry[MAX_NUMBER_OF_MAC]; +} RT_LLTD_ASSOICATION_TABLE, *PRT_LLTD_ASSOICATION_TABLE; +#endif // LLTD_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT +//rt2860, kathy 2007-0118 +// structure for DLS +typedef struct _RT_802_11_DLS_UI { + USHORT TimeOut; // unit: second , set by UI + USHORT CountDownTimer; // unit: second , used by driver only + NDIS_802_11_MAC_ADDRESS MacAddr; // set by UI + UCHAR Status; // 0: none , 1: wait STAkey, 2: finish DLS setup , set by driver only + BOOLEAN Valid; // 1: valid , 0: invalid , set by UI, use to setup or tear down DLS link +} RT_802_11_DLS_UI, *PRT_802_11_DLS_UI; + +typedef struct _RT_802_11_DLS_INFO { + RT_802_11_DLS_UI Entry[MAX_NUMBER_OF_DLS_ENTRY]; + UCHAR num; +} RT_802_11_DLS_INFO, *PRT_802_11_DLS_INFO; + +typedef enum _RT_802_11_DLS_MODE { + DLS_NONE, + DLS_WAIT_KEY, + DLS_FINISH +} RT_802_11_DLS_MODE; +#endif // QOS_DLS_SUPPORT // + + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT +#define RT_ASSOC_EVENT_FLAG 0x0101 +#define RT_DISASSOC_EVENT_FLAG 0x0102 +#define RT_REQIE_EVENT_FLAG 0x0103 +#define RT_RESPIE_EVENT_FLAG 0x0104 +#define RT_ASSOCINFO_EVENT_FLAG 0x0105 +#define RT_PMKIDCAND_FLAG 0x0106 +#define RT_INTERFACE_DOWN 0x0107 +#define RT_INTERFACE_UP 0x0108 +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + + + +#define MAX_CUSTOM_LEN 128 + +#ifdef CONFIG_STA_SUPPORT +typedef enum _RT_802_11_D_CLIENT_MODE +{ + Rt802_11_D_None, + Rt802_11_D_Flexible, + Rt802_11_D_Strict, +} RT_802_11_D_CLIENT_MODE, *PRT_802_11_D_CLIENT_MODE; +#endif // CONFIG_STA_SUPPORT // + +typedef struct _RT_CHANNEL_LIST_INFO +{ + UCHAR ChannelList[MAX_NUM_OF_CHS]; // list all supported channels for site survey + UCHAR ChannelListNum; // number of channel in ChannelList[] +} RT_CHANNEL_LIST_INFO, *PRT_CHANNEL_LIST_INFO; + +// WSC configured credential +typedef struct _WSC_CREDENTIAL +{ + NDIS_802_11_SSID SSID; // mandatory + USHORT AuthType; // mandatory, 1: open, 2: wpa-psk, 4: shared, 8:wpa, 0x10: wpa2, 0x20: wpa2-psk + USHORT EncrType; // mandatory, 1: none, 2: wep, 4: tkip, 8: aes + UCHAR Key[64]; // mandatory, Maximum 64 byte + USHORT KeyLength; + UCHAR MacAddr[6]; // mandatory, AP MAC address + UCHAR KeyIndex; // optional, default is 1 + UCHAR Rsvd[3]; // Make alignment +} WSC_CREDENTIAL, *PWSC_CREDENTIAL; + +// WSC configured profiles +typedef struct _WSC_PROFILE +{ + UINT ProfileCnt; + UINT ApplyProfileIdx; // add by johnli, fix WPS test plan 5.1.1 + WSC_CREDENTIAL Profile[8]; // Support up to 8 profiles +} WSC_PROFILE, *PWSC_PROFILE; + + + +#endif // _OID_H_ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/os/rt_linux.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/os/rt_linux.h new file mode 100644 index 000000000..0594605a7 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/os/rt_linux.h @@ -0,0 +1,1113 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt_linux.h + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- +*/ + +#ifndef __RT_LINUX_H__ +#define __RT_LINUX_H__ + +#include <linux/module.h> +#include <linux/version.h> +#include <linux/kernel.h> +#include <linux/spinlock.h> +#include <linux/init.h> +#include <linux/string.h> +#include <linux/timer.h> +#include <linux/errno.h> +#include <linux/slab.h> +#include <linux/interrupt.h> +#include <linux/pci.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> +#include <linux/skbuff.h> +#include <linux/ethtool.h> +#include <linux/wireless.h> +#include <linux/proc_fs.h> +#include <linux/delay.h> +#include <linux/if_arp.h> +#include <linux/ctype.h> +#include <linux/vmalloc.h> +#include <linux/usb.h> +#include <linux/wireless.h> +#include <net/iw_handler.h> + +#ifdef INF_AMAZON_PPA +#include <asm/amazon_se/ifx_ppa_interface.h> +#include <asm/amazon_se/ifx_ppa_hook.h> +#endif // INF_AMAZON_PPA // + +// load firmware +#define __KERNEL_SYSCALLS__ +#include <linux/unistd.h> +#include <asm/uaccess.h> +#include <asm/types.h> +#include <asm/unaligned.h> // for get_unaligned() + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) +#define KTHREAD_SUPPORT 1 +#endif + +#ifdef KTHREAD_SUPPORT +#include <linux/err.h> +#include <linux/kthread.h> +#endif // KTHREAD_SUPPORT // + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#include <linux/pid.h> +#endif + +#ifdef RT_CFG80211_SUPPORT +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28)) +#include <net/mac80211.h> +#define EXT_BUILD_CHANNEL_LIST /* must define with CRDA */ +#else // LINUX_VERSION_CODE // +#undef RT_CFG80211_SUPPORT +#endif // LINUX_VERSION_CODE // +#endif // RT_CFG80211_SUPPORT // + +#undef AP_WSC_INCLUDED +#undef STA_WSC_INCLUDED +#undef WSC_INCLUDED + + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + +#ifdef KTHREAD_SUPPORT +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) +#error "This kerne version doesn't support kthread!!" +#endif +#endif // KTHREAD_SUPPORT // + + +/*********************************************************************************** + * Profile related sections + ***********************************************************************************/ + + +#ifdef CONFIG_STA_SUPPORT +#ifdef RTMP_MAC_PCI +#define STA_PROFILE_PATH "/etc/Wireless/RT3060STA/RT3060STA.dat" +#define STA_DRIVER_VERSION "2.3.0.0-alpha20100128" +#ifdef MULTIPLE_CARD_SUPPORT +#define CARD_INFO_PATH "/etc/Wireless/RT3060STA/RT3060STACard.dat" +#endif // MULTIPLE_CARD_SUPPORT // +#endif // RTMP_MAC_PCI // + + + +extern const struct iw_handler_def rt28xx_iw_handler_def; +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_APSTA_MIXED_SUPPORT +extern const struct iw_handler_def rt28xx_ap_iw_handler_def; +#endif // CONFIG_APSTA_MIXED_SUPPORT // + +/*********************************************************************************** + * Compiler related definitions + ***********************************************************************************/ +#undef __inline +#define __inline static inline +#define IN +#define OUT +#define INOUT +#define NDIS_STATUS INT + + +/*********************************************************************************** + * OS Specific definitions and data structures + ***********************************************************************************/ +typedef struct pci_dev * PPCI_DEV; +typedef struct net_device * PNET_DEV; +typedef void * PNDIS_PACKET; +typedef char NDIS_PACKET; +typedef PNDIS_PACKET * PPNDIS_PACKET; +typedef dma_addr_t NDIS_PHYSICAL_ADDRESS; +typedef dma_addr_t * PNDIS_PHYSICAL_ADDRESS; +typedef void * NDIS_HANDLE; +typedef char * PNDIS_BUFFER; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +typedef struct pid * RTMP_OS_PID; +#else +typedef pid_t RTMP_OS_PID; +#endif + +typedef struct semaphore RTMP_OS_SEM; + +typedef int (*HARD_START_XMIT_FUNC)(struct sk_buff *skb, struct net_device *net_dev); + +#ifdef RTMP_MAC_PCI +#ifndef PCI_DEVICE +#define PCI_DEVICE(vend,dev) \ + .vendor = (vend), .device = (dev), \ + .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID +#endif // PCI_DEVICE // +#endif // RTMP_MAC_PCI // + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +#define RT_MOD_INC_USE_COUNT() \ + if (!try_module_get(THIS_MODULE)) \ + { \ + DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot reserve module\n", __FUNCTION__)); \ + return -1; \ + } + +#define RT_MOD_DEC_USE_COUNT() module_put(THIS_MODULE); +#else +#define RT_MOD_INC_USE_COUNT() MOD_INC_USE_COUNT; +#define RT_MOD_DEC_USE_COUNT() MOD_DEC_USE_COUNT; +#endif + +#define RTMP_INC_REF(_A) 0 +#define RTMP_DEC_REF(_A) 0 +#define RTMP_GET_REF(_A) 0 + + +#if WIRELESS_EXT >= 12 +// This function will be called when query /proc +struct iw_statistics *rt28xx_get_wireless_stats( + IN struct net_device *net_dev); +#endif + + +/*********************************************************************************** + * Network related constant definitions + ***********************************************************************************/ +#ifndef IFNAMSIZ +#define IFNAMSIZ 16 +#endif + +#define ETH_LENGTH_OF_ADDRESS 6 + +#define NDIS_STATUS_SUCCESS 0x00 +#define NDIS_STATUS_FAILURE 0x01 +#define NDIS_STATUS_INVALID_DATA 0x02 +#define NDIS_STATUS_RESOURCES 0x03 + +#define NDIS_SET_PACKET_STATUS(_p, _status) do{} while(0) +#define NdisWriteErrorLogEntry(_a, _b, _c, _d) do{} while(0) + +/* statistics counter */ +#define STATS_INC_RX_PACKETS(_pAd, _dev) +#define STATS_INC_TX_PACKETS(_pAd, _dev) + +#define STATS_INC_RX_BYTESS(_pAd, _dev, len) +#define STATS_INC_TX_BYTESS(_pAd, _dev, len) + +#define STATS_INC_RX_ERRORS(_pAd, _dev) +#define STATS_INC_TX_ERRORS(_pAd, _dev) + +#define STATS_INC_RX_DROPPED(_pAd, _dev) +#define STATS_INC_TX_DROPPED(_pAd, _dev) + + +/*********************************************************************************** + * Ralink Specific network related constant definitions + ***********************************************************************************/ +#define MIN_NET_DEVICE_FOR_AID 0x00 //0x00~0x3f +#define MIN_NET_DEVICE_FOR_MBSSID 0x00 //0x00,0x10,0x20,0x30 +#define MIN_NET_DEVICE_FOR_WDS 0x10 //0x40,0x50,0x60,0x70 +#define MIN_NET_DEVICE_FOR_APCLI 0x20 +#define MIN_NET_DEVICE_FOR_MESH 0x30 +#ifdef CONFIG_STA_SUPPORT +#define MIN_NET_DEVICE_FOR_DLS 0x40 +#define MIN_NET_DEVICE_FOR_TDLS 0x80 +#endif // CONFIG_STA_SUPPORT // +#define NET_DEVICE_REAL_IDX_MASK 0x0f // for each operation mode, we maximum support 15 entities. + + +#ifdef CONFIG_STA_SUPPORT +#define NDIS_PACKET_TYPE_DIRECTED 0 +#define NDIS_PACKET_TYPE_MULTICAST 1 +#define NDIS_PACKET_TYPE_BROADCAST 2 +#define NDIS_PACKET_TYPE_ALL_MULTICAST 3 +#define NDIS_PACKET_TYPE_PROMISCUOUS 4 +#endif // CONFIG_STA_SUPPORT // + + +/*********************************************************************************** + * OS signaling related constant definitions + ***********************************************************************************/ + + +/*********************************************************************************** + * OS file operation related data structure definitions + ***********************************************************************************/ +typedef struct file* RTMP_OS_FD; + +typedef struct _RTMP_OS_FS_INFO_ +{ + int fsuid; + int fsgid; + mm_segment_t fs; +}RTMP_OS_FS_INFO; + +#define IS_FILE_OPEN_ERR(_fd) IS_ERR((_fd)) + + +/*********************************************************************************** + * OS semaphore related data structure and definitions + ***********************************************************************************/ +struct os_lock { + spinlock_t lock; + unsigned long flags; +}; + +typedef spinlock_t NDIS_SPIN_LOCK; + +// +// spin_lock enhanced for Nested spin lock +// +#define NdisAllocateSpinLock(__lock) \ +{ \ + spin_lock_init((spinlock_t *)(__lock)); \ +} + +#define NdisFreeSpinLock(lock) \ + do{}while(0) + + +#define RTMP_SEM_LOCK(__lock) \ +{ \ + spin_lock_bh((spinlock_t *)(__lock)); \ +} + +#define RTMP_SEM_UNLOCK(__lock) \ +{ \ + spin_unlock_bh((spinlock_t *)(__lock)); \ +} + + +// sample, use semaphore lock to replace IRQ lock, 2007/11/15 +#define RTMP_IRQ_LOCK(__lock, __irqflags) \ +{ \ + __irqflags = 0; \ + spin_lock_bh((spinlock_t *)(__lock)); \ + pAd->irq_disabled |= 1; \ +} + +#define RTMP_IRQ_UNLOCK(__lock, __irqflag) \ +{ \ + pAd->irq_disabled &= 0; \ + spin_unlock_bh((spinlock_t *)(__lock)); \ +} + +#define RTMP_INT_LOCK(__lock, __irqflags) \ +{ \ + spin_lock_irqsave((spinlock_t *)__lock, __irqflags); \ +} + +#define RTMP_INT_UNLOCK(__lock, __irqflag) \ +{ \ + spin_unlock_irqrestore((spinlock_t *)(__lock), ((unsigned long)__irqflag)); \ +} + +#define NdisAcquireSpinLock RTMP_SEM_LOCK +#define NdisReleaseSpinLock RTMP_SEM_UNLOCK + +#ifndef wait_event_interruptible_timeout +#define __wait_event_interruptible_timeout(wq, condition, ret) \ +do { \ + wait_queue_t __wait; \ + init_waitqueue_entry(&__wait, current); \ + add_wait_queue(&wq, &__wait); \ + for (;;) { \ + set_current_state(TASK_INTERRUPTIBLE); \ + if (condition) \ + break; \ + if (!signal_pending(current)) { \ + ret = schedule_timeout(ret); \ + if (!ret) \ + break; \ + continue; \ + } \ + ret = -ERESTARTSYS; \ + break; \ + } \ + current->state = TASK_RUNNING; \ + remove_wait_queue(&wq, &__wait); \ +} while (0) + +#define wait_event_interruptible_timeout(wq, condition, timeout) \ +({ \ + long __ret = timeout; \ + if (!(condition)) \ + __wait_event_interruptible_timeout(wq, condition, __ret); \ + __ret; \ +}) +#endif + +#define RTMP_SEM_EVENT_INIT_LOCKED(_pSema) sema_init((_pSema), 0) +#define RTMP_SEM_EVENT_INIT(_pSema) sema_init((_pSema), 1) +#define RTMP_SEM_EVENT_DESTORY(_pSema) do{}while(0) +#define RTMP_SEM_EVENT_WAIT(_pSema, _status) ((_status) = down_interruptible((_pSema))) +#define RTMP_SEM_EVENT_UP(_pSema) up(_pSema) + +#ifdef KTHREAD_SUPPORT +#define RTMP_WAIT_EVENT_INTERRUPTIBLE(_pAd, _pTask) \ +{ \ + wait_event_interruptible(_pTask->kthread_q, \ + _pTask->kthread_running || kthread_should_stop()); \ + _pTask->kthread_running = FALSE; \ + if (kthread_should_stop()) \ + { \ + RTMP_SET_FLAG(_pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); \ + break; \ + } \ +} +#endif + +#ifdef KTHREAD_SUPPORT +#define WAKE_UP(_pTask) \ + do{ \ + if ((_pTask)->kthread_task) \ + { \ + (_pTask)->kthread_running = TRUE; \ + wake_up(&(_pTask)->kthread_q); \ + } \ + }while(0) +#endif + +/*********************************************************************************** + * OS Memory Access related data structure and definitions + ***********************************************************************************/ +#define MEM_ALLOC_FLAG (GFP_ATOMIC) //(GFP_DMA | GFP_ATOMIC) + +#define NdisMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length) +#define NdisCopyMemory(Destination, Source, Length) memcpy(Destination, Source, Length) +#define NdisZeroMemory(Destination, Length) memset(Destination, 0, Length) +#define NdisFillMemory(Destination, Length, Fill) memset(Destination, Fill, Length) +#define NdisCmpMemory(Destination, Source, Length) memcmp(Destination, Source, Length) +#define NdisEqualMemory(Source1, Source2, Length) (!memcmp(Source1, Source2, Length)) +#define RTMPEqualMemory(Source1, Source2, Length) (!memcmp(Source1, Source2, Length)) + +#define MlmeAllocateMemory(_pAd, _ppVA) os_alloc_mem(_pAd, _ppVA, MGMT_DMA_BUFFER_SIZE) +#define MlmeFreeMemory(_pAd, _pVA) os_free_mem(_pAd, _pVA) + +#define COPY_MAC_ADDR(Addr1, Addr2) memcpy((Addr1), (Addr2), MAC_ADDR_LEN) + + +/*********************************************************************************** + * OS task related data structure and definitions + ***********************************************************************************/ +#define RTMP_OS_MGMT_TASK_FLAGS CLONE_VM + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +typedef struct pid * THREAD_PID; +#define THREAD_PID_INIT_VALUE NULL +// TODO: Use this IOCTL carefully when linux kernel version larger than 2.6.27, because the PID only correct when the user space task do this ioctl itself. +//#define RTMP_GET_OS_PID(_x, _y) _x = get_task_pid(current, PIDTYPE_PID); +#define RTMP_GET_OS_PID(_x, _y) do{rcu_read_lock(); _x=current->pids[PIDTYPE_PID].pid; rcu_read_unlock();}while(0) +#define GET_PID_NUMBER(_v) pid_nr((_v)) +#define CHECK_PID_LEGALITY(_pid) if (pid_nr((_pid)) > 0) +#define KILL_THREAD_PID(_A, _B, _C) kill_pid((_A), (_B), (_C)) +#else +typedef pid_t THREAD_PID; +#define THREAD_PID_INIT_VALUE -1 +#define RTMP_GET_OS_PID(_x, _pid) _x = _pid +#define GET_PID_NUMBER(_v) (_v) +#define CHECK_PID_LEGALITY(_pid) if ((_pid) >= 0) +#define KILL_THREAD_PID(_A, _B, _C) kill_proc((_A), (_B), (_C)) +#endif + +typedef int (*RTMP_OS_TASK_CALLBACK)(void *data); +typedef struct tasklet_struct RTMP_NET_TASK_STRUCT; +typedef struct tasklet_struct *PRTMP_NET_TASK_STRUCT; + + +/*********************************************************************************** + * Timer related definitions and data structures. + **********************************************************************************/ +#define OS_HZ HZ + +typedef struct timer_list NDIS_MINIPORT_TIMER; +typedef struct timer_list RTMP_OS_TIMER; +typedef void (*TIMER_FUNCTION)(unsigned long); + + +#define OS_WAIT(_time) \ +{ \ + if (in_interrupt()) \ + {\ + RTMPusecDelay(_time * 1000);\ + }else \ + {\ + int _i; \ + long _loop = ((_time)/(1000/OS_HZ)) > 0 ? ((_time)/(1000/OS_HZ)) : 1;\ + wait_queue_head_t _wait; \ + init_waitqueue_head(&_wait); \ + for (_i=0; _i<(_loop); _i++) \ + wait_event_interruptible_timeout(_wait, 0, ONE_TICK); \ + }\ +} + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +#define RTMP_TIME_AFTER(a,b) \ + (typecheck(unsigned long, (unsigned long)a) && \ + typecheck(unsigned long, (unsigned long)b) && \ + ((long)(b) - (long)(a) < 0)) + +#define RTMP_TIME_AFTER_EQ(a,b) \ + (typecheck(unsigned long, (unsigned long)a) && \ + typecheck(unsigned long, (unsigned long)b) && \ + ((long)(a) - (long)(b) >= 0)) +#define RTMP_TIME_BEFORE(a,b) RTMP_TIME_AFTER_EQ(b,a) +#else +#define typecheck(type,x) \ +({ type __dummy; \ + typeof(x) __dummy2; \ + (void)(&__dummy == &__dummy2); \ + 1; \ +}) +#define RTMP_TIME_AFTER_EQ(a,b) \ + (typecheck(unsigned long, (unsigned long)a) && \ + typecheck(unsigned long, (unsigned long)b) && \ + ((long)(a) - (long)(b) >= 0)) +#define RTMP_TIME_BEFORE(a,b) RTMP_TIME_AFTER_EQ(b,a) +#define RTMP_TIME_AFTER(a,b) time_after(a, b) +#endif + +#define ONE_TICK 1 + +static inline void NdisGetSystemUpTime(ULONG *time) +{ + *time = jiffies; +} + + +/*********************************************************************************** + * OS specific cookie data structure binding to RTMP_ADAPTER + ***********************************************************************************/ + +struct os_cookie { +#ifdef RTMP_MAC_PCI + struct pci_dev *pci_dev; + struct pci_dev *parent_pci_dev; + USHORT DeviceID; + dma_addr_t pAd_pa; +#endif // RTMP_MAC_PCI // + + + RTMP_NET_TASK_STRUCT rx_done_task; + RTMP_NET_TASK_STRUCT mgmt_dma_done_task; + RTMP_NET_TASK_STRUCT ac0_dma_done_task; + RTMP_NET_TASK_STRUCT ac1_dma_done_task; + RTMP_NET_TASK_STRUCT ac2_dma_done_task; + RTMP_NET_TASK_STRUCT ac3_dma_done_task; + RTMP_NET_TASK_STRUCT hcca_dma_done_task; + RTMP_NET_TASK_STRUCT tbtt_task; +#ifdef RTMP_MAC_PCI + RTMP_NET_TASK_STRUCT fifo_statistic_full_task; +#endif // RTMP_MAC_PCI // + + + + RTMP_OS_PID apd_pid; //802.1x daemon pid + unsigned long apd_pid_nr; + INT ioctl_if_type; + INT ioctl_if; +}; + +typedef struct os_cookie * POS_COOKIE; + + + +/*********************************************************************************** + * OS debugging and printing related definitions and data structure + ***********************************************************************************/ +#define PRINT_MAC(addr) \ + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5] + +#ifdef DBG +extern ULONG RTDebugLevel; + +#define DBGPRINT_RAW(Level, Fmt) \ +do{ \ + if (Level <= RTDebugLevel) \ + { \ + printk Fmt; \ + } \ +}while(0) + +#define DBGPRINT(Level, Fmt) DBGPRINT_RAW(Level, Fmt) + + +#define DBGPRINT_ERR(Fmt) \ +{ \ + printk("ERROR!!! "); \ + printk Fmt; \ +} + +#define DBGPRINT_S(Status, Fmt) \ +{ \ + printk Fmt; \ +} +#else +#define DBGPRINT(Level, Fmt) +#define DBGPRINT_RAW(Level, Fmt) +#define DBGPRINT_S(Status, Fmt) +#define DBGPRINT_ERR(Fmt) +#endif + +#undef ASSERT + +#ifdef VENDOR_FEATURE3_SUPPORT +#define ASSERT(x) + +#else +#define ASSERT(x) \ +{ \ + if (!(x)) \ + { \ + printk(KERN_WARNING __FILE__ ":%d assert " #x "failed\n", __LINE__); \ + } \ +} +#endif // VENDOR_FEATURE3_SUPPORT // + +void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen); + + +/********************************************************************************************************* + The following code are not revised, temporary put it here. + *********************************************************************************************************/ + + +/*********************************************************************************** + * Device DMA Access related definitions and data structures. + **********************************************************************************/ +#ifdef RTMP_MAC_PCI +dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx, int direction); +void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int direction); + +#define PCI_MAP_SINGLE(_handle, _ptr, _size, _sd_idx, _dir) \ + linux_pci_map_single(_handle, _ptr, _size, _sd_idx, _dir) + +#define PCI_UNMAP_SINGLE(_handle, _ptr, _size, _dir) \ + linux_pci_unmap_single(_handle, _ptr, _size, _dir) + +#define PCI_ALLOC_CONSISTENT(_pci_dev, _size, _ptr) \ + pci_alloc_consistent(_pci_dev, _size, _ptr) + +#define PCI_FREE_CONSISTENT(_pci_dev, _size, _virtual_addr, _physical_addr) \ + pci_free_consistent(_pci_dev, _size, _virtual_addr, _physical_addr) +#endif // RTMP_MAC_PCI // + +#ifdef VENDOR_FEATURE2_SUPPORT +#define DEV_ALLOC_SKB(_pAd, _Pkt, _length) \ + _Pkt = dev_alloc_skb(_length); \ + if (_Pkt != NULL) _pAd->NumOfPktAlloc ++; +#else + +#define DEV_ALLOC_SKB(_pAd, _Pkt, _length) \ + _Pkt = dev_alloc_skb(_length); +#endif // VENDOR_FEATURE2_SUPPORT // + + + +/* + * ULONG + * RTMP_GetPhysicalAddressLow( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + */ +#define RTMP_GetPhysicalAddressLow(PhysicalAddress) (PhysicalAddress) + +/* + * ULONG + * RTMP_GetPhysicalAddressHigh( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + */ +#define RTMP_GetPhysicalAddressHigh(PhysicalAddress) (0) + +/* + * VOID + * RTMP_SetPhysicalAddressLow( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, + * IN ULONG Value); + */ +#define RTMP_SetPhysicalAddressLow(PhysicalAddress, Value) \ + PhysicalAddress = Value; + +/* + * VOID + * RTMP_SetPhysicalAddressHigh( + * IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, + * IN ULONG Value); + */ +#define RTMP_SetPhysicalAddressHigh(PhysicalAddress, Value) + +#define NdisMIndicateStatus(_w, _x, _y, _z) + + + +/*********************************************************************************** + * Device Register I/O Access related definitions and data structures. + **********************************************************************************/ +#ifdef RTMP_MAC_PCI +#if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(INF_AR9) || defined(IKANOS_VX_1X0) +//Patch for ASIC turst read/write bug, needs to remove after metel fix +#define RTMP_IO_READ32(_A, _R, _pV) \ +{ \ + if ((_A)->bPCIclkOff == FALSE) \ + { \ + (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \ + (*_pV = readl((void *)((_A)->CSRBaseAddress + (_R)))); \ + (*_pV = SWAP32(*((UINT32 *)(_pV)))); \ + } \ +} + +#define RTMP_IO_READ8(_A, _R, _pV) \ +{ \ + (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \ + (*_pV = readb((void *)((_A)->CSRBaseAddress + (_R)))); \ +} + +#ifndef VENDOR_FEATURE3_SUPPORT +#define RTMP_IO_WRITE32(_A, _R, _V) \ +{ \ + if ((_A)->bPCIclkOff == FALSE) \ + { \ + UINT32 _Val; \ + _Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)); \ + _Val = SWAP32(_V); \ + writel(_Val, (void *)((_A)->CSRBaseAddress + (_R))); \ + } \ +} +#endif // VENDOR_FEATURE3_SUPPORT // + +#define RTMP_IO_WRITE8(_A, _R, _V) \ +{ \ + UINT Val; \ + Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)); \ + writeb((_V), (PUCHAR)((_A)->CSRBaseAddress + (_R))); \ +} + +#define RTMP_IO_WRITE16(_A, _R, _V) \ +{ \ + UINT Val; \ + Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)); \ + writew(SWAP16((_V)), (PUSHORT)((_A)->CSRBaseAddress + (_R))); \ +} +#else +//Patch for ASIC turst read/write bug, needs to remove after metel fix +#define RTMP_IO_READ32(_A, _R, _pV) \ +{ \ + if ((_A)->bPCIclkOff == FALSE) \ + { \ + (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \ + (*_pV = readl((void *)((_A)->CSRBaseAddress + (_R)))); \ + } \ + else \ + *_pV = 0; \ +} + +#define RTMP_IO_FORCE_READ32(_A, _R, _pV) \ +{ \ + (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \ + (*_pV = readl((void *)((_A)->CSRBaseAddress + (_R)))); \ +} + +#define RTMP_IO_READ8(_A, _R, _pV) \ +{ \ + (*_pV = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0))); \ + (*_pV = readb((void *)((_A)->CSRBaseAddress + (_R)))); \ +} + +#ifndef VENDOR_FEATURE3_SUPPORT +#define RTMP_IO_WRITE32(_A, _R, _V) \ +{ \ + if ((_A)->bPCIclkOff == FALSE) \ + { \ + UINT Val; \ + Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)); \ + writel((_V), (void *)((_A)->CSRBaseAddress + (_R))); \ + } \ +} +#endif // VENDOR_FEATURE3_SUPPORT // + +#define RTMP_IO_FORCE_WRITE32(_A, _R, _V) \ +{ \ + UINT Val; \ + Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)); \ + writel(_V, (void *)((_A)->CSRBaseAddress + (_R))); \ +} + + + +#if defined(BRCM_6358) || defined(RALINK_2880) || defined(RALINK_3052) || defined(RALINK_2883) +#define RTMP_IO_WRITE8(_A, _R, _V) \ +{ \ + ULONG Val; \ + UCHAR _i; \ + _i = ((_R) & 0x3); \ + Val = readl((void *)((_A)->CSRBaseAddress + ((_R) - _i))); \ + Val = Val & (~(0x000000ff << ((_i)*8))); \ + Val = Val | ((ULONG)(_V) << ((_i)*8)); \ + writel((Val), (void *)((_A)->CSRBaseAddress + ((_R) - _i))); \ +} +#else +#define RTMP_IO_WRITE8(_A, _R, _V) \ +{ \ + UINT Val; \ + Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)); \ + writeb((_V), (PUCHAR)((_A)->CSRBaseAddress + (_R))); \ +} +#endif // #if defined(BRCM_6358) || defined(RALINK_2880) // + +#define RTMP_IO_WRITE16(_A, _R, _V) \ +{ \ + UINT Val; \ + Val = readl((void *)((_A)->CSRBaseAddress + MAC_CSR0)); \ + writew((_V), (PUSHORT)((_A)->CSRBaseAddress + (_R))); \ +} +#endif // #if defined(INF_TWINPASS) || defined(INF_DANUBE) || defined(IKANOS_VX_1X0) // +#endif // RTMP_MAC_PCI // + + + +/*********************************************************************************** + * Network Related data structure and marco definitions + ***********************************************************************************/ +#define PKTSRC_NDIS 0x7f +#define PKTSRC_DRIVER 0x0f + +#define RTMP_OS_NETDEV_STATE_RUNNING(_pNetDev) ((_pNetDev)->flags & IFF_UP) + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) +#define RTMP_OS_NETDEV_GET_PRIV(_pNetDev) ((_pNetDev)->ml_priv) +#define RTMP_OS_NETDEV_SET_PRIV(_pNetDev, _pPriv) ((_pNetDev)->ml_priv = (_pPriv)) +#else +#define RTMP_OS_NETDEV_GET_PRIV(_pNetDev) ((_pNetDev)->priv) +#define RTMP_OS_NETDEV_SET_PRIV(_pNetDev, _pPriv) ((_pNetDev)->priv = (_pPriv)) +#endif +#define RTMP_OS_NETDEV_GET_DEVNAME(_pNetDev) ((_pNetDev)->name) +#define RTMP_OS_NETDEV_GET_PHYADDR(_PNETDEV) ((_PNETDEV)->dev_addr) + +#define RTMP_OS_NETDEV_START_QUEUE(_pNetDev) netif_start_queue((_pNetDev)) +#define RTMP_OS_NETDEV_STOP_QUEUE(_pNetDev) netif_stop_queue((_pNetDev)) +#define RTMP_OS_NETDEV_WAKE_QUEUE(_pNetDev) netif_wake_queue((_pNetDev)) +#define RTMP_OS_NETDEV_CARRIER_OFF(_pNetDev) netif_carrier_off((_pNetDev)) + +#define QUEUE_ENTRY_TO_PACKET(pEntry) \ + (PNDIS_PACKET)(pEntry) + +#define PACKET_TO_QUEUE_ENTRY(pPacket) \ + (PQUEUE_ENTRY)(pPacket) + +#ifdef CONFIG_5VT_ENHANCE +#define BRIDGE_TAG 0x35564252 // depends on 5VT define in br_input.c +#endif + +#define GET_SG_LIST_FROM_PACKET(_p, _sc) \ + rt_get_sg_list_from_packet(_p, _sc) + +#define RELEASE_NDIS_PACKET(_pAd, _pPacket, _Status) \ +{ \ + RTMPFreeNdisPacket(_pAd, _pPacket); \ +} + +/* + * packet helper + * - convert internal rt packet to os packet or + * os packet to rt packet + */ +#define RTPKT_TO_OSPKT(_p) ((struct sk_buff *)(_p)) +#define OSPKT_TO_RTPKT(_p) ((PNDIS_PACKET)(_p)) + +#define GET_OS_PKT_DATAPTR(_pkt) \ + (RTPKT_TO_OSPKT(_pkt)->data) +#define SET_OS_PKT_DATAPTR(_pkt, _dataPtr) \ + (RTPKT_TO_OSPKT(_pkt)->data) = (_dataPtr) + +#define GET_OS_PKT_LEN(_pkt) \ + (RTPKT_TO_OSPKT(_pkt)->len) +#define SET_OS_PKT_LEN(_pkt, _len) \ + (RTPKT_TO_OSPKT(_pkt)->len) = (_len) + +#define GET_OS_PKT_DATATAIL(_pkt) \ + (RTPKT_TO_OSPKT(_pkt)->tail) +#define SET_OS_PKT_DATATAIL(_pkt, _start, _len) \ + ((RTPKT_TO_OSPKT(_pkt))->tail) = (PUCHAR)((_start) + (_len)) + +#define GET_OS_PKT_HEAD(_pkt) \ + (RTPKT_TO_OSPKT(_pkt)->head) + +#define GET_OS_PKT_END(_pkt) \ + (RTPKT_TO_OSPKT(_pkt)->end) + +#define GET_OS_PKT_NETDEV(_pkt) \ + (RTPKT_TO_OSPKT(_pkt)->dev) +#define SET_OS_PKT_NETDEV(_pkt, _pNetDev) \ + (RTPKT_TO_OSPKT(_pkt)->dev) = (_pNetDev) + +#define GET_OS_PKT_TYPE(_pkt) \ + (RTPKT_TO_OSPKT(_pkt)) + +#define GET_OS_PKT_NEXT(_pkt) \ + (RTPKT_TO_OSPKT(_pkt)->next) + + +#define OS_PKT_CLONED(_pkt) skb_cloned(RTPKT_TO_OSPKT(_pkt)) + +#ifdef VENDOR_FEATURE2_SUPPORT +#define OS_PKT_CLONE(_pAd, _pkt, _src, _flag) \ + _src = skb_clone(RTPKT_TO_OSPKT(_pkt), _flag); \ + if (_src != NULL) _pAd->NumOfPktAlloc ++; +#else + +#define OS_PKT_CLONE(_pAd, _pkt, _src, _flag) \ + _src = skb_clone(RTPKT_TO_OSPKT(_pkt), _flag); +#endif // VENDOR_FEATURE2_SUPPORT // + +#define OS_NTOHS(_Val) \ + (ntohs(_Val)) +#define OS_HTONS(_Val) \ + (htons(_Val)) +#define OS_NTOHL(_Val) \ + (ntohl(_Val)) +#define OS_HTONL(_Val) \ + (htonl(_Val)) + +#define CB_OFF 10 + +// User Priority +#define RTMP_SET_PACKET_UP(_p, _prio) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+0] = _prio) +#define RTMP_GET_PACKET_UP(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+0]) + +// Fragment # +#define RTMP_SET_PACKET_FRAGMENTS(_p, _num) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+1] = _num) +#define RTMP_GET_PACKET_FRAGMENTS(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+1]) + +// 0x0 ~0x7f: TX to AP's own BSS which has the specified AID. if AID>127, set bit 7 in RTMP_SET_PACKET_EMACTAB too. +//(this value also as MAC(on-chip WCID) table index) +// 0x80~0xff: TX to a WDS link. b0~6: WDS index +#define RTMP_SET_PACKET_WCID(_p, _wdsidx) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+2] = _wdsidx) +#define RTMP_GET_PACKET_WCID(_p) ((UCHAR)(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+2])) + +// 0xff: PKTSRC_NDIS, others: local TX buffer index. This value affects how to a packet +#define RTMP_SET_PACKET_SOURCE(_p, _pktsrc) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+3] = _pktsrc) +#define RTMP_GET_PACKET_SOURCE(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+3]) + +// RTS/CTS-to-self protection method +#define RTMP_SET_PACKET_RTS(_p, _num) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+4] = _num) +#define RTMP_GET_PACKET_RTS(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+4]) +// see RTMP_S(G)ET_PACKET_EMACTAB + +// TX rate index +#define RTMP_SET_PACKET_TXRATE(_p, _rate) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+5] = _rate) +#define RTMP_GET_PACKET_TXRATE(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+5]) + +// From which Interface +#define RTMP_SET_PACKET_IF(_p, _ifdx) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+6] = _ifdx) +#define RTMP_GET_PACKET_IF(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+6]) +#define RTMP_SET_PACKET_NET_DEVICE_MBSSID(_p, _bss) RTMP_SET_PACKET_IF((_p), (_bss)) +#define RTMP_SET_PACKET_NET_DEVICE_WDS(_p, _bss) RTMP_SET_PACKET_IF((_p), ((_bss) + MIN_NET_DEVICE_FOR_WDS)) +#define RTMP_SET_PACKET_NET_DEVICE_APCLI(_p, _idx) RTMP_SET_PACKET_IF((_p), ((_idx) + MIN_NET_DEVICE_FOR_APCLI)) +#define RTMP_SET_PACKET_NET_DEVICE_MESH(_p, _idx) RTMP_SET_PACKET_IF((_p), ((_idx) + MIN_NET_DEVICE_FOR_MESH)) +#define RTMP_GET_PACKET_NET_DEVICE_MBSSID(_p) RTMP_GET_PACKET_IF((_p)) +#define RTMP_GET_PACKET_NET_DEVICE(_p) RTMP_GET_PACKET_IF((_p)) + +#define RTMP_SET_PACKET_MOREDATA(_p, _morebit) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+7] = _morebit) +#define RTMP_GET_PACKET_MOREDATA(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+7]) + + + + + +// +// Sepcific Pakcet Type definition +// +#define RTMP_PACKET_SPECIFIC_CB_OFFSET 11 + +#define RTMP_PACKET_SPECIFIC_DHCP 0x01 +#define RTMP_PACKET_SPECIFIC_EAPOL 0x02 +#define RTMP_PACKET_SPECIFIC_IPV4 0x04 +#define RTMP_PACKET_SPECIFIC_WAI 0x08 +#define RTMP_PACKET_SPECIFIC_VLAN 0x10 +#define RTMP_PACKET_SPECIFIC_LLCSNAP 0x20 + +//Specific +#define RTMP_SET_PACKET_SPECIFIC(_p, _flg) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] = _flg) + +//DHCP +#define RTMP_SET_PACKET_DHCP(_p, _flg) \ + do{ \ + if (_flg) \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_DHCP); \ + else \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (!RTMP_PACKET_SPECIFIC_DHCP); \ + }while(0) +#define RTMP_GET_PACKET_DHCP(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_DHCP) + +//EAPOL +#define RTMP_SET_PACKET_EAPOL(_p, _flg) \ + do{ \ + if (_flg) \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_EAPOL); \ + else \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (!RTMP_PACKET_SPECIFIC_EAPOL); \ + }while(0) +#define RTMP_GET_PACKET_EAPOL(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_EAPOL) + +//WAI +#define RTMP_SET_PACKET_WAI(_p, _flg) \ + do{ \ + if (_flg) \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_WAI); \ + else \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (!RTMP_PACKET_SPECIFIC_WAI); \ + }while(0) +#define RTMP_GET_PACKET_WAI(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_WAI) + +#define RTMP_GET_PACKET_LOWRATE(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & (RTMP_PACKET_SPECIFIC_EAPOL | RTMP_PACKET_SPECIFIC_DHCP | RTMP_PACKET_SPECIFIC_WAI)) + +//VLAN +#define RTMP_SET_PACKET_VLAN(_p, _flg) \ + do{ \ + if (_flg) \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_VLAN); \ + else \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (!RTMP_PACKET_SPECIFIC_VLAN); \ + }while(0) +#define RTMP_GET_PACKET_VLAN(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_VLAN) + +//LLC/SNAP +#define RTMP_SET_PACKET_LLCSNAP(_p, _flg) \ + do{ \ + if (_flg) \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_LLCSNAP); \ + else \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (!RTMP_PACKET_SPECIFIC_LLCSNAP); \ + }while(0) + +#define RTMP_GET_PACKET_LLCSNAP(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_LLCSNAP) + +// IP +#define RTMP_SET_PACKET_IPV4(_p, _flg) \ + do{ \ + if (_flg) \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) |= (RTMP_PACKET_SPECIFIC_IPV4); \ + else \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11]) &= (!RTMP_PACKET_SPECIFIC_IPV4); \ + }while(0) + +#define RTMP_GET_PACKET_IPV4(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+11] & RTMP_PACKET_SPECIFIC_IPV4) + + +// If this flag is set, it indicates that this EAPoL frame MUST be clear. +#define RTMP_SET_PACKET_CLEAR_EAP_FRAME(_p, _flg) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+12] = _flg) +#define RTMP_GET_PACKET_CLEAR_EAP_FRAME(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+12]) + + + +/* use bit3 of cb[CB_OFF+16] */ + +#define RTMP_SET_PACKET_5VT(_p, _flg) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+22] = _flg) +#define RTMP_GET_PACKET_5VT(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+22]) + +#define RTMP_SET_PACKET_PROTOCOL(_p, _protocol) {\ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+23] = (UINT8)((_protocol) & 0x00ff)); \ + (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+24] = (UINT8)(((_protocol) & 0xff00) >> 8)); \ +} + +#define RTMP_GET_PACKET_PROTOCOL(_p) \ + ((((UINT16)(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+23])) << 8) \ + | ((UINT16)(RTPKT_TO_OSPKT(_p)->cb[CB_OFF+24]))) + +#ifdef INF_AMAZON_SE +/* [CB_OFF+28], 1B, Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */ +#define RTMP_SET_PACKET_NOBULKOUT(_p, _morebit) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+28] = _morebit) +#define RTMP_GET_PACKET_NOBULKOUT(_p) (RTPKT_TO_OSPKT(_p)->cb[CB_OFF+28]) +#endif // INF_AMAZON_SE // +/* Max skb->cb = 48B = [CB_OFF+38] */ + + + + + + +/*********************************************************************************** + * Other function prototypes definitions + ***********************************************************************************/ +void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time); +int rt28xx_packet_xmit(struct sk_buff *skb); + + +#if LINUX_VERSION_CODE <= 0x20402 // Red Hat 7.1 +struct net_device *alloc_netdev(int sizeof_priv, const char *mask, void (*setup)(struct net_device *)); +#endif // LINUX_VERSION_CODE // + + +#ifdef RTMP_MAC_PCI +/* function declarations */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +#define IRQ_HANDLE_TYPE irqreturn_t +#else +#define IRQ_HANDLE_TYPE void +#endif + +IRQ_HANDLE_TYPE +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) +rt2860_interrupt(int irq, void *dev_instance); +#else +rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +#endif + +#endif // RTMP_MAC_PCI // + +INT rt28xx_ioctl( + IN PNET_DEV net_dev, + IN OUT struct ifreq *rq, + IN INT cmd); + + +#ifdef CONFIG_STA_SUPPORT +INT rt28xx_sta_ioctl( + IN PNET_DEV net_dev, + IN OUT struct ifreq *rq, + IN INT cmd); +#endif // CONFIG_STA_SUPPORT // + +extern int ra_mtd_write(int num, loff_t to, size_t len, const u_char *buf); +extern int ra_mtd_read(int num, loff_t from, size_t len, u_char *buf); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,29) +#define GET_PAD_FROM_NET_DEV(_pAd, _net_dev) (_pAd) = (PRTMP_ADAPTER)(_net_dev)->ml_priv; +#else +#define GET_PAD_FROM_NET_DEV(_pAd, _net_dev) (_pAd) = (PRTMP_ADAPTER)(_net_dev)->priv; +#endif + + +#endif // __RT_LINUX_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rt_ate.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rt_ate.h new file mode 100644 index 000000000..dc383dbd8 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rt_ate.h @@ -0,0 +1,348 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + +#ifndef __ATE_H__ +#define __ATE_H__ + + +#ifdef LINUX +#define ate_print printk +#define ATEDBGPRINT DBGPRINT +#ifdef RTMP_MAC_PCI +#define EEPROM_SIZE 0x200 +#ifdef CONFIG_STA_SUPPORT +#define EEPROM_BIN_FILE_NAME "/etc/Wireless/RT2860STA/e2p.bin" +#endif // CONFIG_STA_SUPPORT // +#endif // RTMP_MAC_PCI // +#endif // LINUX // + + +#define ATE_ON(_p) (((_p)->ate.Mode) != ATE_STOP) + +#ifdef RTMP_MAC_PCI +NTSTATUS ATE_RT3562WriteBBPR66( + IN PRTMP_ADAPTER pAd, + IN UCHAR Value); + +#define ATEPCIReadBBPRegister(_A, _I, _pV) \ +{ \ + BBP_CSR_CFG_STRUC BbpCsr; \ + int j, k; \ + for (j=0; j<MAX_BUSY_COUNT; j++) \ + { \ + RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \ + if (BbpCsr.field.Busy == BUSY) \ + { \ + continue; \ + } \ + BbpCsr.word = 0; \ + BbpCsr.field.fRead = 1; \ + BbpCsr.field.BBP_RW_MODE = 1; \ + BbpCsr.field.Busy = 1; \ + BbpCsr.field.RegNum = _I; \ + RTMP_IO_WRITE32(_A, BBP_CSR_CFG, BbpCsr.word); \ + for (k=0; k<MAX_BUSY_COUNT; k++) \ + { \ + RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \ + if (BbpCsr.field.Busy == IDLE) \ + break; \ + } \ + if ((BbpCsr.field.Busy == IDLE) && \ + (BbpCsr.field.RegNum == _I)) \ + { \ + *(_pV) = (UCHAR)BbpCsr.field.Value; \ + break; \ + } \ + } \ + if (BbpCsr.field.Busy == BUSY) \ + { \ + ATEDBGPRINT(RT_DEBUG_ERROR, ("BBP read R%d fail\n", _I)); \ + *(_pV) = (_A)->BbpWriteLatch[_I]; \ + } \ +} + +#define ATEPCIWriteBBPRegister(_A, _I, _V) \ +{ \ + BBP_CSR_CFG_STRUC BbpCsr; \ + int BusyCnt; \ + for (BusyCnt=0; BusyCnt<MAX_BUSY_COUNT; BusyCnt++) \ + { \ + RTMP_IO_READ32(_A, BBP_CSR_CFG, &BbpCsr.word); \ + if (BbpCsr.field.Busy == BUSY) \ + continue; \ + BbpCsr.word = 0; \ + BbpCsr.field.fRead = 0; \ + BbpCsr.field.BBP_RW_MODE = 1; \ + BbpCsr.field.Busy = 1; \ + BbpCsr.field.Value = _V; \ + BbpCsr.field.RegNum = _I; \ + RTMP_IO_WRITE32(_A, BBP_CSR_CFG, BbpCsr.word); \ + (_A)->BbpWriteLatch[_I] = _V; \ + break; \ + } \ + if (BusyCnt == MAX_BUSY_COUNT) \ + { \ + ATEDBGPRINT(RT_DEBUG_ERROR, ("BBP write R%d fail\n", _I)); \ + } \ +} + +#define ATE_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) ATEPCIReadBBPRegister(_A, _I, _pV) + +#ifdef RT35xx +#define ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V) \ + do{ \ + if ((_I) != BBP_R66) \ + ATEPCIWriteBBPRegister((_A), (_I), (_V)) \ + else \ + ATE_RT3562WriteBBPR66((_A), (_V)); \ + }while(0) +#else +#define ATE_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V) ATEPCIWriteBBPRegister(_A, _I, _V) +#endif + +#endif // RTMP_MAC_PCI // + + +#ifdef RTMP_RF_RW_SUPPORT +#define ATE_RF_IO_READ8_BY_REG_ID(_A, _I, _pV) RT30xxReadRFRegister(_A, _I, _pV) +#define ATE_RF_IO_WRITE8_BY_REG_ID(_A, _I, _V) RT30xxWriteRFRegister(_A, _I, _V) +#endif // RTMP_RF_RW_SUPPORT // + +VOID rt_ee_read_all( + IN PRTMP_ADAPTER pAd, + OUT USHORT *Data); + +VOID rt_ee_write_all( + IN PRTMP_ADAPTER pAd, + IN USHORT *Data); + +INT Set_ATE_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_DA_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_SA_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_BSSID_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_CHANNEL_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_POWER0_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_POWER1_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + + +INT Set_ATE_TX_Antenna_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_RX_Antenna_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_FREQOFFSET_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_BW_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_LENGTH_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_COUNT_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_MCS_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_MODE_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_TX_GI_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + + +INT Set_ATE_RX_FER_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_Read_RF_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifndef RTMP_RF_RW_SUPPORT +INT Set_ATE_Write_RF1_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_Write_RF2_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_Write_RF3_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_Write_RF4_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // RTMP_RF_RW_SUPPORT // + +INT Set_ATE_Load_E2P_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_Read_E2P_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifdef RT35xx +INT Set_ATE_LED_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_HW_LED_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // RT35xx // + +INT Set_ATE_Show_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ATE_Help_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifdef RALINK_28xx_QA +VOID ATE_QA_Statistics( + IN PRTMP_ADAPTER pAd, + IN PRXWI_STRUC pRxWI, + IN PRT28XX_RXD_STRUC p28xxRxD, + IN PHEADER_802_11 pHeader); + +VOID RtmpDoAte( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq); + +VOID BubbleSort( + IN INT32 n, + IN INT32 a[]); + +VOID CalNoiseLevel( + IN PRTMP_ADAPTER pAdapter, + IN UCHAR channel, + OUT INT32 buffer[3][10]); + +BOOLEAN SyncTxRxConfig( + IN PRTMP_ADAPTER pAdapter, + IN USHORT offset, + IN UCHAR value); + +INT Set_TxStop_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_RxStop_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifdef DBG +INT Set_EERead_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_EEWrite_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_BBPRead_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_BBPWrite_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_RFWrite_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // DBG // +#endif // RALINK_28xx_QA // + +#ifdef RT35xx +VOID ATEAsicSetTxRxPath( + IN PRTMP_ADAPTER pAd); +#endif // RT35xx // + +VOID ATEAsicSwitchChannel( + IN PRTMP_ADAPTER pAd); + +VOID ATEAsicAdjustTxPower( + IN PRTMP_ADAPTER pAd); + +VOID ATEDisableAsicProtect( + IN PRTMP_ADAPTER pAd); + +CHAR ATEConvertToRssi( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi, + IN UCHAR RssiNumber); + +VOID ATESampleRssi( + IN PRTMP_ADAPTER pAd, + IN PRXWI_STRUC pRxWI); + + +#ifdef CONFIG_STA_SUPPORT +VOID RTMPStationStop( + IN PRTMP_ADAPTER pAd); + +VOID RTMPStationStart( + IN PRTMP_ADAPTER pAd); +#endif // CONFIG_STA_SUPPORT // +#endif // __ATE_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rt_config.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rt_config.h new file mode 100644 index 000000000..6fe16ddc9 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rt_config.h @@ -0,0 +1,156 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt_config.h + + Abstract: + Central header file to maintain all include files for all NDIS + miniport driver routines. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Paul Lin 08-01-2002 created + +*/ +#ifndef __RT_CONFIG_H__ +#define __RT_CONFIG_H__ + +#define VENDOR_FEATURE1_SUPPORT +//#define VENDOR_FEATURE2_SUPPORT +//#define VENDOR_FEATURE3_SUPPORT + + +#ifdef VENDOR_FEATURE3_SUPPORT +#ifdef DOT1X_SUPPORT +#undef DOT1X_SUPPORT +#endif // DOT1X_SUPPORT // +#ifdef SYSTEM_LOG_SUPPORT +#undef SYSTEM_LOG_SUPPORT +#endif // SYSTEM_LOG_SUPPORT // +#endif // VENDOR_FEATURE3_SUPPORT // + + +#include "rtmp_type.h" +#include "rtmp_os.h" + +#include "rtmp_def.h" +#include "rtmp_chip.h" +#include "rtmp_timer.h" + +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT +#include "cfg80211extr.h" +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + +#include "oid.h" +#include "mlme.h" +#include "crypt_md5.h" +#include "crypt_sha2.h" +#include "crypt_hmac.h" +#include "crypt_aes.h" +#include "crypt_arc4.h" +#include "rtmp_cmd.h" +#include "rtmp.h" +#include "ap.h" +#include "wpa.h" +#include "dfs.h" +#include "chlist.h" +#include "spectrum.h" + +#include "eeprom.h" +#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_USB_SUPPORT) +#include "rtmp_mcu.h" +#endif + + + +#undef AP_WSC_INCLUDED +#undef STA_WSC_INCLUDED +#undef WSC_INCLUDED + + + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + +#ifdef BLOCK_NET_IF +#include "netif_block.h" +#endif // BLOCK_NET_IF // + +#ifdef IGMP_SNOOP_SUPPORT +#include "igmp_snoop.h" +#endif // IGMP_SNOOP_SUPPORT // + +#ifdef RALINK_ATE +#include "rt_ate.h" +#endif // RALINK_ATE // + +#ifdef RALINK_28xx_QA +#ifndef RALINK_ATE +#error "For supporting QA GUI, please set HAS_ATE=y and HAS_QA_SUPPORT=y." +#endif // RALINK_ATE // +#endif // RALINK_28xx_QA // + + + + + +#if defined(AP_WSC_INCLUDED) || defined(STA_WSC_INCLUDED) +#define WSC_INCLUDED +#endif + + +#ifdef CONFIG_STA_SUPPORT +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT +#ifndef WPA_SUPPLICANT_SUPPORT +#error "Build for being controlled by NetworkManager or wext, please set HAS_WPA_SUPPLICANT=y and HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y" +#endif // WPA_SUPPLICANT_SUPPORT // +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + +#endif // CONFIG_STA_SUPPORT // + + + +#ifdef IKANOS_VX_1X0 +#include "vr_ikans.h" +#endif // IKANOS_VX_1X0 // + + + + +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT +#include "cfg80211.h" +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + + + +#endif // __RT_CONFIG_H__ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp.h new file mode 100644 index 000000000..c5fbe2f2f --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp.h @@ -0,0 +1,7270 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp.h + + Abstract: + Miniport generic portion header file + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Paul Lin 2002-08-01 created + James Tan 2002-09-06 modified (Revise NTCRegTable) + John Chang 2004-09-06 modified for RT2600 +*/ +#ifndef __RTMP_H__ +#define __RTMP_H__ + +#include "link_list.h" +#include "spectrum_def.h" + +#include "rtmp_dot11.h" +#include "wpa_cmm.h" + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + +#undef AP_WSC_INCLUDED +#undef STA_WSC_INCLUDED +#undef WSC_INCLUDED + + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + +#if defined(AP_WSC_INCLUDED) || defined(STA_WSC_INCLUDED) +#define WSC_INCLUDED +#endif + + + + + +#include "rtmp_chip.h" + + + + + +#ifdef CLIENT_WDS +#include "client_wds_cmm.h" +#endif // CLIENT_WDS // + + + +typedef struct _RTMP_ADAPTER RTMP_ADAPTER; +typedef struct _RTMP_ADAPTER *PRTMP_ADAPTER; + +typedef struct _RTMP_CHIP_OP_ RTMP_CHIP_OP; + + +//#define DBG 1 + +//#define DBG_DIAGNOSE 1 + + +//+++Add by shiang for merge MiniportMMRequest() and MiniportDataMMRequest() into one function +#define MAX_DATAMM_RETRY 3 +#define MGMT_USE_QUEUE_FLAG 0x80 +//---Add by shiang for merge MiniportMMRequest() and MiniportDataMMRequest() into one function + +#define MAXSEQ (0xFFF) + +#define MAX_MCS_SET 16 /* From MCS 0 ~ MCS 15 */ + +#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT) +#define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd) if(_pAd->OpMode == OPMODE_AP) +#define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd) if(_pAd->OpMode == OPMODE_STA) +#else +#define IF_DEV_CONFIG_OPMODE_ON_AP(_pAd) +#define IF_DEV_CONFIG_OPMODE_ON_STA(_pAd) +#endif + +#define MAX_TXPOWER_ARRAY_SIZE 5 + +extern unsigned char SNAP_AIRONET[]; +extern unsigned char CISCO_OUI[]; +extern UCHAR BaSizeArray[4]; + +extern UCHAR BROADCAST_ADDR[MAC_ADDR_LEN]; +extern UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN]; +extern ULONG BIT32[32]; +extern UCHAR BIT8[8]; +extern char* CipherName[]; +extern char* MCSToMbps[]; +extern UCHAR RxwiMCSToOfdmRate[12]; +extern UCHAR SNAP_802_1H[6]; +extern UCHAR SNAP_BRIDGE_TUNNEL[6]; +extern UCHAR SNAP_AIRONET[8]; +extern UCHAR CKIP_LLC_SNAP[8]; +extern UCHAR EAPOL_LLC_SNAP[8]; +extern UCHAR EAPOL[2]; +extern UCHAR IPX[2]; +extern UCHAR TPID[]; +extern UCHAR APPLE_TALK[2]; +extern UCHAR RateIdToPlcpSignal[12]; // see IEEE802.11a-1999 p.14 +extern UCHAR OfdmRateToRxwiMCS[]; +extern UCHAR OfdmSignalToRateId[16] ; +extern UCHAR default_cwmin[4]; +extern UCHAR default_cwmax[4]; +extern UCHAR default_sta_aifsn[4]; +extern UCHAR MapUserPriorityToAccessCategory[8]; + +extern USHORT RateUpPER[]; +extern USHORT RateDownPER[]; +extern UCHAR Phy11BNextRateDownward[]; +extern UCHAR Phy11BNextRateUpward[]; +extern UCHAR Phy11BGNextRateDownward[]; +extern UCHAR Phy11BGNextRateUpward[]; +extern UCHAR Phy11ANextRateDownward[]; +extern UCHAR Phy11ANextRateUpward[]; +extern signed char RssiSafeLevelForTxRate[]; +extern unsigned char RateIdToMbps[]; +extern USHORT RateIdTo500Kbps[]; + +extern UCHAR CipherSuiteWpaNoneTkip[]; +extern UCHAR CipherSuiteWpaNoneTkipLen; + +extern UCHAR CipherSuiteWpaNoneAes[]; +extern UCHAR CipherSuiteWpaNoneAesLen; + +extern UCHAR SsidIe; +extern UCHAR SupRateIe; +extern UCHAR ExtRateIe; + +#ifdef DOT11_N_SUPPORT +extern UCHAR HtCapIe; +extern UCHAR AddHtInfoIe; +extern UCHAR NewExtChanIe; +extern UCHAR BssCoexistIe; +extern UCHAR ExtHtCapIe; +#endif // DOT11_N_SUPPORT // +extern UCHAR ExtCapIe; + +extern UCHAR ErpIe; +extern UCHAR DsIe; +extern UCHAR TimIe; +extern UCHAR WpaIe; +extern UCHAR Wpa2Ie; +extern UCHAR IbssIe; +extern UCHAR Ccx2Ie; +extern UCHAR WapiIe; + +extern UCHAR WPA_OUI[]; +extern UCHAR RSN_OUI[]; +extern UCHAR WAPI_OUI[]; +extern UCHAR WME_INFO_ELEM[]; +extern UCHAR WME_PARM_ELEM[]; +extern UCHAR Ccx2QosInfo[]; +extern UCHAR Ccx2IeInfo[]; +extern UCHAR RALINK_OUI[]; +extern UCHAR PowerConstraintIE[]; + + +extern UCHAR RateSwitchTable[]; +extern UCHAR RateSwitchTable11B[]; +extern UCHAR RateSwitchTable11G[]; +extern UCHAR RateSwitchTable11BG[]; + +#ifdef DOT11_N_SUPPORT +extern UCHAR RateSwitchTable11BGN1S[]; +extern UCHAR RateSwitchTable11BGN2S[]; +extern UCHAR RateSwitchTable11BGN2SForABand[]; +extern UCHAR RateSwitchTable11N1S[]; +extern UCHAR RateSwitchTable11N2S[]; +extern UCHAR RateSwitchTable11N2SForABand[]; + +#ifdef CONFIG_STA_SUPPORT +extern UCHAR PRE_N_HT_OUI[]; +#endif // CONFIG_STA_SUPPORT // +#endif // DOT11_N_SUPPORT // + + +#ifdef RALINK_ATE +typedef struct _ATE_INFO { + UCHAR Mode; + CHAR TxPower0; + CHAR TxPower1; + CHAR TxAntennaSel; + CHAR RxAntennaSel; + TXWI_STRUC TxWI; // TXWI + USHORT QID; + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; + UCHAR Addr3[MAC_ADDR_LEN]; + UCHAR Channel; + UINT32 TxLength; + UINT32 TxCount; + UINT32 TxDoneCount; // Tx DMA Done + UINT32 RFFreqOffset; + BOOLEAN bRxFER; // Show Rx Frame Error Rate + BOOLEAN bQATxStart; // Have compiled QA in and use it to ATE tx. + BOOLEAN bQARxStart; // Have compiled QA in and use it to ATE rx. +#ifdef RTMP_MAC_PCI + BOOLEAN bFWLoading; // Reload firmware when ATE is done. +#endif // RTMP_MAC_PCI // + UINT32 RxTotalCnt; + UINT32 RxCntPerSec; + + CHAR LastSNR0; // last received SNR + CHAR LastSNR1; // last received SNR for 2nd antenna + CHAR LastRssi0; // last received RSSI + CHAR LastRssi1; // last received RSSI for 2nd antenna + CHAR LastRssi2; // last received RSSI for 3rd antenna + CHAR AvgRssi0; // last 8 frames' average RSSI + CHAR AvgRssi1; // last 8 frames' average RSSI + CHAR AvgRssi2; // last 8 frames' average RSSI + SHORT AvgRssi0X8; // sum of last 8 frames' RSSI + SHORT AvgRssi1X8; // sum of last 8 frames' RSSI + SHORT AvgRssi2X8; // sum of last 8 frames' RSSI + + UINT32 NumOfAvgRssiSample; + +#ifdef RT35xx + UCHAR LedIndicatorStrength; +#endif // RT35xx // + +#ifdef RALINK_28xx_QA + // Tx frame + USHORT HLen; // Header Length + USHORT PLen; // Pattern Length + UCHAR Header[32]; // Header buffer + UCHAR Pattern[32]; // Pattern buffer + USHORT DLen; // Data Length + USHORT seq; + UINT32 CID; + RTMP_OS_PID AtePid; + // counters + UINT32 U2M; + UINT32 OtherData; + UINT32 Beacon; + UINT32 OtherCount; + UINT32 TxAc0; + UINT32 TxAc1; + UINT32 TxAc2; + UINT32 TxAc3; + UINT32 TxHCCA; + UINT32 TxMgmt; + UINT32 RSSI0; + UINT32 RSSI1; + UINT32 RSSI2; + UINT32 SNR0; + UINT32 SNR1; + // TxStatus : 0 --> task is idle, 1 --> task is running + UCHAR TxStatus; +#endif // RALINK_28xx_QA // + +} ATE_INFO, *PATE_INFO; + +#ifdef RALINK_28xx_QA +struct ate_racfghdr { + UINT32 magic_no; + USHORT command_type; + USHORT command_id; + USHORT length; + USHORT sequence; + USHORT status; + UCHAR data[2046]; +} __attribute__((packed)); +#endif // RALINK_28xx_QA // +#endif // RALINK_ATE // + + +typedef struct _RSSI_SAMPLE { + CHAR LastRssi0; // last received RSSI + CHAR LastRssi1; // last received RSSI + CHAR LastRssi2; // last received RSSI + CHAR AvgRssi0; + CHAR AvgRssi1; + CHAR AvgRssi2; + SHORT AvgRssi0X8; + SHORT AvgRssi1X8; + SHORT AvgRssi2X8; +} RSSI_SAMPLE; + +// +// Queue structure and macros +// +#define InitializeQueueHeader(QueueHeader) \ +{ \ + (QueueHeader)->Head = (QueueHeader)->Tail = NULL; \ + (QueueHeader)->Number = 0; \ +} + +#define RemoveHeadQueue(QueueHeader) \ +(QueueHeader)->Head; \ +{ \ + PQUEUE_ENTRY pNext; \ + if ((QueueHeader)->Head != NULL) \ + { \ + pNext = (QueueHeader)->Head->Next; \ + (QueueHeader)->Head->Next = NULL; \ + (QueueHeader)->Head = pNext; \ + if (pNext == NULL) \ + (QueueHeader)->Tail = NULL; \ + (QueueHeader)->Number--; \ + } \ +} + +#define InsertHeadQueue(QueueHeader, QueueEntry) \ +{ \ + ((PQUEUE_ENTRY)QueueEntry)->Next = (QueueHeader)->Head; \ + (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry); \ + if ((QueueHeader)->Tail == NULL) \ + (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry); \ + (QueueHeader)->Number++; \ +} + +#define InsertTailQueue(QueueHeader, QueueEntry) \ +{ \ + ((PQUEUE_ENTRY)QueueEntry)->Next = NULL; \ + if ((QueueHeader)->Tail) \ + (QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry); \ + else \ + (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry); \ + (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry); \ + (QueueHeader)->Number++; \ +} + +#define InsertTailQueueAc(pAd, pEntry, QueueHeader, QueueEntry) \ +{ \ + ((PQUEUE_ENTRY)QueueEntry)->Next = NULL; \ + if ((QueueHeader)->Tail) \ + (QueueHeader)->Tail->Next = (PQUEUE_ENTRY)(QueueEntry); \ + else \ + (QueueHeader)->Head = (PQUEUE_ENTRY)(QueueEntry); \ + (QueueHeader)->Tail = (PQUEUE_ENTRY)(QueueEntry); \ + (QueueHeader)->Number++; \ +} + + + +// +// Macros for flag and ref count operations +// +#define RTMP_SET_FLAG(_M, _F) ((_M)->Flags |= (_F)) +#define RTMP_CLEAR_FLAG(_M, _F) ((_M)->Flags &= ~(_F)) +#define RTMP_CLEAR_FLAGS(_M) ((_M)->Flags = 0) +#define RTMP_TEST_FLAG(_M, _F) (((_M)->Flags & (_F)) != 0) +#define RTMP_TEST_FLAGS(_M, _F) (((_M)->Flags & (_F)) == (_F)) +// Macro for power save flag. +#define RTMP_SET_PSFLAG(_M, _F) ((_M)->PSFlags |= (_F)) +#define RTMP_CLEAR_PSFLAG(_M, _F) ((_M)->PSFlags &= ~(_F)) +#define RTMP_CLEAR_PSFLAGS(_M) ((_M)->PSFlags = 0) +#define RTMP_TEST_PSFLAG(_M, _F) (((_M)->PSFlags & (_F)) != 0) +#define RTMP_TEST_PSFLAGS(_M, _F) (((_M)->PSFlags & (_F)) == (_F)) + +#define OPSTATUS_SET_FLAG(_pAd, _F) ((_pAd)->CommonCfg.OpStatusFlags |= (_F)) +#define OPSTATUS_CLEAR_FLAG(_pAd, _F) ((_pAd)->CommonCfg.OpStatusFlags &= ~(_F)) +#define OPSTATUS_TEST_FLAG(_pAd, _F) (((_pAd)->CommonCfg.OpStatusFlags & (_F)) != 0) + +#define CLIENT_STATUS_SET_FLAG(_pEntry,_F) ((_pEntry)->ClientStatusFlags |= (_F)) +#define CLIENT_STATUS_CLEAR_FLAG(_pEntry,_F) ((_pEntry)->ClientStatusFlags &= ~(_F)) +#define CLIENT_STATUS_TEST_FLAG(_pEntry,_F) (((_pEntry)->ClientStatusFlags & (_F)) != 0) + +#define RX_FILTER_SET_FLAG(_pAd, _F) ((_pAd)->CommonCfg.PacketFilter |= (_F)) +#define RX_FILTER_CLEAR_FLAG(_pAd, _F) ((_pAd)->CommonCfg.PacketFilter &= ~(_F)) +#define RX_FILTER_TEST_FLAG(_pAd, _F) (((_pAd)->CommonCfg.PacketFilter & (_F)) != 0) + +#ifdef CONFIG_STA_SUPPORT +#define STA_NO_SECURITY_ON(_p) (_p->StaCfg.WepStatus == Ndis802_11EncryptionDisabled) +#define STA_WEP_ON(_p) (_p->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) +#define STA_TKIP_ON(_p) (_p->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) +#define STA_AES_ON(_p) (_p->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) + +#define STA_TGN_WIFI_ON(_p) (_p->StaCfg.bTGnWifiTest == TRUE) +#endif // CONFIG_STA_SUPPORT // + +#define CKIP_KP_ON(_p) ((((_p)->StaCfg.CkipFlag) & 0x10) && ((_p)->StaCfg.bCkipCmicOn == TRUE)) +#define CKIP_CMIC_ON(_p) ((((_p)->StaCfg.CkipFlag) & 0x08) && ((_p)->StaCfg.bCkipCmicOn == TRUE)) + + +#define INC_RING_INDEX(_idx, _RingSize) \ +{ \ + (_idx) = (_idx+1) % (_RingSize); \ +} + + +#ifdef DOT11_N_SUPPORT +// StaActive.SupportedHtPhy.MCSSet is copied from AP beacon. Don't need to update here. +#define COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd) \ +{ \ + _pAd->StaActive.SupportedHtPhy.ChannelWidth = _pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth; \ + _pAd->StaActive.SupportedHtPhy.MimoPs = _pAd->MlmeAux.HtCapability.HtCapInfo.MimoPs; \ + _pAd->StaActive.SupportedHtPhy.GF = _pAd->MlmeAux.HtCapability.HtCapInfo.GF; \ + _pAd->StaActive.SupportedHtPhy.ShortGIfor20 = _pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor20; \ + _pAd->StaActive.SupportedHtPhy.ShortGIfor40 = _pAd->MlmeAux.HtCapability.HtCapInfo.ShortGIfor40; \ + _pAd->StaActive.SupportedHtPhy.TxSTBC = _pAd->MlmeAux.HtCapability.HtCapInfo.TxSTBC; \ + _pAd->StaActive.SupportedHtPhy.RxSTBC = _pAd->MlmeAux.HtCapability.HtCapInfo.RxSTBC; \ + _pAd->StaActive.SupportedHtPhy.ExtChanOffset = _pAd->MlmeAux.AddHtInfo.AddHtInfo.ExtChanOffset; \ + _pAd->StaActive.SupportedHtPhy.RecomWidth = _pAd->MlmeAux.AddHtInfo.AddHtInfo.RecomWidth; \ + _pAd->StaActive.SupportedHtPhy.OperaionMode = _pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode; \ + _pAd->StaActive.SupportedHtPhy.NonGfPresent = _pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent; \ + NdisMoveMemory((_pAd)->MacTab.Content[BSSID_WCID].HTCapability.MCSSet, (_pAd)->StaActive.SupportedPhyInfo.MCSSet, sizeof(UCHAR) * 16);\ +} + +#define COPY_AP_HTSETTINGS_FROM_BEACON(_pAd, _pHtCapability) \ +{ \ + _pAd->MacTab.Content[BSSID_WCID].AMsduSize = (UCHAR)(_pHtCapability->HtCapInfo.AMsduSize); \ + _pAd->MacTab.Content[BSSID_WCID].MmpsMode= (UCHAR)(_pHtCapability->HtCapInfo.MimoPs); \ + _pAd->MacTab.Content[BSSID_WCID].MaxRAmpduFactor = (UCHAR)(_pHtCapability->HtCapParm.MaxRAmpduFactor); \ +} +#endif // DOT11_N_SUPPORT // + +// +// MACRO for 32-bit PCI register read / write +// +// Usage : RTMP_IO_READ32( +// PRTMP_ADAPTER pAd, +// ULONG Register_Offset, +// PULONG pValue) +// +// RTMP_IO_WRITE32( +// PRTMP_ADAPTER pAd, +// ULONG Register_Offset, +// ULONG Value) +// + + +// +// Common fragment list structure - Identical to the scatter gather frag list structure +// +//#define RTMP_SCATTER_GATHER_ELEMENT SCATTER_GATHER_ELEMENT +//#define PRTMP_SCATTER_GATHER_ELEMENT PSCATTER_GATHER_ELEMENT +#define NIC_MAX_PHYS_BUF_COUNT 8 + +typedef struct _RTMP_SCATTER_GATHER_ELEMENT { + PVOID Address; + ULONG Length; + PULONG Reserved; +} RTMP_SCATTER_GATHER_ELEMENT, *PRTMP_SCATTER_GATHER_ELEMENT; + + +typedef struct _RTMP_SCATTER_GATHER_LIST { + ULONG NumberOfElements; + PULONG Reserved; + RTMP_SCATTER_GATHER_ELEMENT Elements[NIC_MAX_PHYS_BUF_COUNT]; +} RTMP_SCATTER_GATHER_LIST, *PRTMP_SCATTER_GATHER_LIST; + + +// +// Some utility macros +// +#ifndef min +#define min(_a, _b) (((_a) < (_b)) ? (_a) : (_b)) +#endif + +#ifndef max +#define max(_a, _b) (((_a) > (_b)) ? (_a) : (_b)) +#endif + +#define GET_LNA_GAIN(_pAd) ((_pAd->LatchRfRegs.Channel <= 14) ? (_pAd->BLNAGain) : ((_pAd->LatchRfRegs.Channel <= 64) ? (_pAd->ALNAGain0) : ((_pAd->LatchRfRegs.Channel <= 128) ? (_pAd->ALNAGain1) : (_pAd->ALNAGain2)))) + +#define INC_COUNTER64(Val) (Val.QuadPart++) + +#define INFRA_ON(_p) (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_INFRA_ON)) +#define ADHOC_ON(_p) (OPSTATUS_TEST_FLAG(_p, fOP_STATUS_ADHOC_ON)) +#define MONITOR_ON(_p) (((_p)->StaCfg.BssType) == BSS_MONITOR) +#define IDLE_ON(_p) (!INFRA_ON(_p) && !ADHOC_ON(_p)) + +// Check LEAP & CCKM flags +#define LEAP_ON(_p) (((_p)->StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP) +#define LEAP_CCKM_ON(_p) ((((_p)->StaCfg.LeapAuthMode) == CISCO_AuthModeLEAP) && ((_p)->StaCfg.LeapAuthInfo.CCKM == TRUE)) + +// if orginal Ethernet frame contains no LLC/SNAP, then an extra LLC/SNAP encap is required +#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(_pBufVA, _pExtraLlcSnapEncap) \ +{ \ + if (((*(_pBufVA + 12) << 8) + *(_pBufVA + 13)) > 1500) \ + { \ + _pExtraLlcSnapEncap = SNAP_802_1H; \ + if (NdisEqualMemory(IPX, _pBufVA + 12, 2) || \ + NdisEqualMemory(APPLE_TALK, _pBufVA + 12, 2)) \ + { \ + _pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL; \ + } \ + } \ + else \ + { \ + _pExtraLlcSnapEncap = NULL; \ + } \ +} + +// New Define for new Tx Path. +#define EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(_pBufVA, _pExtraLlcSnapEncap) \ +{ \ + if (((*(_pBufVA) << 8) + *(_pBufVA + 1)) > 1500) \ + { \ + _pExtraLlcSnapEncap = SNAP_802_1H; \ + if (NdisEqualMemory(IPX, _pBufVA, 2) || \ + NdisEqualMemory(APPLE_TALK, _pBufVA, 2)) \ + { \ + _pExtraLlcSnapEncap = SNAP_BRIDGE_TUNNEL; \ + } \ + } \ + else \ + { \ + _pExtraLlcSnapEncap = NULL; \ + } \ +} + + +#define MAKE_802_3_HEADER(_p, _pMac1, _pMac2, _pType) \ +{ \ + NdisMoveMemory(_p, _pMac1, MAC_ADDR_LEN); \ + NdisMoveMemory((_p + MAC_ADDR_LEN), _pMac2, MAC_ADDR_LEN); \ + NdisMoveMemory((_p + MAC_ADDR_LEN * 2), _pType, LENGTH_802_3_TYPE); \ +} + +// if pData has no LLC/SNAP (neither RFC1042 nor Bridge tunnel), keep it that way. +// else if the received frame is LLC/SNAP-encaped IPX or APPLETALK, preserve the LLC/SNAP field +// else remove the LLC/SNAP field from the result Ethernet frame +// Patch for WHQL only, which did not turn on Netbios but use IPX within its payload +// Note: +// _pData & _DataSize may be altered (remove 8-byte LLC/SNAP) by this MACRO +// _pRemovedLLCSNAP: pointer to removed LLC/SNAP; NULL is not removed +#define CONVERT_TO_802_3(_p8023hdr, _pDA, _pSA, _pData, _DataSize, _pRemovedLLCSNAP) \ +{ \ + char LLC_Len[2]; \ + \ + _pRemovedLLCSNAP = NULL; \ + if (NdisEqualMemory(SNAP_802_1H, _pData, 6) || \ + NdisEqualMemory(SNAP_BRIDGE_TUNNEL, _pData, 6)) \ + { \ + PUCHAR pProto = _pData + 6; \ + \ + if ((NdisEqualMemory(IPX, pProto, 2) || NdisEqualMemory(APPLE_TALK, pProto, 2)) && \ + NdisEqualMemory(SNAP_802_1H, _pData, 6)) \ + { \ + LLC_Len[0] = (UCHAR)(_DataSize >> 8); \ + LLC_Len[1] = (UCHAR)(_DataSize & (256 - 1)); \ + MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len); \ + } \ + else \ + { \ + MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, pProto); \ + _pRemovedLLCSNAP = _pData; \ + _DataSize -= LENGTH_802_1_H; \ + _pData += LENGTH_802_1_H; \ + } \ + } \ + else \ + { \ + LLC_Len[0] = (UCHAR)(_DataSize >> 8); \ + LLC_Len[1] = (UCHAR)(_DataSize & (256 - 1)); \ + MAKE_802_3_HEADER(_p8023hdr, _pDA, _pSA, LLC_Len); \ + } \ +} + + +// Enqueue this frame to MLME engine +// We need to enqueue the whole frame because MLME need to pass data type +// information from 802.11 header +#ifdef RTMP_MAC_PCI +#define REPORT_MGMT_FRAME_TO_MLME(_pAd, Wcid, _pFrame, _FrameSize, _Rssi0, _Rssi1, _Rssi2, _MinSNR) \ +{ \ + UINT32 High32TSF, Low32TSF; \ + RTMP_IO_READ32(_pAd, TSF_TIMER_DW1, &High32TSF); \ + RTMP_IO_READ32(_pAd, TSF_TIMER_DW0, &Low32TSF); \ + MlmeEnqueueForRecv(_pAd, Wcid, High32TSF, Low32TSF, (UCHAR)_Rssi0, (UCHAR)_Rssi1,(UCHAR)_Rssi2,_FrameSize, _pFrame, (UCHAR)_MinSNR); \ +} +#endif // RTMP_MAC_PCI // + +#define MAC_ADDR_EQUAL(pAddr1,pAddr2) RTMPEqualMemory((PVOID)(pAddr1), (PVOID)(pAddr2), MAC_ADDR_LEN) +#define SSID_EQUAL(ssid1, len1, ssid2, len2) ((len1==len2) && (RTMPEqualMemory(ssid1, ssid2, len1))) + +// +// Check if it is Japan W53(ch52,56,60,64) channel. +// +#define JapanChannelCheck(channel) ((channel == 52) || (channel == 56) || (channel == 60) || (channel == 64)) + +#ifdef CONFIG_STA_SUPPORT +#define STA_EXTRA_SETTING(_pAd) + +#define STA_PORT_SECURED(_pAd) \ +{ \ + BOOLEAN Cancelled; \ + (_pAd)->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; \ + NdisAcquireSpinLock(&((_pAd)->MacTabLock)); \ + (_pAd)->MacTab.Content[BSSID_WCID].PortSecured = (_pAd)->StaCfg.PortSecured; \ + (_pAd)->MacTab.Content[BSSID_WCID].PrivacyFilter = Ndis802_11PrivFilterAcceptAll;\ + NdisReleaseSpinLock(&(_pAd)->MacTabLock); \ + RTMPCancelTimer(&((_pAd)->Mlme.LinkDownTimer), &Cancelled);\ + STA_EXTRA_SETTING(_pAd); \ +} +#endif // CONFIG_STA_SUPPORT // + + + +// +// Data buffer for DMA operation, the buffer must be contiguous physical memory +// Both DMA to / from CPU use the same structure. +// +typedef struct _RTMP_DMABUF +{ + ULONG AllocSize; + PVOID AllocVa; // TxBuf virtual address + NDIS_PHYSICAL_ADDRESS AllocPa; // TxBuf physical address +} RTMP_DMABUF, *PRTMP_DMABUF; + + +// +// Control block (Descriptor) for all ring descriptor DMA operation, buffer must be +// contiguous physical memory. NDIS_PACKET stored the binding Rx packet descriptor +// which won't be released, driver has to wait until upper layer return the packet +// before giveing up this rx ring descriptor to ASIC. NDIS_BUFFER is assocaited pair +// to describe the packet buffer. For Tx, NDIS_PACKET stored the tx packet descriptor +// which driver should ACK upper layer when the tx is physically done or failed. +// +typedef struct _RTMP_DMACB +{ + ULONG AllocSize; // Control block size + PVOID AllocVa; // Control block virtual address + NDIS_PHYSICAL_ADDRESS AllocPa; // Control block physical address + PNDIS_PACKET pNdisPacket; + PNDIS_PACKET pNextNdisPacket; + + RTMP_DMABUF DmaBuf; // Associated DMA buffer structure +} RTMP_DMACB, *PRTMP_DMACB; + + +typedef struct _RTMP_TX_RING +{ + RTMP_DMACB Cell[TX_RING_SIZE]; + UINT32 TxCpuIdx; + UINT32 TxDmaIdx; + UINT32 TxSwFreeIdx; // software next free tx index +} RTMP_TX_RING, *PRTMP_TX_RING; + +typedef struct _RTMP_RX_RING +{ + RTMP_DMACB Cell[RX_RING_SIZE]; + UINT32 RxCpuIdx; + UINT32 RxDmaIdx; + INT32 RxSwReadIdx; // software next read index +} RTMP_RX_RING, *PRTMP_RX_RING; + +typedef struct _RTMP_MGMT_RING +{ + RTMP_DMACB Cell[MGMT_RING_SIZE]; + UINT32 TxCpuIdx; + UINT32 TxDmaIdx; + UINT32 TxSwFreeIdx; // software next free tx index +} RTMP_MGMT_RING, *PRTMP_MGMT_RING; + + +// +// Statistic counter structure +// +typedef struct _COUNTER_802_3 +{ + // General Stats + ULONG GoodTransmits; + ULONG GoodReceives; + ULONG TxErrors; + ULONG RxErrors; + ULONG RxNoBuffer; + + // Ethernet Stats + ULONG RcvAlignmentErrors; + ULONG OneCollision; + ULONG MoreCollisions; + +} COUNTER_802_3, *PCOUNTER_802_3; + +typedef struct _COUNTER_802_11 { + ULONG Length; +// LARGE_INTEGER LastTransmittedFragmentCount; + LARGE_INTEGER TransmittedFragmentCount; + LARGE_INTEGER MulticastTransmittedFrameCount; + LARGE_INTEGER FailedCount; + LARGE_INTEGER RetryCount; + LARGE_INTEGER MultipleRetryCount; + LARGE_INTEGER RTSSuccessCount; + LARGE_INTEGER RTSFailureCount; + LARGE_INTEGER ACKFailureCount; + LARGE_INTEGER FrameDuplicateCount; + LARGE_INTEGER ReceivedFragmentCount; + LARGE_INTEGER MulticastReceivedFrameCount; + LARGE_INTEGER FCSErrorCount; +} COUNTER_802_11, *PCOUNTER_802_11; + +typedef struct _COUNTER_RALINK { + + UINT32 OneSecStart; /* for one sec count clear use */ + UINT32 OneSecBeaconSentCnt; + UINT32 OneSecFalseCCACnt; // CCA error count, for debug purpose, might move to global counter + UINT32 OneSecRxFcsErrCnt; // CRC error + UINT32 OneSecRxOkCnt; // RX without error + UINT32 OneSecTxFailCount; + UINT32 OneSecTxNoRetryOkCount; + UINT32 OneSecTxRetryOkCount; + UINT32 OneSecRxOkDataCnt; // unicast-to-me DATA frame count + UINT32 OneSecTransmittedByteCount; // both successful and failure, used to calculate TX throughput + + ULONG OneSecOsTxCount[NUM_OF_TX_RING]; + ULONG OneSecDmaDoneCount[NUM_OF_TX_RING]; + UINT32 OneSecTxDoneCount; + ULONG OneSecRxCount; + UINT32 OneSecReceivedByteCount; + UINT32 OneSecTxAggregationCount; + UINT32 OneSecRxAggregationCount; + UINT32 OneSecFrameDuplicateCount; + UINT32 OneSecEnd; /* for one sec count clear use */ + + ULONG TransmittedByteCount; // both successful and failure, used to calculate TX throughput + ULONG ReceivedByteCount; // both CRC okay and CRC error, used to calculate RX throughput + ULONG BeenDisassociatedCount; + ULONG BadCQIAutoRecoveryCount; + ULONG PoorCQIRoamingCount; + ULONG MgmtRingFullCount; + ULONG RxCountSinceLastNULL; + ULONG RxCount; + ULONG RxRingErrCount; + ULONG KickTxCount; + ULONG TxRingErrCount; + LARGE_INTEGER RealFcsErrCount; + ULONG PendingNdisPacketCount; + +// ULONG OneSecOsTxCount[NUM_OF_TX_RING]; +// ULONG OneSecDmaDoneCount[NUM_OF_TX_RING]; +// UINT32 OneSecTxDoneCount; +// ULONG OneSecRxCount; +// UINT32 OneSecTxAggregationCount; +// UINT32 OneSecRxAggregationCount; +// UINT32 OneSecReceivedByteCount; +// UINT32 OneSecFrameDuplicateCount; + +// UINT32 OneSecTransmittedByteCount; // both successful and failure, used to calculate TX throughput +// UINT32 OneSecTxNoRetryOkCount; +// UINT32 OneSecTxRetryOkCount; +// UINT32 OneSecTxFailCount; +// UINT32 OneSecFalseCCACnt; // CCA error count, for debug purpose, might move to global counter +// UINT32 OneSecRxOkCnt; // RX without error +// UINT32 OneSecRxOkDataCnt; // unicast-to-me DATA frame count +// UINT32 OneSecRxFcsErrCnt; // CRC error +// UINT32 OneSecBeaconSentCnt; + + UINT32 LastOneSecTotalTxCount; // OneSecTxNoRetryOkCount + OneSecTxRetryOkCount + OneSecTxFailCount + UINT32 LastOneSecRxOkDataCnt; // OneSecRxOkDataCnt + ULONG DuplicateRcv; + ULONG TxAggCount; + ULONG TxNonAggCount; + ULONG TxAgg1MPDUCount; + ULONG TxAgg2MPDUCount; + ULONG TxAgg3MPDUCount; + ULONG TxAgg4MPDUCount; + ULONG TxAgg5MPDUCount; + ULONG TxAgg6MPDUCount; + ULONG TxAgg7MPDUCount; + ULONG TxAgg8MPDUCount; + ULONG TxAgg9MPDUCount; + ULONG TxAgg10MPDUCount; + ULONG TxAgg11MPDUCount; + ULONG TxAgg12MPDUCount; + ULONG TxAgg13MPDUCount; + ULONG TxAgg14MPDUCount; + ULONG TxAgg15MPDUCount; + ULONG TxAgg16MPDUCount; + + LARGE_INTEGER TransmittedOctetsInAMSDU; + LARGE_INTEGER TransmittedAMSDUCount; + LARGE_INTEGER ReceivedOctesInAMSDUCount; + LARGE_INTEGER ReceivedAMSDUCount; + LARGE_INTEGER TransmittedAMPDUCount; + LARGE_INTEGER TransmittedMPDUsInAMPDUCount; + LARGE_INTEGER TransmittedOctetsInAMPDUCount; + LARGE_INTEGER MPDUInReceivedAMPDUCount; +} COUNTER_RALINK, *PCOUNTER_RALINK; + + +typedef struct _COUNTER_DRS { + // to record the each TX rate's quality. 0 is best, the bigger the worse. + USHORT TxQuality[MAX_STEP_OF_TX_RATE_SWITCH]; + UCHAR PER[MAX_STEP_OF_TX_RATE_SWITCH]; + UCHAR TxRateUpPenalty; // extra # of second penalty due to last unstable condition + ULONG CurrTxRateStableTime; // # of second in current TX rate + BOOLEAN fNoisyEnvironment; + BOOLEAN fLastSecAccordingRSSI; + UCHAR LastSecTxRateChangeAction; // 0: no change, 1:rate UP, 2:rate down + UCHAR LastTimeTxRateChangeAction; //Keep last time value of LastSecTxRateChangeAction + ULONG LastTxOkCount; +} COUNTER_DRS, *PCOUNTER_DRS; + + + + +/*************************************************************************** + * security key related data structure + **************************************************************************/ + +// structure to define WPA Group Key Rekey Interval +typedef struct GNU_PACKED _RT_802_11_WPA_REKEY { + ULONG ReKeyMethod; // mechanism for rekeying: 0:disable, 1: time-based, 2: packet-based + ULONG ReKeyInterval; // time-based: seconds, packet-based: kilo-packets +} RT_WPA_REKEY,*PRT_WPA_REKEY, RT_802_11_WPA_REKEY, *PRT_802_11_WPA_REKEY; + + + +typedef struct { + UCHAR Addr[MAC_ADDR_LEN]; + UCHAR ErrorCode[2]; //00 01-Invalid authentication type + //00 02-Authentication timeout + //00 03-Challenge from AP failed + //00 04-Challenge to AP failed + BOOLEAN Reported; +} ROGUEAP_ENTRY, *PROGUEAP_ENTRY; + +typedef struct { + UCHAR RogueApNr; + ROGUEAP_ENTRY RogueApEntry[MAX_LEN_OF_BSS_TABLE]; +} ROGUEAP_TABLE, *PROGUEAP_TABLE; + +// +// Cisco IAPP format +// +typedef struct _CISCO_IAPP_CONTENT_ +{ + USHORT Length; //IAPP Length + UCHAR MessageType; //IAPP type + UCHAR FunctionCode; //IAPP function type + UCHAR DestinaionMAC[MAC_ADDR_LEN]; + UCHAR SourceMAC[MAC_ADDR_LEN]; + USHORT Tag; //Tag(element IE) - Adjacent AP report + USHORT TagLength; //Length of element not including 4 byte header + UCHAR OUI[4]; //0x00, 0x40, 0x96, 0x00 + UCHAR PreviousAP[MAC_ADDR_LEN]; //MAC Address of access point + USHORT Channel; + USHORT SsidLen; + UCHAR Ssid[MAX_LEN_OF_SSID]; + USHORT Seconds; //Seconds that the client has been disassociated. +} CISCO_IAPP_CONTENT, *PCISCO_IAPP_CONTENT; + + +/* + * Fragment Frame structure + */ +typedef struct _FRAGMENT_FRAME { + PNDIS_PACKET pFragPacket; + ULONG RxSize; + USHORT Sequence; + USHORT LastFrag; + ULONG Flags; // Some extra frame information. bit 0: LLC presented +} FRAGMENT_FRAME, *PFRAGMENT_FRAME; + + +// +// Packet information for NdisQueryPacket +// +typedef struct _PACKET_INFO { + UINT PhysicalBufferCount; // Physical breaks of buffer descripor chained + UINT BufferCount ; // Number of Buffer descriptor chained + UINT TotalPacketLength ; // Self explained + PNDIS_BUFFER pFirstBuffer; // Pointer to first buffer descriptor +} PACKET_INFO, *PPACKET_INFO; + +// +// Tkip Key structure which RC4 key & MIC calculation +// +typedef struct _TKIP_KEY_INFO { + UINT nBytesInM; // # bytes in M for MICKEY + ULONG IV16; + ULONG IV32; + ULONG K0; // for MICKEY Low + ULONG K1; // for MICKEY Hig + ULONG L; // Current state for MICKEY + ULONG R; // Current state for MICKEY + ULONG M; // Message accumulator for MICKEY + UCHAR RC4KEY[16]; + UCHAR MIC[8]; +} TKIP_KEY_INFO, *PTKIP_KEY_INFO; + + +// +// Private / Misc data, counters for driver internal use +// +typedef struct __PRIVATE_STRUC { + UINT SystemResetCnt; // System reset counter + UINT TxRingFullCnt; // Tx ring full occurrance number + UINT PhyRxErrCnt; // PHY Rx error count, for debug purpose, might move to global counter + // Variables for WEP encryption / decryption in rtmp_wep.c + // Tkip stuff + TKIP_KEY_INFO Tx; + TKIP_KEY_INFO Rx; +} PRIVATE_STRUC, *PPRIVATE_STRUC; + + +/*************************************************************************** + * Channel and BBP related data structures + **************************************************************************/ +// structure to tune BBP R66 (BBP TUNING) +typedef struct _BBP_R66_TUNING { + BOOLEAN bEnable; + USHORT FalseCcaLowerThreshold; // default 100 + USHORT FalseCcaUpperThreshold; // default 512 + UCHAR R66Delta; + UCHAR R66CurrentValue; + BOOLEAN R66LowerUpperSelect; //Before LinkUp, Used LowerBound or UpperBound as R66 value. +} BBP_R66_TUNING, *PBBP_R66_TUNING; + +// structure to store channel TX power +typedef struct _CHANNEL_TX_POWER { + USHORT RemainingTimeForUse; //unit: sec + UCHAR Channel; +#ifdef DOT11N_DRAFT3 + BOOLEAN bEffectedChannel; // For BW 40 operating in 2.4GHz , the "effected channel" is the channel that is covered in 40Mhz. +#endif // DOT11N_DRAFT3 // + CHAR Power; + CHAR Power2; + UCHAR MaxTxPwr; + UCHAR DfsReq; + UCHAR RegulatoryDomain; + +/* + Channel property: + + CHANNEL_DISABLED: The channel is disabled. + CHANNEL_PASSIVE_SCAN: Only passive scanning is allowed. + CHANNEL_NO_IBSS: IBSS is not allowed. + CHANNEL_RADAR: Radar detection is required. + CHANNEL_NO_FAT_ABOVE: Extension channel above this channel is not allowed. + CHANNEL_NO_FAT_BELOW: Extension channel below this channel is not allowed. + */ +#define CHANNEL_DISABLED 0x01 /* no use */ +#define CHANNEL_PASSIVE_SCAN 0x02 +#define CHANNEL_NO_IBSS 0x04 +#define CHANNEL_RADAR 0x08 +#define CHANNEL_NO_FAT_ABOVE 0x10 +#define CHANNEL_NO_FAT_BELOW 0x20 + + UCHAR Flags; +} CHANNEL_TX_POWER, *PCHANNEL_TX_POWER; + +// structure to store 802.11j channel TX power +typedef struct _CHANNEL_11J_TX_POWER { + UCHAR Channel; + UCHAR BW; // BW_10 or BW_20 + CHAR Power; + CHAR Power2; + USHORT RemainingTimeForUse; //unit: sec +} CHANNEL_11J_TX_POWER, *PCHANNEL_11J_TX_POWER; + +typedef struct _SOFT_RX_ANT_DIVERSITY_STRUCT { + UCHAR EvaluatePeriod; // 0:not evalute status, 1: evaluate status, 2: switching status + UCHAR EvaluateStableCnt; + UCHAR Pair1PrimaryRxAnt; // 0:Ant-E1, 1:Ant-E2 + UCHAR Pair1SecondaryRxAnt; // 0:Ant-E1, 1:Ant-E2 + UCHAR Pair2PrimaryRxAnt; // 0:Ant-E3, 1:Ant-E4 + UCHAR Pair2SecondaryRxAnt; // 0:Ant-E3, 1:Ant-E4 +#ifdef CONFIG_STA_SUPPORT + SHORT Pair1AvgRssi[2]; // AvgRssi[0]:E1, AvgRssi[1]:E2 + SHORT Pair2AvgRssi[2]; // AvgRssi[0]:E3, AvgRssi[1]:E4 +#endif // CONFIG_STA_SUPPORT // + SHORT Pair1LastAvgRssi; // + SHORT Pair2LastAvgRssi; // + ULONG RcvPktNumWhenEvaluate; + BOOLEAN FirstPktArrivedWhenEvaluate; + RALINK_TIMER_STRUCT RxAntDiversityTimer; +} SOFT_RX_ANT_DIVERSITY, *PSOFT_RX_ANT_DIVERSITY; + + +/*************************************************************************** + * structure for radar detection and channel switch + **************************************************************************/ +typedef struct _RADAR_DETECT_STRUCT { + //BOOLEAN IEEE80211H; // 0: disable, 1: enable IEEE802.11h + UCHAR CSCount; //Channel switch counter + UCHAR CSPeriod; //Channel switch period (beacon count) + UCHAR RDCount; //Radar detection counter + UCHAR RDMode; //Radar Detection mode + UCHAR RDDurRegion; //Radar detection duration region + UCHAR BBPR16; + UCHAR BBPR17; + UCHAR BBPR18; + UCHAR BBPR21; + UCHAR BBPR22; + UCHAR BBPR64; + ULONG InServiceMonitorCount; // unit: sec + UINT8 DfsSessionTime; +#ifdef DFS_FCC_BW40_FIX + CHAR DfsSessionFccOff; +#endif + BOOLEAN bFastDfs; + UINT8 ChMovingTime; + UINT8 LongPulseRadarTh; +#ifdef MERGE_ARCH_TEAM + CHAR AvgRssiReq; + ULONG DfsLowerLimit; + ULONG DfsUpperLimit; + UINT8 FixDfsLimit; + ULONG upperlimit; + ULONG lowerlimit; +#endif // MERGE_ARCH_TEAM // +} RADAR_DETECT_STRUCT, *PRADAR_DETECT_STRUCT; + +#ifdef CARRIER_DETECTION_SUPPORT +typedef enum CD_STATE_n +{ + CD_NORMAL, + CD_SILENCE, + CD_MAX_STATE +} CD_STATE; + +#ifdef TONE_RADAR_DETECT_SUPPORT +#define CARRIER_DETECT_RECHECK_TIME 3 +#define CARRIER_DETECT_CRITIRIA 280 +#define CARRIER_DETECT_STOP_RATIO 2 +#define CARRIER_DETECT_STOP_RECHECK_TIME 4 +#define CARRIER_DETECT_CRITIRIA_A 230 +#define CARRIER_DETECT_DELTA 7 +#define CARRIER_DETECT_DIV_FLAG 0 +#define CARRIER_DETECT_THRESHOLD 0x0fffffff +#endif // TONE_RADAR_DETECT_SUPPORT // + +typedef struct CARRIER_DETECTION_s +{ + BOOLEAN Enable; + UINT8 CDSessionTime; + UINT8 CDPeriod; + CD_STATE CD_State; +#ifdef TONE_RADAR_DETECT_SUPPORT + UINT8 delta; + UINT8 div_flag; + UINT32 threshold; + UINT8 recheck; + UINT8 recheck1; + UINT8 recheck2; + UINT32 TimeStamp; + UINT32 criteria; + UINT32 CarrierDebug; + ULONG idle_time; + ULONG busy_time; + ULONG Debug; +#endif // TONE_RADAR_DETECT_SUPPORT // +}CARRIER_DETECTION_STRUCT, *PCARRIER_DETECTION_STRUCT; +#endif // CARRIER_DETECTION_SUPPORT // + + +#ifdef NEW_DFS +typedef struct _NewDFSDebug +{ + UCHAR channel; + ULONG wait_time; + UCHAR delta_delay_range; + UCHAR delta_delay_step; + UCHAR EL_range; + UCHAR EL_step; + UCHAR EH_range; + UCHAR EH_step; + UCHAR WL_range; + UCHAR WL_step; + UCHAR WH_range; + UCHAR WH_step; + ULONG T_expected; + ULONG T_margin; + UCHAR start; + ULONG count; + ULONG idx; + +}NewDFSDebug, *pNewDFSDebug; + +#define NEW_DFS_FCC_5_ENT_NUM 5 +#define NEW_DFS_DBG_PORT_ENT_NUM_POWER 8 +#define NEW_DFS_DBG_PORT_ENT_NUM (1 << NEW_DFS_DBG_PORT_ENT_NUM_POWER) // CE Debug Port entry number, 256 +#define NEW_DFS_DBG_PORT_MASK 0xff + +// Matched Period definition +#define NEW_DFS_MPERIOD_ENT_NUM_POWER 8 +#define NEW_DFS_MPERIOD_ENT_NUM (1 << NEW_DFS_MPERIOD_ENT_NUM_POWER) // CE Period Table entry number, 512 +#define NEW_DFS_MAX_CHANNEL 4 + +typedef struct _NewDFSDebugPort{ + ULONG counter; + ULONG timestamp; + USHORT width; + USHORT start_idx; // start index to period table + USHORT end_idx; // end index to period table +}NewDFSDebugPort, *pNewDFSDebugPort; + +// Matched Period Table +typedef struct _NewDFSMPeriod{ + USHORT idx; + USHORT width; + USHORT idx2; + USHORT width2; + ULONG period; +}NewDFSMPeriod, *pNewDFSMPeriod; + +#endif // NEW_DFS // + + +typedef enum _ABGBAND_STATE_ { + UNKNOWN_BAND, + BG_BAND, + A_BAND, +} ABGBAND_STATE; + +#ifdef CONFIG_STA_SUPPORT +#ifdef RTMP_MAC_PCI +// Power save method control +typedef union _PS_CONTROL { + struct { + ULONG EnablePSinIdle:1; // Enable radio off when not connect to AP. radio on only when sitesurvey, + ULONG EnableNewPS:1; // Enable new Chip power save fucntion . New method can only be applied in chip version after 2872. and PCIe. + ULONG rt30xxPowerMode:2; // Power Level Mode for rt30xx chip + ULONG rt30xxFollowHostASPM:1; // Card Follows Host's setting for rt30xx chip. + ULONG rt30xxForceASPMTest:1; // Force enable L1 for rt30xx chip. This has higher priority than rt30xxFollowHostASPM Mode. + ULONG rsv:26; // Radio Measurement Enable + } field; + ULONG word; +} PS_CONTROL, *PPS_CONTROL; +#endif // RTMP_MAC_PCI // +#endif // CONFIG_STA_SUPPORT // +/*************************************************************************** + * structure for MLME state machine + **************************************************************************/ +typedef struct _MLME_STRUCT { +#ifdef CONFIG_STA_SUPPORT + // STA state machines + STATE_MACHINE CntlMachine; + STATE_MACHINE AssocMachine; + STATE_MACHINE AuthMachine; + STATE_MACHINE AuthRspMachine; + STATE_MACHINE SyncMachine; + STATE_MACHINE WpaPskMachine; + STATE_MACHINE LeapMachine; + STATE_MACHINE_FUNC AssocFunc[ASSOC_FUNC_SIZE]; + STATE_MACHINE_FUNC AuthFunc[AUTH_FUNC_SIZE]; + STATE_MACHINE_FUNC AuthRspFunc[AUTH_RSP_FUNC_SIZE]; + STATE_MACHINE_FUNC SyncFunc[SYNC_FUNC_SIZE]; + +#endif // CONFIG_STA_SUPPORT // + STATE_MACHINE_FUNC ActFunc[ACT_FUNC_SIZE]; + // Action + STATE_MACHINE ActMachine; + + +#ifdef QOS_DLS_SUPPORT + STATE_MACHINE DlsMachine; + STATE_MACHINE_FUNC DlsFunc[DLS_FUNC_SIZE]; +#endif // QOS_DLS_SUPPORT // + + + + // common WPA state machine + STATE_MACHINE WpaMachine; + STATE_MACHINE_FUNC WpaFunc[WPA_FUNC_SIZE]; + + + + ULONG ChannelQuality; // 0..100, Channel Quality Indication for Roaming + ULONG Now32; // latch the value of NdisGetSystemUpTime() + ULONG LastSendNULLpsmTime; + + BOOLEAN bRunning; + NDIS_SPIN_LOCK TaskLock; + MLME_QUEUE Queue; + + UINT ShiftReg; + + RALINK_TIMER_STRUCT PeriodicTimer; + RALINK_TIMER_STRUCT APSDPeriodicTimer; + RALINK_TIMER_STRUCT LinkDownTimer; + RALINK_TIMER_STRUCT LinkUpTimer; +#ifdef RTMP_MAC_PCI + UCHAR bPsPollTimerRunning; + RALINK_TIMER_STRUCT PsPollTimer; + RALINK_TIMER_STRUCT RadioOnOffTimer; +#endif // RTMP_MAC_PCI // + ULONG PeriodicRound; + ULONG OneSecPeriodicRound; + + UCHAR RealRxPath; + BOOLEAN bLowThroughput; + BOOLEAN bEnableAutoAntennaCheck; + RALINK_TIMER_STRUCT RxAntEvalTimer; + +#ifdef RT30xx + UCHAR CaliBW40RfR24; + UCHAR CaliBW20RfR24; + UCHAR CaliBW20RfR31; + UCHAR CaliBW40RfR31; +#endif // RT30xx // + +} MLME_STRUCT, *PMLME_STRUCT; + + +#ifdef DOT11_N_SUPPORT +/*************************************************************************** + * 802.11 N related data structures + **************************************************************************/ +struct reordering_mpdu +{ + struct reordering_mpdu *next; + PNDIS_PACKET pPacket; /* coverted to 802.3 frame */ + int Sequence; /* sequence number of MPDU */ + BOOLEAN bAMSDU; +}; + +struct reordering_list +{ + struct reordering_mpdu *next; + int qlen; +}; + +struct reordering_mpdu_pool +{ + PVOID mem; + NDIS_SPIN_LOCK lock; + struct reordering_list freelist; +}; + +typedef enum _REC_BLOCKACK_STATUS +{ + Recipient_NONE=0, + Recipient_USED, + Recipient_HandleRes, + Recipient_Accept +} REC_BLOCKACK_STATUS, *PREC_BLOCKACK_STATUS; + +typedef enum _ORI_BLOCKACK_STATUS +{ + Originator_NONE=0, + Originator_USED, + Originator_WaitRes, + Originator_Done +} ORI_BLOCKACK_STATUS, *PORI_BLOCKACK_STATUS; + +typedef struct _BA_ORI_ENTRY{ + UCHAR Wcid; + UCHAR TID; + UCHAR BAWinSize; + UCHAR Token; +// Sequence is to fill every outgoing QoS DATA frame's sequence field in 802.11 header. + USHORT Sequence; + USHORT TimeOutValue; + ORI_BLOCKACK_STATUS ORI_BA_Status; + RALINK_TIMER_STRUCT ORIBATimer; + PVOID pAdapter; +} BA_ORI_ENTRY, *PBA_ORI_ENTRY; + +typedef struct _BA_REC_ENTRY { + UCHAR Wcid; + UCHAR TID; + UCHAR BAWinSize; // 7.3.1.14. each buffer is capable of holding a max AMSDU or MSDU. + //UCHAR NumOfRxPkt; + //UCHAR Curindidx; // the head in the RX reordering buffer + USHORT LastIndSeq; +// USHORT LastIndSeqAtTimer; + USHORT TimeOutValue; + RALINK_TIMER_STRUCT RECBATimer; + ULONG LastIndSeqAtTimer; + ULONG nDropPacket; + ULONG rcvSeq; + REC_BLOCKACK_STATUS REC_BA_Status; +// UCHAR RxBufIdxUsed; + // corresponding virtual address for RX reordering packet storage. + //RTMP_REORDERDMABUF MAP_RXBuf[MAX_RX_REORDERBUF]; + NDIS_SPIN_LOCK RxReRingLock; // Rx Ring spinlock +// struct _BA_REC_ENTRY *pNext; + PVOID pAdapter; + struct reordering_list list; +} BA_REC_ENTRY, *PBA_REC_ENTRY; + + +typedef struct { + ULONG numAsRecipient; // I am recipient of numAsRecipient clients. These client are in the BARecEntry[] + ULONG numAsOriginator; // I am originator of numAsOriginator clients. These clients are in the BAOriEntry[] + ULONG numDoneOriginator; // count Done Originator sessions + BA_ORI_ENTRY BAOriEntry[MAX_LEN_OF_BA_ORI_TABLE]; + BA_REC_ENTRY BARecEntry[MAX_LEN_OF_BA_REC_TABLE]; +} BA_TABLE, *PBA_TABLE; + +//For QureyBATableOID use; +typedef struct GNU_PACKED _OID_BA_REC_ENTRY{ + UCHAR MACAddr[MAC_ADDR_LEN]; + UCHAR BaBitmap; // if (BaBitmap&(1<<TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize + UCHAR rsv; + UCHAR BufSize[8]; + REC_BLOCKACK_STATUS REC_BA_Status[8]; +} OID_BA_REC_ENTRY, *POID_BA_REC_ENTRY; + +//For QureyBATableOID use; +typedef struct GNU_PACKED _OID_BA_ORI_ENTRY{ + UCHAR MACAddr[MAC_ADDR_LEN]; + UCHAR BaBitmap; // if (BaBitmap&(1<<TID)), this session with{MACAddr, TID}exists, so read BufSize[TID] for BufferSize, read ORI_BA_Status[TID] for status + UCHAR rsv; + UCHAR BufSize[8]; + ORI_BLOCKACK_STATUS ORI_BA_Status[8]; +} OID_BA_ORI_ENTRY, *POID_BA_ORI_ENTRY; + +typedef struct _QUERYBA_TABLE{ + OID_BA_ORI_ENTRY BAOriEntry[32]; + OID_BA_REC_ENTRY BARecEntry[32]; + UCHAR OriNum;// Number of below BAOriEntry + UCHAR RecNum;// Number of below BARecEntry +} QUERYBA_TABLE, *PQUERYBA_TABLE; + +typedef union _BACAP_STRUC { +#ifdef RT_BIG_ENDIAN + struct { + UINT32 :4; + UINT32 b2040CoexistScanSup:1; //As Sta, support do 2040 coexistence scan for AP. As Ap, support monitor trigger event to check if can use BW 40MHz. + UINT32 bHtAdhoc:1; // adhoc can use ht rate. + UINT32 MMPSmode:2; // MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable + UINT32 AmsduSize:1; // 0:3839, 1:7935 bytes. UINT MSDUSizeToBytes[] = { 3839, 7935}; + UINT32 AmsduEnable:1; //Enable AMSDU transmisstion + UINT32 MpduDensity:3; + UINT32 Policy:2; // 0: DELAY_BA 1:IMMED_BA (//BA Policy subfiled value in ADDBA frame) 2:BA-not use + UINT32 AutoBA:1; // automatically BA + UINT32 TxBAWinLimit:8; + UINT32 RxBAWinLimit:8; + } field; +#else + struct { + UINT32 RxBAWinLimit:8; + UINT32 TxBAWinLimit:8; + UINT32 AutoBA:1; // automatically BA + UINT32 Policy:2; // 0: DELAY_BA 1:IMMED_BA (//BA Policy subfiled value in ADDBA frame) 2:BA-not use + UINT32 MpduDensity:3; + UINT32 AmsduEnable:1; //Enable AMSDU transmisstion + UINT32 AmsduSize:1; // 0:3839, 1:7935 bytes. UINT MSDUSizeToBytes[] = { 3839, 7935}; + UINT32 MMPSmode:2; // MIMO power save more, 0:static, 1:dynamic, 2:rsv, 3:mimo enable + UINT32 bHtAdhoc:1; // adhoc can use ht rate. + UINT32 b2040CoexistScanSup:1; //As Sta, support do 2040 coexistence scan for AP. As Ap, support monitor trigger event to check if can use BW 40MHz. + UINT32 :4; + } field; +#endif + UINT32 word; +} BACAP_STRUC, *PBACAP_STRUC; + + +typedef struct { + BOOLEAN IsRecipient; + UCHAR MACAddr[MAC_ADDR_LEN]; + UCHAR TID; + UCHAR nMSDU; + USHORT TimeOut; + BOOLEAN bAllTid; // If True, delete all TID for BA sessions with this MACaddr. +} OID_ADD_BA_ENTRY, *POID_ADD_BA_ENTRY; + + +#ifdef DOT11N_DRAFT3 +typedef enum _BSS2040COEXIST_FLAG{ + BSS_2040_COEXIST_DISABLE = 0, + BSS_2040_COEXIST_TIMER_FIRED = 1, + BSS_2040_COEXIST_INFO_SYNC = 2, + BSS_2040_COEXIST_INFO_NOTIFY = 4, +}BSS2040COEXIST_FLAG; + +typedef struct _BssCoexChRange_{ + UCHAR primaryCh; + UCHAR secondaryCh; + UCHAR effectChStart; + UCHAR effectChEnd; +}BSS_COEX_CH_RANGE; +#endif // DOT11N_DRAFT3 // + +#define IS_HT_STA(_pMacEntry) \ + (_pMacEntry->MaxHTPhyMode.field.MODE >= MODE_HTMIX) + +#define IS_HT_RATE(_pMacEntry) \ + (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX) + +#define PEER_IS_HT_RATE(_pMacEntry) \ + (_pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX) + +#endif // DOT11_N_SUPPORT // + + +//This structure is for all 802.11n card InterOptibilityTest action. Reset all Num every n second. (Details see MLMEPeriodic) +typedef struct _IOT_STRUC { + UCHAR Threshold[2]; + UCHAR ReorderTimeOutNum[MAX_LEN_OF_BA_REC_TABLE]; // compare with threshold[0] + UCHAR RefreshNum[MAX_LEN_OF_BA_REC_TABLE]; // compare with threshold[1] + ULONG OneSecInWindowCount; + ULONG OneSecFrameDuplicateCount; + ULONG OneSecOutWindowCount; + UCHAR DelOriAct; + UCHAR DelRecAct; + UCHAR RTSShortProt; + UCHAR RTSLongProt; + BOOLEAN bRTSLongProtOn; +#ifdef CONFIG_STA_SUPPORT + BOOLEAN bLastAtheros; + BOOLEAN bCurrentAtheros; + BOOLEAN bNowAtherosBurstOn; + BOOLEAN bNextDisableRxBA; + BOOLEAN bToggle; +#endif // CONFIG_STA_SUPPORT // +} IOT_STRUC, *PIOT_STRUC; + + +// This is the registry setting for 802.11n transmit setting. Used in advanced page. +typedef union _REG_TRANSMIT_SETTING { +#ifdef RT_BIG_ENDIAN + struct { + UINT32 rsv:13; + UINT32 EXTCHA:2; + UINT32 HTMODE:1; + UINT32 TRANSNO:2; + UINT32 STBC:1; //SPACE + UINT32 ShortGI:1; + UINT32 BW:1; //channel bandwidth 20MHz or 40 MHz + UINT32 TxBF:1; // 3*3 + UINT32 rsv0:10; + //UINT32 MCS:7; // MCS + //UINT32 PhyMode:4; + } field; +#else + struct { + //UINT32 PhyMode:4; + //UINT32 MCS:7; // MCS + UINT32 rsv0:10; + UINT32 TxBF:1; + UINT32 BW:1; //channel bandwidth 20MHz or 40 MHz + UINT32 ShortGI:1; + UINT32 STBC:1; //SPACE + UINT32 TRANSNO:2; + UINT32 HTMODE:1; + UINT32 EXTCHA:2; + UINT32 rsv:13; + } field; +#endif + UINT32 word; +} REG_TRANSMIT_SETTING, *PREG_TRANSMIT_SETTING; + + +typedef union _DESIRED_TRANSMIT_SETTING { +#ifdef RT_BIG_ENDIAN + struct { + USHORT rsv:3; + USHORT FixedTxMode:2; // If MCS isn't AUTO, fix rate in CCK, OFDM or HT mode. + USHORT PhyMode:4; + USHORT MCS:7; // MCS + } field; +#else + struct { + USHORT MCS:7; // MCS + USHORT PhyMode:4; + USHORT FixedTxMode:2; // If MCS isn't AUTO, fix rate in CCK, OFDM or HT mode. + USHORT rsv:3; + } field; +#endif + USHORT word; + } DESIRED_TRANSMIT_SETTING, *PDESIRED_TRANSMIT_SETTING; + + + + +/*************************************************************************** + * Multiple SSID related data structures + **************************************************************************/ +#define WLAN_MAX_NUM_OF_TIM ((MAX_LEN_OF_MAC_TABLE >> 3) + 1) /* /8 + 1 */ +#define WLAN_CT_TIM_BCMC_OFFSET 0 /* unit: 32B */ + +/* clear bcmc TIM bit */ +#define WLAN_MR_TIM_BCMC_CLEAR(apidx) \ + pAd->ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] &= ~BIT8[0]; + +/* set bcmc TIM bit */ +#define WLAN_MR_TIM_BCMC_SET(apidx) \ + pAd->ApCfg.MBSSID[apidx].TimBitmaps[WLAN_CT_TIM_BCMC_OFFSET] |= BIT8[0]; + +/* clear a station PS TIM bit */ +#define WLAN_MR_TIM_BIT_CLEAR(ad_p, apidx, wcid) \ + { UCHAR tim_offset = wcid >> 3; \ + UCHAR bit_offset = wcid & 0x7; \ + ad_p->ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] &= (~BIT8[bit_offset]); } + +/* set a station PS TIM bit */ +#define WLAN_MR_TIM_BIT_SET(ad_p, apidx, wcid) \ + { UCHAR tim_offset = wcid >> 3; \ + UCHAR bit_offset = wcid & 0x7; \ + ad_p->ApCfg.MBSSID[apidx].TimBitmaps[tim_offset] |= BIT8[bit_offset]; } + + +// configuration common to OPMODE_AP as well as OPMODE_STA +typedef struct _COMMON_CONFIG { + + BOOLEAN bCountryFlag; + UCHAR CountryCode[3]; +#ifdef EXT_BUILD_CHANNEL_LIST + UCHAR Geography; +#endif // EXT_BUILD_CHANNEL_LIST // + UCHAR CountryRegion; // Enum of country region, 0:FCC, 1:IC, 2:ETSI, 3:SPAIN, 4:France, 5:MKK, 6:MKK1, 7:Israel + UCHAR CountryRegionForABand; // Enum of country region for A band + UCHAR PhyMode; // PHY_11A, PHY_11B, PHY_11BG_MIXED, PHY_ABG_MIXED + UCHAR DesiredPhyMode; // PHY_11A, PHY_11B, PHY_11BG_MIXED, PHY_ABG_MIXED + USHORT Dsifs; // in units of usec + ULONG PacketFilter; // Packet filter for receiving + UINT8 RegulatoryClass[MAX_NUM_OF_REGULATORY_CLASS]; + + CHAR Ssid[MAX_LEN_OF_SSID]; // NOT NULL-terminated + UCHAR SsidLen; // the actual ssid length in used + UCHAR LastSsidLen; // the actual ssid length in used + CHAR LastSsid[MAX_LEN_OF_SSID]; // NOT NULL-terminated + UCHAR LastBssid[MAC_ADDR_LEN]; + + UCHAR Bssid[MAC_ADDR_LEN]; + USHORT BeaconPeriod; + UCHAR Channel; + UCHAR CentralChannel; // Central Channel when using 40MHz is indicating. not real channel. + + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR SupRateLen; + UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR ExtRateLen; + UCHAR DesireRate[MAX_LEN_OF_SUPPORTED_RATES]; // OID_802_11_DESIRED_RATES + UCHAR MaxDesiredRate; + UCHAR ExpectedACKRate[MAX_LEN_OF_SUPPORTED_RATES]; + + ULONG BasicRateBitmap; // backup basic ratebitmap + + BOOLEAN bAPSDCapable; + BOOLEAN bInServicePeriod; + BOOLEAN bAPSDAC_BE; + BOOLEAN bAPSDAC_BK; + BOOLEAN bAPSDAC_VI; + BOOLEAN bAPSDAC_VO; + + /* because TSPEC can modify the APSD flag, we need to keep the APSD flag + requested in association stage from the station; + we need to recover the APSD flag after the TSPEC is deleted. */ + BOOLEAN bACMAPSDBackup[4]; /* for delivery-enabled & trigger-enabled both */ + BOOLEAN bACMAPSDTr[4]; /* no use */ + + BOOLEAN bNeedSendTriggerFrame; + BOOLEAN bAPSDForcePowerSave; // Force power save mode, should only use in APSD-STAUT + ULONG TriggerTimerCount; + UCHAR MaxSPLength; + UCHAR BBPCurrentBW; // BW_10, BW_20, BW_40 + // move to MULTISSID_STRUCT for MBSS + //HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI. + REG_TRANSMIT_SETTING RegTransmitSetting; //registry transmit setting. this is for reading registry setting only. not useful. + //UCHAR FixedTxMode; // Fixed Tx Mode (CCK, OFDM), for HT fixed tx mode (GF, MIX) , refer to RegTransmitSetting.field.HTMode + UCHAR TxRate; // Same value to fill in TXD. TxRate is 6-bit + UCHAR MaxTxRate; // RATE_1, RATE_2, RATE_5_5, RATE_11 + UCHAR TxRateIndex; // Tx rate index in RateSwitchTable + UCHAR TxRateTableSize; // Valid Tx rate table size in RateSwitchTable + //BOOLEAN bAutoTxRateSwitch; + UCHAR MinTxRate; // RATE_1, RATE_2, RATE_5_5, RATE_11 + UCHAR RtsRate; // RATE_xxx + HTTRANSMIT_SETTING MlmeTransmit; // MGMT frame PHY rate setting when operatin at Ht rate. + UCHAR MlmeRate; // RATE_xxx, used to send MLME frames + UCHAR BasicMlmeRate; // Default Rate for sending MLME frames + + USHORT RtsThreshold; // in unit of BYTE + USHORT FragmentThreshold; // in unit of BYTE + + UCHAR TxPower; // in unit of mW + ULONG TxPowerPercentage; // 0~100 % + ULONG TxPowerDefault; // keep for TxPowerPercentage + UINT8 PwrConstraint; + +#ifdef DOT11_N_SUPPORT + BACAP_STRUC BACapability; // NO USE = 0XFF ; IMMED_BA =1 ; DELAY_BA=0 + BACAP_STRUC REGBACapability; // NO USE = 0XFF ; IMMED_BA =1 ; DELAY_BA=0 +#endif // DOT11_N_SUPPORT // + IOT_STRUC IOTestParm; // 802.11n InterOpbility Test Parameter; + ULONG TxPreamble; // Rt802_11PreambleLong, Rt802_11PreambleShort, Rt802_11PreambleAuto + BOOLEAN bUseZeroToDisableFragment; // Microsoft use 0 as disable + ULONG UseBGProtection; // 0: auto, 1: always use, 2: always not use + BOOLEAN bUseShortSlotTime; // 0: disable, 1 - use short slot (9us) + BOOLEAN bEnableTxBurst; // 1: enble TX PACKET BURST (when BA is established or AP is not a legacy WMM AP), 0: disable TX PACKET BURST + BOOLEAN bAggregationCapable; // 1: enable TX aggregation when the peer supports it + BOOLEAN bPiggyBackCapable; // 1: enable TX piggy-back according MAC's version + BOOLEAN bIEEE80211H; // 1: enable IEEE802.11h spec. + ULONG DisableOLBCDetect; // 0: enable OLBC detect; 1 disable OLBC detect + +#ifdef DOT11_N_SUPPORT + BOOLEAN bRdg; +#endif // DOT11_N_SUPPORT // + BOOLEAN bWmmCapable; // 0:disable WMM, 1:enable WMM + QOS_CAPABILITY_PARM APQosCapability; // QOS capability of the current associated AP + EDCA_PARM APEdcaParm; // EDCA parameters of the current associated AP + QBSS_LOAD_PARM APQbssLoad; // QBSS load of the current associated AP + UCHAR AckPolicy[4]; // ACK policy of the specified AC. see ACK_xxx +#ifdef CONFIG_STA_SUPPORT + BOOLEAN bDLSCapable; // 0:disable DLS, 1:enable DLS +#endif // CONFIG_STA_SUPPORT // + // a bitmap of BOOLEAN flags. each bit represent an operation status of a particular + // BOOLEAN control, either ON or OFF. These flags should always be accessed via + // OPSTATUS_TEST_FLAG(), OPSTATUS_SET_FLAG(), OP_STATUS_CLEAR_FLAG() macros. + // see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition + ULONG OpStatusFlags; + + BOOLEAN NdisRadioStateOff; //For HCT 12.0, set this flag to TRUE instead of called MlmeRadioOff. + ABGBAND_STATE BandState; // For setting BBP used on B/G or A mode. + + // IEEE802.11H--DFS. + RADAR_DETECT_STRUCT RadarDetect; + +#ifdef CARRIER_DETECTION_SUPPORT + CARRIER_DETECTION_STRUCT CarrierDetect; +#endif // CARRIER_DETECTION_SUPPORT // + +#ifdef DOT11_N_SUPPORT + // HT + UCHAR BASize; // USer desired BAWindowSize. Should not exceed our max capability + //RT_HT_CAPABILITY SupportedHtPhy; + RT_HT_CAPABILITY DesiredHtPhy; + HT_CAPABILITY_IE HtCapability; + ADD_HT_INFO_IE AddHTInfo; // Useful as AP. + //This IE is used with channel switch announcement element when changing to a new 40MHz. + //This IE is included in channel switch ammouncement frames 7.4.1.5, beacons, probe Rsp. + NEW_EXT_CHAN_IE NewExtChanOffset; //7.3.2.20A, 1 if extension channel is above the control channel, 3 if below, 0 if not present + + EXT_CAP_INFO_ELEMENT ExtCapIE; // this is the extened capibility IE appreed in MGMT frames. Doesn't need to update once set in Init. + +#ifdef DOT11N_DRAFT3 + BOOLEAN bBssCoexEnable; + UCHAR Bss2040CoexistFlag; // bit 0: bBssCoexistTimerRunning, bit 1: NeedSyncAddHtInfo. + RALINK_TIMER_STRUCT Bss2040CoexistTimer; + + //This IE is used for 20/40 BSS Coexistence. + BSS_2040_COEXIST_IE BSS2040CoexistInfo; + // ====== 11n D3.0 =======================> + USHORT Dot11OBssScanPassiveDwell; // Unit : TU. 5~1000 + USHORT Dot11OBssScanActiveDwell; // Unit : TU. 10~1000 + USHORT Dot11BssWidthTriggerScanInt; // Unit : Second + USHORT Dot11OBssScanPassiveTotalPerChannel; // Unit : TU. 200~10000 + USHORT Dot11OBssScanActiveTotalPerChannel; // Unit : TU. 20~10000 + USHORT Dot11BssWidthChanTranDelayFactor; + USHORT Dot11OBssScanActivityThre; // Unit : percentage + + ULONG Dot11BssWidthChanTranDelay; // multiple of (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor) + ULONG CountDownCtr; // CountDown Counter from (Dot11BssWidthTriggerScanInt * Dot11BssWidthChanTranDelayFactor) + + NDIS_SPIN_LOCK TriggerEventTabLock; + BSS_2040_COEXIST_IE LastBSSCoexist2040; + BSS_2040_COEXIST_IE BSSCoexist2040; + TRIGGER_EVENT_TAB TriggerEventTab; + UCHAR ChannelListIdx; + // <====== 11n D3.0 ======================= + BOOLEAN bOverlapScanning; + BOOLEAN bBssCoexNotify; +#endif // DOT11N_DRAFT3 // + + BOOLEAN bHTProtect; + BOOLEAN bMIMOPSEnable; + BOOLEAN bBADecline; + BOOLEAN bDisableReordering; + BOOLEAN bForty_Mhz_Intolerant; + BOOLEAN bExtChannelSwitchAnnouncement; + BOOLEAN bRcvBSSWidthTriggerEvents; + ULONG LastRcvBSSWidthTriggerEventsTime; + + UCHAR TxBASize; +#endif // DOT11_N_SUPPORT // + +#ifdef SYSTEM_LOG_SUPPORT + // Enable wireless event + BOOLEAN bWirelessEvent; +#endif // SYSTEM_LOG_SUPPORT // + + BOOLEAN bWiFiTest; // Enable this parameter for WiFi test + + // Tx & Rx Stream number selection + UCHAR TxStream; + UCHAR RxStream; + + // transmit phy mode, trasmit rate for Multicast. +#ifdef MCAST_RATE_SPECIFIC + UCHAR McastTransmitMcs; + UCHAR McastTransmitPhyMode; +#endif // MCAST_RATE_SPECIFIC // + + BOOLEAN bHardwareRadio; // Hardware controlled Radio enabled + + + + NDIS_SPIN_LOCK MeasureReqTabLock; + PMEASURE_REQ_TAB pMeasureReqTab; + + NDIS_SPIN_LOCK TpcReqTabLock; + PTPC_REQ_TAB pTpcReqTab; + + // transmit phy mode, trasmit rate for Multicast. +#ifdef MCAST_RATE_SPECIFIC + HTTRANSMIT_SETTING MCastPhyMode; +#endif // MCAST_RATE_SPECIFIC // + +#ifdef SINGLE_SKU + UINT16 DefineMaxTxPwr; + BOOLEAN bSKUMode; + UINT16 AntGain; + UINT16 BandedgeDelta; +#endif // SINGLE_SKU // + + + +#if defined(RT305x)||defined(RT30xx) + // request by Gary, for High Power issue + UCHAR HighPowerPatchDisabled; +#endif + + BOOLEAN HT_DisallowTKIP; /* Restrict the encryption type in 11n HT mode */ + + BOOLEAN HT_Disable; /* 1: disable HT function; 0: enable HT function */ +} COMMON_CONFIG, *PCOMMON_CONFIG; + + +#ifdef CONFIG_STA_SUPPORT +/* Modified by Wu Xi-Kun 4/21/2006 */ +// STA configuration and status +typedef struct _STA_ADMIN_CONFIG { + // GROUP 1 - + // User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe + // the user intended configuration, but not necessary fully equal to the final + // settings in ACTIVE BSS after negotiation/compromize with the BSS holder (either + // AP or IBSS holder). + // Once initialized, user configuration can only be changed via OID_xxx + UCHAR BssType; // BSS_INFRA or BSS_ADHOC + USHORT AtimWin; // used when starting a new IBSS + + // GROUP 2 - + // User configuration loaded from Registry, E2PROM or OID_xxx. These settings describe + // the user intended configuration, and should be always applied to the final + // settings in ACTIVE BSS without compromising with the BSS holder. + // Once initialized, user configuration can only be changed via OID_xxx + UCHAR RssiTrigger; + UCHAR RssiTriggerMode; // RSSI_TRIGGERED_UPON_BELOW_THRESHOLD or RSSI_TRIGGERED_UPON_EXCCEED_THRESHOLD + USHORT DefaultListenCount; // default listen count; + ULONG WindowsPowerMode; // Power mode for AC power + ULONG WindowsBatteryPowerMode; // Power mode for battery if exists + BOOLEAN bWindowsACCAMEnable; // Enable CAM power mode when AC on + BOOLEAN bAutoReconnect; // Set to TRUE when setting OID_802_11_SSID with no matching BSSID + ULONG WindowsPowerProfile; // Windows power profile, for NDIS5.1 PnP + + // MIB:ieee802dot11.dot11smt(1).dot11StationConfigTable(1) + USHORT Psm; // power management mode (PWR_ACTIVE|PWR_SAVE) + USHORT DisassocReason; + UCHAR DisassocSta[MAC_ADDR_LEN]; + USHORT DeauthReason; + UCHAR DeauthSta[MAC_ADDR_LEN]; + USHORT AuthFailReason; + UCHAR AuthFailSta[MAC_ADDR_LEN]; + + NDIS_802_11_PRIVACY_FILTER PrivacyFilter; // PrivacyFilter enum for 802.1X + NDIS_802_11_AUTHENTICATION_MODE AuthMode; // This should match to whatever microsoft defined + NDIS_802_11_WEP_STATUS WepStatus; + NDIS_802_11_WEP_STATUS OrigWepStatus; // Original wep status set from OID + + // Add to support different cipher suite for WPA2/WPA mode + NDIS_802_11_ENCRYPTION_STATUS GroupCipher; // Multicast cipher suite + NDIS_802_11_ENCRYPTION_STATUS PairCipher; // Unicast cipher suite + BOOLEAN bMixCipher; // Indicate current Pair & Group use different cipher suites + USHORT RsnCapability; + + NDIS_802_11_WEP_STATUS GroupKeyWepStatus; + + UCHAR WpaPassPhrase[64]; // WPA PSK pass phrase + UINT WpaPassPhraseLen; // the length of WPA PSK pass phrase + UCHAR PMK[LEN_PMK]; // WPA PSK mode PMK + UCHAR PTK[LEN_PTK]; // WPA PSK mode PTK + UCHAR GMK[LEN_GMK]; // WPA PSK mode GMK + UCHAR GTK[MAX_LEN_GTK]; // GTK from authenticator + UCHAR GNonce[32]; // GNonce for WPA2PSK from authenticator + CIPHER_KEY TxGTK; + BSSID_INFO SavedPMK[PMKID_NO]; + UINT SavedPMKNum; // Saved PMKID number + + UCHAR DefaultKeyId; + + + // WPA 802.1x port control, WPA_802_1X_PORT_SECURED, WPA_802_1X_PORT_NOT_SECURED + UCHAR PortSecured; + + // For WPA countermeasures + ULONG LastMicErrorTime; // record last MIC error time + ULONG MicErrCnt; // Should be 0, 1, 2, then reset to zero (after disassoiciation). + BOOLEAN bBlockAssoc; // Block associate attempt for 60 seconds after counter measure occurred. + // For WPA-PSK supplicant state + UINT8 WpaState; // Default is SS_NOTUSE and handled by microsoft 802.1x + UCHAR ReplayCounter[8]; + UCHAR ANonce[32]; // ANonce for WPA-PSK from aurhenticator + UCHAR SNonce[32]; // SNonce for WPA-PSK + + UCHAR LastSNR0; // last received BEACON's SNR + UCHAR LastSNR1; // last received BEACON's SNR for 2nd antenna + RSSI_SAMPLE RssiSample; + ULONG NumOfAvgRssiSample; + + ULONG LastBeaconRxTime; // OS's timestamp of the last BEACON RX time + ULONG Last11bBeaconRxTime; // OS's timestamp of the last 11B BEACON RX time + ULONG Last11gBeaconRxTime; // OS's timestamp of the last 11G BEACON RX time + ULONG Last20NBeaconRxTime; // OS's timestamp of the last 20MHz N BEACON RX time + + ULONG LastScanTime; // Record last scan time for issue BSSID_SCAN_LIST + ULONG ScanCnt; // Scan counts since most recent SSID, BSSID, SCAN OID request + BOOLEAN bNotFirstScan; // Sam add for ADHOC flag to do first scan when do initialization + BOOLEAN bSwRadio; // Software controlled Radio On/Off, TRUE: On + BOOLEAN bHwRadio; // Hardware controlled Radio On/Off, TRUE: On + BOOLEAN bRadio; // Radio state, And of Sw & Hw radio state + BOOLEAN bHardwareRadio; // Hardware controlled Radio enabled + BOOLEAN bShowHiddenSSID; // Show all known SSID in SSID list get operation + + // New for WPA, windows want us to to keep association information and + // Fixed IEs from last association response + NDIS_802_11_ASSOCIATION_INFORMATION AssocInfo; + USHORT ReqVarIELen; // Length of next VIE include EID & Length + UCHAR ReqVarIEs[MAX_VIE_LEN]; // The content saved here should be little-endian format. + USHORT ResVarIELen; // Length of next VIE include EID & Length + UCHAR ResVarIEs[MAX_VIE_LEN]; + + UCHAR RSNIE_Len; + UCHAR RSN_IE[MAX_LEN_OF_RSNIE]; // The content saved here should be little-endian format. + + ULONG CLBusyBytes; // Save the total bytes received durning channel load scan time + USHORT RPIDensity[8]; // Array for RPI density collection + + UCHAR RMReqCnt; // Number of measurement request saved. + UCHAR CurrentRMReqIdx; // Number of measurement request saved. + BOOLEAN ParallelReq; // Parallel measurement, only one request performed, + // It must be the same channel with maximum duration + USHORT ParallelDuration; // Maximum duration for parallel measurement + UCHAR ParallelChannel; // Only one channel with parallel measurement + USHORT IAPPToken; // IAPP dialog token + // Hack for channel load and noise histogram parameters + UCHAR NHFactor; // Parameter for Noise histogram + UCHAR CLFactor; // Parameter for channel load + + RALINK_TIMER_STRUCT StaQuickResponeForRateUpTimer; + BOOLEAN StaQuickResponeForRateUpTimerRunning; + + UCHAR DtimCount; // 0.. DtimPeriod-1 + UCHAR DtimPeriod; // default = 3 + +#ifdef QOS_DLS_SUPPORT + RT_802_11_DLS DLSEntry[MAX_NUM_OF_DLS_ENTRY]; + UCHAR DlsReplayCounter[8]; +#endif // QOS_DLS_SUPPORT // + + BOOLEAN bTDLSCapable; // 0:disable TDLS, 1:enable TDLS + //////////////////////////////////////////////////////////////////////////////////////// + // This is only for WHQL test. + BOOLEAN WhqlTest; + //////////////////////////////////////////////////////////////////////////////////////// + + RALINK_TIMER_STRUCT WpaDisassocAndBlockAssocTimer; + // Fast Roaming + BOOLEAN bAutoRoaming; // 0:disable auto roaming by RSSI, 1:enable auto roaming by RSSI + CHAR dBmToRoam; // the condition to roam when receiving Rssi less than this value. It's negative value. + +#ifdef WPA_SUPPLICANT_SUPPORT + BOOLEAN IEEE8021X; + BOOLEAN IEEE8021x_required_keys; + CIPHER_KEY DesireSharedKey[4]; // Record user desired WEP keys + UCHAR DesireSharedKeyId; + + // 0x00: driver ignores wpa_supplicant + // 0x01: wpa_supplicant initiates scanning and AP selection + // 0x02: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters + // 0x80: wpa_supplicant trigger driver to do WPS + UCHAR WpaSupplicantUP; + UCHAR WpaSupplicantScanCount; + BOOLEAN bRSN_IE_FromWpaSupplicant; + BOOLEAN bLostAp; + UCHAR *pWpsProbeReqIe; + UINT WpsProbeReqIeLen; + UCHAR *pWpaAssocIe; + UINT WpaAssocIeLen; +#endif // WPA_SUPPLICANT_SUPPORT // + + CHAR dev_name[16]; + USHORT OriDevType; + + BOOLEAN bTGnWifiTest; + BOOLEAN bScanReqIsFromWebUI; + + HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI. + DESIRED_TRANSMIT_SETTING DesiredTransmitSetting; + RT_HT_PHY_INFO DesiredHtPhyInfo; + BOOLEAN bAutoTxRateSwitch; + +#ifdef RTMP_MAC_PCI + UCHAR BBPR3; + // PS Control has 2 meanings for advanced power save function. + // 1. EnablePSinIdle : When no connection, always radio off except need to do site survey. + // 2. EnableNewPS : will save more current in sleep or radio off mode. + PS_CONTROL PSControl; +#endif // RTMP_MAC_PCI // + +#ifdef EXT_BUILD_CHANNEL_LIST + UCHAR IEEE80211dClientMode; + UCHAR StaOriCountryCode[3]; + UCHAR StaOriGeography; +#endif // EXT_BUILD_CHANNEL_LIST // + + + + + + BOOLEAN bAutoConnectByBssid; + ULONG BeaconLostTime; // seconds + BOOLEAN bForceTxBurst; // 1: force enble TX PACKET BURST, 0: disable +#ifdef XLINK_SUPPORT + BOOLEAN PSPXlink; // 0: Disable. 1: Enable +#endif // XLINK_SUPPORT // + BOOLEAN bAutoConnectIfNoSSID; +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + UCHAR RegClass; //IE_SUPP_REG_CLASS: 2009 PF#3: For 20/40 Intolerant Channel Report +#endif // DOT11N_DRAFT3 // + BOOLEAN bAdhocN; +#endif // DOT11_N_SUPPORT // +} STA_ADMIN_CONFIG, *PSTA_ADMIN_CONFIG; + +// This data structure keep the current active BSS/IBSS's configuration that this STA +// had agreed upon joining the network. Which means these parameters are usually decided +// by the BSS/IBSS creator instead of user configuration. Data in this data structurre +// is valid only when either ADHOC_ON(pAd) or INFRA_ON(pAd) is TRUE. +// Normally, after SCAN or failed roaming attempts, we need to recover back to +// the current active settings. +typedef struct _STA_ACTIVE_CONFIG { + USHORT Aid; + USHORT AtimWin; // in kusec; IBSS parameter set element + USHORT CapabilityInfo; + USHORT CfpMaxDuration; + USHORT CfpPeriod; + + // Copy supported rate from desired AP's beacon. We are trying to match + // AP's supported and extended rate settings. + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR SupRateLen; + UCHAR ExtRateLen; + // Copy supported ht from desired AP's beacon. We are trying to match + RT_HT_PHY_INFO SupportedPhyInfo; + RT_HT_CAPABILITY SupportedHtPhy; +} STA_ACTIVE_CONFIG, *PSTA_ACTIVE_CONFIG; + + + +#endif // CONFIG_STA_SUPPORT // + + + +typedef struct _FOUR_WAY_HANDSHAKE_PROFILE { + UINT8 Role; // Authenticator or Supplicant + UINT8 WpaState; + UCHAR RxMsgType; //Now receive message type + UCHAR TxMsgType; //Will transmit message type + PUCHAR pBssid; + PUCHAR AA; //Authenticator address + PUCHAR SPA; //Supplicant address + UCHAR ANonce[LEN_KEY_DESC_NONCE]; + UCHAR SNonce[LEN_KEY_DESC_NONCE]; + UCHAR GNonce[LEN_KEY_DESC_NONCE]; + UCHAR ReplayCounter[LEN_KEY_DESC_REPLAY]; + PUCHAR pPMK; // WPA PSK mode PMK + UCHAR PTK[80]; // Don't modify the size + PUCHAR pGTK; // WPA PSK mode PMK + UCHAR DefaultKeyId; + UCHAR TxTsc[6]; + UCHAR RSNIELen; + PUCHAR pRSN_IE; // The content saved here should be little-endian format. + UCHAR GroupCipher; + RALINK_TIMER_STRUCT MsgRetryTimer; + UCHAR MsgRetryCounter; + ULONG MsgRetryTimeInterval; +} FOUR_WAY_HANDSHAKE_PROFILE, *PFOUR_WAY_HANDSHAKE_PROFILE; + +typedef struct _MAC_TABLE_ENTRY { + /* + 0:Invalid, + Bit 0: AsCli, Bit 1: AsWds, Bit 2: AsAPCLI, + Bit 3: AsMesh, Bit 4: AsDls, Bit 5: AsTDls + */ + UINT32 EntryType; + BOOLEAN isCached; + BOOLEAN bIAmBadAtheros; // Flag if this is Atheros chip that has IOT problem. We need to turn on RTS/CTS protection. + + /* WPA/WPA2 4-way database */ + UCHAR EnqueueEapolStartTimerRunning; // Enqueue EAPoL-Start for triggering EAP SM + RALINK_TIMER_STRUCT EnqueueStartForPSKTimer; // A timer which enqueue EAPoL-Start for triggering PSK SM + UINT8 WpaRole; + PFOUR_WAY_HANDSHAKE_PROFILE pWPA_Supplicant; + PFOUR_WAY_HANDSHAKE_PROFILE pWPA_Authenticator; + CIPHER_KEY RxGTK; + + //jan for wpa + // record which entry revoke MIC Failure , if it leaves the BSS itself, AP won't update aMICFailTime MIB + UCHAR CMTimerRunning; + UCHAR apidx; // MBSS number + UCHAR RSNIE_Len; + UCHAR RSN_IE[MAX_LEN_OF_RSNIE]; + UCHAR ANonce[LEN_KEY_DESC_NONCE]; + UCHAR SNonce[LEN_KEY_DESC_NONCE]; + UCHAR R_Counter[LEN_KEY_DESC_REPLAY]; + UCHAR PTK[64]; + UCHAR ReTryCounter; + RALINK_TIMER_STRUCT RetryTimer; + NDIS_802_11_AUTHENTICATION_MODE AuthMode; // This should match to whatever microsoft defined + NDIS_802_11_WEP_STATUS WepStatus; + NDIS_802_11_WEP_STATUS GroupKeyWepStatus; + UINT8 WpaState; + UINT8 GTKState; + USHORT PortSecured; + NDIS_802_11_PRIVACY_FILTER PrivacyFilter; // PrivacyFilter enum for 802.1X + CIPHER_KEY PairwiseKey; + PVOID pAd; + INT PMKID_CacheIdx; + UCHAR PMKID[LEN_PMKID]; + UCHAR NegotiatedAKM[LEN_OUI_SUITE]; // It indicate the negotiated AKM suite + + + UCHAR Addr[MAC_ADDR_LEN]; + UCHAR PsMode; + SST Sst; + AUTH_STATE AuthState; // for SHARED KEY authentication state machine used only + BOOLEAN IsReassocSta; // Indicate whether this is a reassociation procedure + USHORT Aid; + USHORT CapabilityInfo; + UCHAR LastRssi; + ULONG NoDataIdleCount; + UINT16 StationKeepAliveCount; // unit: second + ULONG PsQIdleCount; + QUEUE_HEADER PsQueue; + + UINT32 StaConnectTime; // the live time of this station since associated with AP + UINT32 StaIdleTimeout; /* idle timeout per entry */ + + +#ifdef DOT11_N_SUPPORT + BOOLEAN bSendBAR; + USHORT NoBADataCountDown; + + UINT32 CachedBuf[16]; // UINT (4 bytes) for alignment + UINT TxBFCount; // 3*3 +#endif // DOT11_N_SUPPORT // + UINT FIFOCount; + UINT DebugFIFOCount; + UINT DebugTxCount; + BOOLEAN bDlsInit; + + +//==================================================== +//WDS entry needs these +// if ValidAsWDS==TRUE, MatchWDSTabIdx is the index in WdsTab.MacTab + UINT MatchWDSTabIdx; + UCHAR MaxSupportedRate; + UCHAR CurrTxRate; + UCHAR CurrTxRateIndex; + // to record the each TX rate's quality. 0 is best, the bigger the worse. + USHORT TxQuality[MAX_STEP_OF_TX_RATE_SWITCH]; +// USHORT OneSecTxOkCount; + UINT32 OneSecTxNoRetryOkCount; + UINT32 OneSecTxRetryOkCount; + UINT32 OneSecTxFailCount; + UINT32 ContinueTxFailCnt; + UINT32 CurrTxRateStableTime; // # of second in current TX rate + UCHAR TxRateUpPenalty; // extra # of second penalty due to last unstable condition +#ifdef WDS_SUPPORT + BOOLEAN LockEntryTx; // TRUE = block to WDS Entry traffic, FALSE = not. + ULONG TimeStamp_toTxRing; +#endif // WDS_SUPPORT // + +//==================================================== + + + +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT + UINT MatchDlsEntryIdx; // indicate the index in pAd->StaCfg.DLSEntry +#endif // QOS_DLS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + BOOLEAN fNoisyEnvironment; + BOOLEAN fLastSecAccordingRSSI; + UCHAR LastSecTxRateChangeAction; // 0: no change, 1:rate UP, 2:rate down + CHAR LastTimeTxRateChangeAction; //Keep last time value of LastSecTxRateChangeAction + ULONG LastTxOkCount; + UCHAR PER[MAX_STEP_OF_TX_RATE_SWITCH]; + + // a bitmap of BOOLEAN flags. each bit represent an operation status of a particular + // BOOLEAN control, either ON or OFF. These flags should always be accessed via + // CLIENT_STATUS_TEST_FLAG(), CLIENT_STATUS_SET_FLAG(), CLIENT_STATUS_CLEAR_FLAG() macros. + // see fOP_STATUS_xxx in RTMP_DEF.C for detail bit definition. fCLIENT_STATUS_AMSDU_INUSED + ULONG ClientStatusFlags; + + HTTRANSMIT_SETTING HTPhyMode, MaxHTPhyMode, MinHTPhyMode;// For transmit phy setting in TXWI. + +#ifdef DOT11_N_SUPPORT + // HT EWC MIMO-N used parameters + USHORT RXBAbitmap; // fill to on-chip RXWI_BA_BITMASK in 8.1.3RX attribute entry format + USHORT TXBAbitmap; // This bitmap as originator, only keep in software used to mark AMPDU bit in TXWI + USHORT TXAutoBAbitmap; + USHORT BADeclineBitmap; + USHORT BARecWcidArray[NUM_OF_TID]; // The mapping wcid of recipient session. if RXBAbitmap bit is masked + USHORT BAOriWcidArray[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked + USHORT BAOriSequence[NUM_OF_TID]; // The mapping wcid of originator session. if TXBAbitmap bit is masked + + // 802.11n features. + UCHAR MpduDensity; + UCHAR MaxRAmpduFactor; + UCHAR AMsduSize; + UCHAR MmpsMode; // MIMO power save more. + + HT_CAPABILITY_IE HTCapability; + +#ifdef DOT11N_DRAFT3 + UCHAR BSS2040CoexistenceMgmtSupport; + BOOLEAN bForty_Mhz_Intolerant; +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + + + BOOLEAN bAutoTxRateSwitch; + + UCHAR RateLen; + struct _MAC_TABLE_ENTRY *pNext; + USHORT TxSeq[NUM_OF_TID]; + USHORT NonQosDataSeq; + + RSSI_SAMPLE RssiSample; + + BOOLEAN bWscCapable; + UCHAR Receive_EapolStart_EapRspId; + + UINT32 TXMCSExpected[16]; + UINT32 TXMCSSuccessful[16]; + UINT32 TXMCSFailed[16]; + UINT32 TXMCSAutoFallBack[16][16]; + +#ifdef CONFIG_STA_SUPPORT + ULONG LastBeaconRxTime; +#endif // CONFIG_STA_SUPPORT // + + + + ULONG AssocDeadLine; + + + + + ULONG ChannelQuality; // 0..100, Channel Quality Indication for Roaming + + + + + + +#ifdef VENDOR_FEATURE1_SUPPORT + UCHAR HeaderBuf[128]; // TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP + UCHAR HdrPadLen; // recording Header Padding Length; + UCHAR MpduHeaderLen; + UINT16 Protocol; +#endif // VENDOR_FEATURE1_SUPPORT // +} MAC_TABLE_ENTRY, *PMAC_TABLE_ENTRY; + +typedef struct _MAC_TABLE { + USHORT Size; + MAC_TABLE_ENTRY *Hash[HASH_TABLE_SIZE]; + MAC_TABLE_ENTRY Content[MAX_LEN_OF_MAC_TABLE]; + QUEUE_HEADER McastPsQueue; + ULONG PsQIdleCount; + BOOLEAN fAnyStationInPsm; + BOOLEAN fAnyStationBadAtheros; // Check if any Station is atheros 802.11n Chip. We need to use RTS/CTS with Atheros 802,.11n chip. + BOOLEAN fAnyTxOPForceDisable; // Check if it is necessary to disable BE TxOP + BOOLEAN fAllStationAsRalink; // Check if all stations are ralink-chipset +#ifdef DOT11_N_SUPPORT + BOOLEAN fAnyStationIsLegacy; // Check if I use legacy rate to transmit to my BSS Station/ + BOOLEAN fAnyStationNonGF; // Check if any Station can't support GF. + BOOLEAN fAnyStation20Only; // Check if any Station can't support GF. + BOOLEAN fAnyStationMIMOPSDynamic; // Check if any Station is MIMO Dynamic + BOOLEAN fAnyBASession; // Check if there is BA session. Force turn on RTS/CTS + BOOLEAN fAnyStaFortyIntolerant; // Check if still has any station set the Intolerant bit on! + +//2008/10/28: KH add to support Antenna power-saving of AP<-- +//2008/10/28: KH add to support Antenna power-saving of AP--> +#endif // DOT11_N_SUPPORT // +} MAC_TABLE, *PMAC_TABLE; + + + + +#ifdef BLOCK_NET_IF +typedef struct _BLOCK_QUEUE_ENTRY +{ + BOOLEAN SwTxQueueBlockFlag; + LIST_HEADER NetIfList; +} BLOCK_QUEUE_ENTRY, *PBLOCK_QUEUE_ENTRY; +#endif // BLOCK_NET_IF // + + +struct wificonf +{ + BOOLEAN bShortGI; + BOOLEAN bGreenField; +}; + + +typedef struct _RTMP_DEV_INFO_ +{ + UCHAR chipName[16]; + RTMP_INF_TYPE infType; +}RTMP_DEV_INFO; + + +#ifdef DBG_DIAGNOSE +#define DIAGNOSE_TIME 10 // 10 sec +typedef struct _RtmpDiagStrcut_ +{ // Diagnosis Related element + unsigned char inited; + unsigned char qIdx; + unsigned char ArrayStartIdx; + unsigned char ArrayCurIdx; + // Tx Related Count + USHORT TxDataCnt[DIAGNOSE_TIME]; + USHORT TxFailCnt[DIAGNOSE_TIME]; +// USHORT TxDescCnt[DIAGNOSE_TIME][16]; // TxDesc queue length in scale of 0~14, >=15 + USHORT TxDescCnt[DIAGNOSE_TIME][24]; // 3*3 // TxDesc queue length in scale of 0~14, >=15 +// USHORT TxMcsCnt[DIAGNOSE_TIME][16]; // TxDate MCS Count in range from 0 to 15, step in 1. + USHORT TxMcsCnt[DIAGNOSE_TIME][MAX_MCS_SET]; // 3*3 + USHORT TxSWQueCnt[DIAGNOSE_TIME][9]; // TxSwQueue length in scale of 0, 1, 2, 3, 4, 5, 6, 7, >=8 + + USHORT TxAggCnt[DIAGNOSE_TIME]; + USHORT TxNonAggCnt[DIAGNOSE_TIME]; +// USHORT TxAMPDUCnt[DIAGNOSE_TIME][16]; // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1. + USHORT TxAMPDUCnt[DIAGNOSE_TIME][MAX_MCS_SET]; // 3*3 // 10 sec, TxDMA APMDU Aggregation count in range from 0 to 15, in setp of 1. + USHORT TxRalinkCnt[DIAGNOSE_TIME]; // TxRalink Aggregation Count in 1 sec scale. + USHORT TxAMSDUCnt[DIAGNOSE_TIME]; // TxAMSUD Aggregation Count in 1 sec scale. + + // Rx Related Count + USHORT RxDataCnt[DIAGNOSE_TIME]; // Rx Total Data count. + USHORT RxCrcErrCnt[DIAGNOSE_TIME]; +// USHORT RxMcsCnt[DIAGNOSE_TIME][16]; // Rx MCS Count in range from 0 to 15, step in 1. + USHORT RxMcsCnt[DIAGNOSE_TIME][MAX_MCS_SET]; // 3*3 +}RtmpDiagStruct; +#endif // DBG_DIAGNOSE // + + +struct _RTMP_CHIP_OP_ +{ + /* Calibration access related callback functions */ + int (*eeinit)(RTMP_ADAPTER *pAd); /* int (*eeinit)(RTMP_ADAPTER *pAd); */ + int (*eeread)(RTMP_ADAPTER *pAd, USHORT offset, PUSHORT pValue); /* int (*eeread)(RTMP_ADAPTER *pAd, int offset, PUSHORT pValue); */ + int (*eewrite)(RTMP_ADAPTER *pAd, USHORT offset, USHORT value); /* int (*eewrite)(RTMP_ADAPTER *pAd, int offset, USHORT value); */ + + /* MCU related callback functions */ + int (*loadFirmware)(RTMP_ADAPTER *pAd); /* int (*loadFirmware)(RTMP_ADAPTER *pAd); */ + int (*eraseFirmware)(RTMP_ADAPTER *pAd); /* int (*eraseFirmware)(RTMP_ADAPTER *pAd); */ + int (*sendCommandToMcu)(RTMP_ADAPTER *pAd, UCHAR cmd, UCHAR token, UCHAR arg0, UCHAR arg1); /* int (*sendCommandToMcu)(RTMP_ADAPTER *pAd, UCHAR cmd, UCHAR token, UCHAR arg0, UCHAR arg1); */ + + /* RF access related callback functions */ + REG_PAIR *pRFRegTable; + REG_PAIR *pBBPRegTable; + UCHAR bbpRegTbSize; + void (*AsicRfInit)(RTMP_ADAPTER *pAd); + void (*AsicRfTurnOn)(RTMP_ADAPTER *pAd); + void (*AsicRfTurnOff)(RTMP_ADAPTER *pAd); + void (*AsicReverseRfFromSleepMode)(RTMP_ADAPTER *pAd); + void (*AsicHaltAction)(RTMP_ADAPTER *pAd); +}; + + +// +// The miniport adapter structure +// +struct _RTMP_ADAPTER +{ + PVOID OS_Cookie; // save specific structure relative to OS + PNET_DEV net_dev; + ULONG VirtualIfCnt; + + RTMP_CHIP_OP chipOps; + +#ifdef CONFIG_STA_SUPPORT + USHORT ThisTbttNumToNextWakeUp; +#endif // CONFIG_STA_SUPPORT // + +#ifdef HOSTAPD_SUPPORT + UINT32 IoctlIF; +#endif//HOSTAPD_SUPPORT// +#ifdef INF_AMAZON_PPA + UINT32 g_if_id; + BOOLEAN PPAEnable; + PPA_DIRECTPATH_CB *pDirectpathCb; +#endif // INF_AMAZON_PPA // + +#ifdef RTMP_MAC_PCI +/*****************************************************************************************/ +/* PCI related parameters */ +/*****************************************************************************************/ + PUCHAR CSRBaseAddress; // PCI MMIO Base Address, all access will use + unsigned int irq_num; +#ifdef CONFIG_STA_SUPPORT + USHORT LnkCtrlBitMask; + USHORT RLnkCtrlConfiguration; + USHORT RLnkCtrlOffset; + USHORT HostLnkCtrlConfiguration; + USHORT HostLnkCtrlOffset; + USHORT PCIePowerSaveLevel; + ULONG Rt3xxHostLinkCtrl; // USed for 3090F chip + ULONG Rt3xxRalinkLinkCtrl; // USed for 3090F chip +#endif // CONFIG_STA_SUPPORT // + USHORT DeviceID; // Read from PCI config + ULONG AccessBBPFailCount; + BOOLEAN bPCIclkOff; // flag that indicate if the PICE power status in Configuration SPace.. + BOOLEAN bPCIclkOffDisableTx; // + + BOOLEAN brt30xxBanMcuCmd; //when = 0xff means all commands are ok to set . + BOOLEAN b3090ESpecialChip; //3090E special chip that write EEPROM 0x24=0x9280. + //ULONG CheckDmaBusyCount; // Check Interrupt Status Register Count. + + UINT int_enable_reg; + UINT int_disable_mask; + UINT int_pending; + + RTMP_DMABUF TxBufSpace[NUM_OF_TX_RING]; // Shared memory of all 1st pre-allocated TxBuf associated with each TXD + RTMP_DMABUF RxDescRing; // Shared memory for RX descriptors + RTMP_DMABUF TxDescRing[NUM_OF_TX_RING]; // Shared memory for Tx descriptors + RTMP_TX_RING TxRing[NUM_OF_TX_RING]; // AC0~4 + HCCA +#endif // RTMP_MAC_PCI // + + + NDIS_SPIN_LOCK irq_lock; + UCHAR irq_disabled; + + //======Cmd Thread in PCI/RBUS/USB + CmdQ CmdQ; + NDIS_SPIN_LOCK CmdQLock; // CmdQLock spinlock + RTMP_OS_TASK cmdQTask; + + +/*****************************************************************************************/ +/* RBUS related parameters */ +/*****************************************************************************************/ + + +/*****************************************************************************************/ +/* Both PCI/USB related parameters */ +/*****************************************************************************************/ + //RTMP_DEV_INFO chipInfo; + RTMP_INF_TYPE infType; + +/*****************************************************************************************/ +/* Driver Mgmt related parameters */ +/*****************************************************************************************/ + RTMP_OS_TASK mlmeTask; +#ifdef RTMP_TIMER_TASK_SUPPORT + // If you want use timer task to handle the timer related jobs, enable this. + RTMP_TIMER_TASK_QUEUE TimerQ; + NDIS_SPIN_LOCK TimerQLock; + RTMP_OS_TASK timerTask; +#endif // RTMP_TIMER_TASK_SUPPORT // + + +/*****************************************************************************************/ +/* Tx related parameters */ +/*****************************************************************************************/ + BOOLEAN DeQueueRunning[NUM_OF_TX_RING]; // for ensuring RTUSBDeQueuePacket get call once + NDIS_SPIN_LOCK DeQueueLock[NUM_OF_TX_RING]; + + + // resource for software backlog queues + QUEUE_HEADER TxSwQueue[NUM_OF_TX_RING]; // 4 AC + 1 HCCA + NDIS_SPIN_LOCK TxSwQueueLock[NUM_OF_TX_RING]; // TxSwQueue spinlock + + RTMP_DMABUF MgmtDescRing; // Shared memory for MGMT descriptors + RTMP_MGMT_RING MgmtRing; + NDIS_SPIN_LOCK MgmtRingLock; // Prio Ring spinlock + + +/*****************************************************************************************/ +/* Rx related parameters */ +/*****************************************************************************************/ + +#ifdef RTMP_MAC_PCI + RTMP_RX_RING RxRing; + NDIS_SPIN_LOCK RxRingLock; // Rx Ring spinlock +#endif // RTMP_MAC_PCI // + + + +/*****************************************************************************************/ +/* ASIC related parameters */ +/*****************************************************************************************/ + UINT32 MACVersion; // MAC version. Record rt2860C(0x28600100) or rt2860D (0x28600101).. + + // --------------------------- + // E2PROM + // --------------------------- + ULONG EepromVersion; // byte 0: version, byte 1: revision, byte 2~3: unused + ULONG FirmwareVersion; // byte 0: Minor version, byte 1: Major version, otherwise unused. + USHORT EEPROMDefaultValue[NUM_EEPROM_BBP_PARMS]; + UCHAR EEPROMAddressNum; // 93c46=6 93c66=8 + BOOLEAN EepromAccess; + UCHAR EFuseTag; + + + // --------------------------- + // BBP Control + // --------------------------- +#ifdef MERGE_ARCH_TEAM + UCHAR BbpWriteLatch[256]; // record last BBP register value written via BBP_IO_WRITE/BBP_IO_WRITE_VY_REG_ID +#else + UCHAR BbpWriteLatch[140]; // record last BBP register value written via BBP_IO_WRITE/BBP_IO_WRITE_VY_REG_ID +#endif // MERGE_ARCH_TEAM // + CHAR BbpRssiToDbmDelta; // change from UCHAR to CHAR for high power + BBP_R66_TUNING BbpTuning; + + // ---------------------------- + // RFIC control + // ---------------------------- + UCHAR RfIcType; // RFIC_xxx + ULONG RfFreqOffset; // Frequency offset for channel switching + RTMP_RF_REGS LatchRfRegs; // latch th latest RF programming value since RF IC doesn't support READ + + EEPROM_ANTENNA_STRUC Antenna; // Since ANtenna definition is different for a & g. We need to save it for future reference. + EEPROM_NIC_CONFIG2_STRUC NicConfig2; + + // This soft Rx Antenna Diversity mechanism is used only when user set + // RX Antenna = DIVERSITY ON + SOFT_RX_ANT_DIVERSITY RxAnt; + + UCHAR RFProgSeq; + CHANNEL_TX_POWER TxPower[MAX_NUM_OF_CHANNELS]; // Store Tx power value for all channels. + CHANNEL_TX_POWER ChannelList[MAX_NUM_OF_CHANNELS]; // list all supported channels for site survey + CHANNEL_11J_TX_POWER TxPower11J[MAX_NUM_OF_11JCHANNELS]; // 802.11j channel and bw + CHANNEL_11J_TX_POWER ChannelList11J[MAX_NUM_OF_11JCHANNELS]; // list all supported channels for site survey + + UCHAR ChannelListNum; // number of channel in ChannelList[] + UCHAR Bbp94; + BOOLEAN BbpForCCK; + ULONG Tx20MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE]; + ULONG Tx20MPwrCfgGBand[MAX_TXPOWER_ARRAY_SIZE]; + ULONG Tx40MPwrCfgABand[MAX_TXPOWER_ARRAY_SIZE]; + ULONG Tx40MPwrCfgGBand[MAX_TXPOWER_ARRAY_SIZE]; + + BOOLEAN bAutoTxAgcA; // Enable driver auto Tx Agc control + UCHAR TssiRefA; // Store Tssi reference value as 25 temperature. + UCHAR TssiPlusBoundaryA[5]; // Tssi boundary for increase Tx power to compensate. + UCHAR TssiMinusBoundaryA[5]; // Tssi boundary for decrease Tx power to compensate. + UCHAR TxAgcStepA; // Store Tx TSSI delta increment / decrement value + CHAR TxAgcCompensateA; // Store the compensation (TxAgcStep * (idx-1)) + + BOOLEAN bAutoTxAgcG; // Enable driver auto Tx Agc control + UCHAR TssiRefG; // Store Tssi reference value as 25 temperature. + UCHAR TssiPlusBoundaryG[5]; // Tssi boundary for increase Tx power to compensate. + UCHAR TssiMinusBoundaryG[5]; // Tssi boundary for decrease Tx power to compensate. + UCHAR TxAgcStepG; // Store Tx TSSI delta increment / decrement value + CHAR TxAgcCompensateG; // Store the compensation (TxAgcStep * (idx-1)) + + signed char BGRssiOffset0; // Store B/G RSSI#0 Offset value on EEPROM 0x46h + signed char BGRssiOffset1; // Store B/G RSSI#1 Offset value + signed char BGRssiOffset2; // Store B/G RSSI#2 Offset value + + signed char ARssiOffset0; // Store A RSSI#0 Offset value on EEPROM 0x4Ah + signed char ARssiOffset1; // Store A RSSI#1 Offset value + signed char ARssiOffset2; // Store A RSSI#2 Offset value + + CHAR BLNAGain; // Store B/G external LNA#0 value on EEPROM 0x44h + CHAR ALNAGain0; // Store A external LNA#0 value for ch36~64 + CHAR ALNAGain1; // Store A external LNA#1 value for ch100~128 + CHAR ALNAGain2; // Store A external LNA#2 value for ch132~165 +#ifdef RT30xx + // for 3572 + UCHAR Bbp25; + UCHAR Bbp26; + + UCHAR TxMixerGain24G; // Tx mixer gain value from EEPROM to improve Tx EVM / Tx DAC, 2.4G + UCHAR TxMixerGain5G; +#endif // RT30xx // + // ---------------------------- + // LED control + // ---------------------------- + MCU_LEDCS_STRUC LedCntl; + USHORT Led1; // read from EEPROM 0x3c + USHORT Led2; // EEPROM 0x3e + USHORT Led3; // EEPROM 0x40 + UCHAR LedIndicatorStrength; + UCHAR RssiSingalstrengthOffet; + BOOLEAN bLedOnScanning; + UCHAR LedStatus; + +/*****************************************************************************************/ +/* 802.11 related parameters */ +/*****************************************************************************************/ + // outgoing BEACON frame buffer and corresponding TXD + TXWI_STRUC BeaconTxWI; + PUCHAR BeaconBuf; + USHORT BeaconOffset[HW_BEACON_MAX_COUNT]; + + // pre-build PS-POLL and NULL frame upon link up. for efficiency purpose. +#ifdef CONFIG_STA_SUPPORT + PSPOLL_FRAME PsPollFrame; +#endif // CONFIG_STA_SUPPORT // + HEADER_802_11 NullFrame; + + + + +//=========AP=========== + + +//=======STA=========== +#ifdef CONFIG_STA_SUPPORT + // ----------------------------------------------- + // STA specific configuration & operation status + // used only when pAd->OpMode == OPMODE_STA + // ----------------------------------------------- + STA_ADMIN_CONFIG StaCfg; // user desired settings + STA_ACTIVE_CONFIG StaActive; // valid only when ADHOC_ON(pAd) || INFRA_ON(pAd) + CHAR nickname[IW_ESSID_MAX_SIZE+1]; // nickname, only used in the iwconfig i/f + NDIS_MEDIA_STATE PreMediaState; +#endif // CONFIG_STA_SUPPORT // + +//=======Common=========== + // OP mode: either AP or STA + UCHAR OpMode; // OPMODE_STA, OPMODE_AP + + NDIS_MEDIA_STATE IndicateMediaState; // Base on Indication state, default is NdisMediaStateDisConnected + + + /* MAT related parameters */ + + // configuration: read from Registry & E2PROM + BOOLEAN bLocalAdminMAC; // Use user changed MAC + UCHAR PermanentAddress[MAC_ADDR_LEN]; // Factory default MAC address + UCHAR CurrentAddress[MAC_ADDR_LEN]; // User changed MAC address + + // ------------------------------------------------------ + // common configuration to both OPMODE_STA and OPMODE_AP + // ------------------------------------------------------ + COMMON_CONFIG CommonCfg; + MLME_STRUCT Mlme; + + // AP needs those vaiables for site survey feature. + MLME_AUX MlmeAux; // temporary settings used during MLME state machine +#if defined(AP_SCAN_SUPPORT) || defined(CONFIG_STA_SUPPORT) + BSS_TABLE ScanTab; // store the latest SCAN result +#endif + + //About MacTab, the sta driver will use #0 and #1 for multicast and AP. + MAC_TABLE MacTab; // ASIC on-chip WCID entry table. At TX, ASIC always use key according to this on-chip table. + NDIS_SPIN_LOCK MacTabLock; + +#ifdef DOT11_N_SUPPORT + BA_TABLE BATable; + NDIS_SPIN_LOCK BATabLock; + RALINK_TIMER_STRUCT RECBATimer; +#endif // DOT11_N_SUPPORT // + + // encryption/decryption KEY tables + CIPHER_KEY SharedKey[MAX_MBSSID_NUM][4]; // STA always use SharedKey[BSS0][0..3] + + // RX re-assembly buffer for fragmentation + FRAGMENT_FRAME FragFrame; // Frame storage for fragment frame + + // various Counters + COUNTER_802_3 Counters8023; // 802.3 counters + COUNTER_802_11 WlanCounters; // 802.11 MIB counters + COUNTER_RALINK RalinkCounters; // Ralink propriety counters + COUNTER_DRS DrsCounters; // counters for Dynamic TX Rate Switching + PRIVATE_STRUC PrivateInfo; // Private information & counters + + // flags, see fRTMP_ADAPTER_xxx flags + ULONG Flags; // Represent current device status + ULONG PSFlags; // Power Save operation flag. + + // current TX sequence # + USHORT Sequence; + + // Control disconnect / connect event generation + //+++Didn't used anymore + ULONG LinkDownTime; + //--- + ULONG LastRxRate; + ULONG LastTxRate; + //+++Used only for Station + BOOLEAN bConfigChanged; // Config Change flag for the same SSID setting + //--- + + ULONG ExtraInfo; // Extra information for displaying status + ULONG SystemErrorBitmap; // b0: E2PROM version error + + //+++Didn't used anymore + ULONG MacIcVersion; // MAC/BBP serial interface issue solved after ver.D + //--- + +#ifdef SYSTEM_LOG_SUPPORT + // --------------------------- + // System event log + // --------------------------- + RT_802_11_EVENT_TABLE EventTab; +#endif // SYSTEM_LOG_SUPPORT // + + + BOOLEAN HTCEnable; + + /*****************************************************************************************/ + /* Statistic related parameters */ + /*****************************************************************************************/ + + BOOLEAN bUpdateBcnCntDone; + ULONG watchDogMacDeadlock; // prevent MAC/BBP into deadlock condition + // ---------------------------- + // DEBUG paramerts + // ---------------------------- + //ULONG DebugSetting[4]; + BOOLEAN bBanAllBaSetup; + BOOLEAN bPromiscuous; + + // ---------------------------- + // rt2860c emulation-use Parameters + // ---------------------------- + //ULONG rtsaccu[30]; + //ULONG ctsaccu[30]; + //ULONG cfendaccu[30]; + //ULONG bacontent[16]; + //ULONG rxint[RX_RING_SIZE+1]; + //UCHAR rcvba[60]; + BOOLEAN bLinkAdapt; + BOOLEAN bForcePrintTX; + BOOLEAN bForcePrintRX; + //BOOLEAN bDisablescanning; //defined in RT2870 USB + BOOLEAN bStaFifoTest; + BOOLEAN bProtectionTest; + BOOLEAN bHCCATest; + BOOLEAN bGenOneHCCA; + BOOLEAN bBroadComHT; + //+++Following add from RT2870 USB. + ULONG BulkOutReq; + ULONG BulkOutComplete; + ULONG BulkOutCompleteOther; + ULONG BulkOutCompleteCancel; // seems not use now? + ULONG BulkInReq; + ULONG BulkInComplete; + ULONG BulkInCompleteFail; + //--- + + struct wificonf WIFItestbed; + +#ifdef RALINK_ATE + ATE_INFO ate; +#endif // RALINK_ATE // + +#ifdef DOT11_N_SUPPORT + struct reordering_mpdu_pool mpdu_blk_pool; +#endif // DOT11_N_SUPPORT // + + /* statistics count */ +#ifdef LINUX +#if WIRELESS_EXT >= 12 + struct iw_statistics iw_stats; +#endif + + struct net_device_stats stats; +#endif // LINUX // + +#ifdef BLOCK_NET_IF + BLOCK_QUEUE_ENTRY blockQueueTab[NUM_OF_TX_RING]; +#endif // BLOCK_NET_IF // + + + +#ifdef MULTIPLE_CARD_SUPPORT + INT32 MC_RowID; + STRING MC_FileName[256]; +#endif // MULTIPLE_CARD_SUPPORT // + + ULONG TbttTickCount; /* beacon timestamp work-around */ +#ifdef PCI_MSI_SUPPORT + BOOLEAN HaveMsi; +#endif // PCI_MSI_SUPPORT // + + + /* for detect_wmm_traffic() BE TXOP use */ + ULONG OneSecondnonBEpackets; // record non BE packets per second + UCHAR is_on; + + /* for detect_wmm_traffic() BE/BK TXOP use */ +#define TIME_BASE (1000000/OS_HZ) +#define TIME_ONE_SECOND (1000000/TIME_BASE) + UCHAR flg_be_adjust; + ULONG be_adjust_last_time; + +#ifdef NINTENDO_AP + NINDO_CTRL_BLOCK nindo_ctrl_block; +#endif // NINTENDO_AP // + + +#ifdef IKANOS_VX_1X0 + struct IKANOS_TX_INFO IkanosTxInfo; + struct IKANOS_TX_INFO IkanosRxInfo[MAX_MBSSID_NUM + MAX_WDS_ENTRY + MAX_APCLI_NUM + MAX_MESH_NUM]; +#endif // IKANOS_VX_1X0 // + + +#ifdef DBG_DIAGNOSE + RtmpDiagStruct DiagStruct; +#endif // DBG_DIAGNOSE // + + + UINT8 FlgCtsEnabled; + UINT8 PM_FlgSuspend; + +#ifdef RT30xx +#ifdef RTMP_EFUSE_SUPPORT + BOOLEAN bUseEfuse; + BOOLEAN bEEPROMFile; + BOOLEAN bFroceEEPROMBuffer; + UCHAR EEPROMImage[1024]; +#endif // RTMP_EFUSE_SUPPORT // +#endif // RT30xx // + + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + EXT_CAP_INFO_ELEMENT ExtCapInfo; + + +#ifdef VENDOR_FEATURE1_SUPPORT + UCHAR FifoUpdateDone, FifoUpdateRx; +#endif // VENDOR_FEATURE1_SUPPORT // + +#ifdef VENDOR_FEATURE2_SUPPORT + +#define MEM_DBG_PKT_ALLOC_INC(_pAd) _pAd->NumOfPktAlloc ++ +#define MEM_DBG_PKT_FREE_INC(_pAd) _pAd->NumOfPktFree ++ + UINT32 NumOfPktAlloc, NumOfPktFree; // used in memory debug +#else + +#define MEM_DBG_PKT_ALLOC_INC(_pAd) +#define MEM_DBG_PKT_FREE_INC(_pAd) +#endif // VENDOR_FEATURE2_SUPPORT // + +#define RFIC_24GHZ 0x01 +#define RFIC_5GHZ 0x02 + UINT8 RFICType; + +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + VOID *pCfgDev; + VOID *pCfg80211_CB; + + BOOLEAN FlgCfg80211Scanning; + BOOLEAN FlgCfg80211Connecting; + UCHAR Cfg80211_Alpha2[2]; + + /* function pointers used in driver.ko */ + VOID (*CFG80211_Register)( + IN VOID *pAd, + IN struct device *pDev, + IN struct net_device *pNetDev); + + CFG80211_FUNC_OPS; + +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + + + struct { + UCHAR *pIe; + INT IeLen; + } ProbeRespIE[MAX_LEN_OF_BSS_TABLE]; +}; + + + +#ifdef TONE_RADAR_DETECT_SUPPORT +#define DELAYINTMASK 0x0013fffb +#define INTMASK 0x0013fffb +#define IndMask 0x0013fffc +#define RadarInt 0x00100000 +#else +#define DELAYINTMASK 0x0003fffb +#define INTMASK 0x0003fffb +#define IndMask 0x0003fffc +#endif // TONE_RADAR_DETECT_SUPPORT // + +#define RxINT 0x00000005 // Delayed Rx or indivi rx +#define TxDataInt 0x000000fa // Delayed Tx or indivi tx +#define TxMgmtInt 0x00000102 // Delayed Tx or indivi tx +#define TxCoherent 0x00020000 // tx coherent +#define RxCoherent 0x00010000 // rx coherent +#define McuCommand 0x00000200 // mcu +#define PreTBTTInt 0x00001000 // Pre-TBTT interrupt +#define TBTTInt 0x00000800 // TBTT interrupt +#define GPTimeOutInt 0x00008000 // GPtimeout interrupt +#define AutoWakeupInt 0x00004000 // AutoWakeupInt interrupt +#define FifoStaFullInt 0x00002000 // fifo statistics full interrupt + + +/*************************************************************************** + * Rx Path software control block related data structures + **************************************************************************/ +typedef struct _RX_BLK_ +{ +// RXD_STRUC RxD; // sample + RT28XX_RXD_STRUC RxD; + PRXWI_STRUC pRxWI; + PHEADER_802_11 pHeader; + PNDIS_PACKET pRxPacket; + UCHAR *pData; + USHORT DataSize; + USHORT Flags; + UCHAR UserPriority; // for calculate TKIP MIC using +} RX_BLK; + + +#define RX_BLK_SET_FLAG(_pRxBlk, _flag) (_pRxBlk->Flags |= _flag) +#define RX_BLK_TEST_FLAG(_pRxBlk, _flag) (_pRxBlk->Flags & _flag) +#define RX_BLK_CLEAR_FLAG(_pRxBlk, _flag) (_pRxBlk->Flags &= ~(_flag)) + + +#define fRX_WDS 0x0001 +#define fRX_AMSDU 0x0002 +#define fRX_ARALINK 0x0004 +#define fRX_HTC 0x0008 +#define fRX_PAD 0x0010 +#define fRX_AMPDU 0x0020 +#define fRX_QOS 0x0040 +#define fRX_INFRA 0x0080 +#define fRX_EAP 0x0100 +#define fRX_MESH 0x0200 +#define fRX_APCLI 0x0400 +#define fRX_DLS 0x0800 +#define fRX_WPI 0x1000 + +#define LENGTH_AMSDU_SUBFRAMEHEAD 14 +#define LENGTH_ARALINK_SUBFRAMEHEAD 14 +#define LENGTH_ARALINK_HEADER_FIELD 2 + + +/*************************************************************************** + * Tx Path software control block related data structures + **************************************************************************/ +#define TX_UNKOWN_FRAME 0x00 +#define TX_MCAST_FRAME 0x01 +#define TX_LEGACY_FRAME 0x02 +#define TX_AMPDU_FRAME 0x04 +#define TX_AMSDU_FRAME 0x08 +#define TX_RALINK_FRAME 0x10 +#define TX_FRAG_FRAME 0x20 + + +// Currently the sizeof(TX_BLK) is 148 bytes. +typedef struct _TX_BLK_ +{ + UCHAR QueIdx; + UCHAR TxFrameType; // Indicate the Transmission type of the all frames in one batch + UCHAR TotalFrameNum; // Total frame number want to send-out in one batch + USHORT TotalFragNum; // Total frame fragments required in one batch + USHORT TotalFrameLen; // Total length of all frames want to send-out in one batch + + QUEUE_HEADER TxPacketList; + MAC_TABLE_ENTRY *pMacEntry; // NULL: packet with 802.11 RA field is multicast/broadcast address + HTTRANSMIT_SETTING *pTransmit; + + // Following structure used for the characteristics of a specific packet. + PNDIS_PACKET pPacket; + PUCHAR pSrcBufHeader; // Reference to the head of sk_buff->data + PUCHAR pSrcBufData; // Reference to the sk_buff->data, will changed depends on hanlding progresss + UINT SrcBufLen; // Length of packet payload which not including Layer 2 header + PUCHAR pExtraLlcSnapEncap; // NULL means no extra LLC/SNAP is required +#ifndef VENDOR_FEATURE1_SUPPORT + UCHAR HeaderBuf[128]; // TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP +#else + UCHAR *HeaderBuf; // TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP + UCHAR HeaderBuffer[128]; // TempBuffer for TX_INFO + TX_WI + 802.11 Header + padding + AMSDU SubHeader + LLC/SNAP +#endif // VENDOR_FEATURE1_SUPPORT // + UCHAR MpduHeaderLen; // 802.11 header length NOT including the padding + UCHAR HdrPadLen; // recording Header Padding Length; + UCHAR apidx; // The interface associated to this packet + UCHAR Wcid; // The MAC entry associated to this packet + UCHAR UserPriority; // priority class of packet + UCHAR FrameGap; // what kind of IFS this packet use + UCHAR MpduReqNum; // number of fragments of this frame + UCHAR TxRate; // TODO: Obsoleted? Should change to MCS? + UCHAR CipherAlg; // cipher alogrithm + PCIPHER_KEY pKey; + UCHAR KeyIdx; // Indicate the transmit key index + + + UINT32 Flags; //See following definitions for detail. + + //YOU SHOULD NOT TOUCH IT! Following parameters are used for hardware-depended layer. + ULONG Priv; // Hardware specific value saved in here. + + +#ifdef RT2883_TEMP_PATCH + UCHAR TxSndgPkt; // 1: sounding 2: NDP sounding + UCHAR TxNDPSndgBW; + UCHAR TxNDPSndgMcs; +#endif // RT2883_TEMP_PATCH // +} TX_BLK, *PTX_BLK; + + +#define fTX_bRtsRequired 0x0001 // Indicate if need send RTS frame for protection. Not used in RT2860/RT2870. +#define fTX_bAckRequired 0x0002 // the packet need ack response +#define fTX_bPiggyBack 0x0004 // Legacy device use Piggback or not +#define fTX_bHTRate 0x0008 // allow to use HT rate +#define fTX_bForceNonQoS 0x0010 // force to transmit frame without WMM-QoS in HT mode +#define fTX_bAllowFrag 0x0020 // allow to fragment the packet, A-MPDU, A-MSDU, A-Ralink is not allowed to fragment +#define fTX_bMoreData 0x0040 // there are more data packets in PowerSave Queue +#define fTX_bWMM 0x0080 // QOS Data +#define fTX_bClearEAPFrame 0x0100 + +#define fTX_bSwEncrypt 0x0400 // this packet need to be encrypted by software before TX + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + + +#ifdef CLIENT_WDS +#define fTX_bClientWDSFrame 0x10000 +#endif // CLIENT_WDS // + + +#define TX_BLK_SET_FLAG(_pTxBlk, _flag) (_pTxBlk->Flags |= _flag) +#define TX_BLK_TEST_FLAG(_pTxBlk, _flag) (((_pTxBlk->Flags & _flag) == _flag) ? 1 : 0) +#define TX_BLK_CLEAR_FLAG(_pTxBlk, _flag) (_pTxBlk->Flags &= ~(_flag)) + + + + +#ifdef RT_BIG_ENDIAN +/*************************************************************************** + * Endian conversion related functions + **************************************************************************/ +/* + ======================================================================== + + Routine Description: + Endian conversion of Tx/Rx descriptor . + + Arguments: + pAd Pointer to our adapter + pData Pointer to Tx/Rx descriptor + DescriptorType Direction of the frame + + Return Value: + None + + Note: + Call this function when read or update descriptor + ======================================================================== +*/ +static inline VOID RTMPWIEndianChange( + IN PUCHAR pData, + IN ULONG DescriptorType) +{ + int size; + int i; + + size = ((DescriptorType == TYPE_TXWI) ? TXWI_SIZE : RXWI_SIZE); + + if(DescriptorType == TYPE_TXWI) + { + *((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData))); // Byte 0~3 + *((UINT32 *)(pData + 4)) = SWAP32(*((UINT32 *)(pData+4))); // Byte 4~7 + } + else + { + for(i=0; i < size/4 ; i++) + *(((UINT32 *)pData) +i) = SWAP32(*(((UINT32 *)pData)+i)); + } +} + + +#ifdef RTMP_MAC_PCI +static inline VOID WriteBackToDescriptor( + IN PUCHAR Dest, + IN PUCHAR Src, + IN BOOLEAN DoEncrypt, + IN ULONG DescriptorType) +{ + UINT32 *p1, *p2; + + p1 = ((UINT32 *)Dest); + p2 = ((UINT32 *)Src); + + *p1 = *p2; + *(p1+2) = *(p2+2); + *(p1+3) = *(p2+3); + *(p1+1) = *(p2+1); // Word 1; this must be written back last +} +#endif // RTMP_MAC_PCI // + + +/* + ======================================================================== + + Routine Description: + Endian conversion of Tx/Rx descriptor . + + Arguments: + pAd Pointer to our adapter + pData Pointer to Tx/Rx descriptor + DescriptorType Direction of the frame + + Return Value: + None + + Note: + Call this function when read or update descriptor + ======================================================================== +*/ +#ifdef RTMP_MAC_PCI +static inline VOID RTMPDescriptorEndianChange( + IN PUCHAR pData, + IN ULONG DescriptorType) +{ + *((UINT32 *)(pData)) = SWAP32(*((UINT32 *)(pData))); // Byte 0~3 + *((UINT32 *)(pData + 8)) = SWAP32(*((UINT32 *)(pData+8))); // Byte 8~11 + *((UINT32 *)(pData +12)) = SWAP32(*((UINT32 *)(pData + 12))); // Byte 12~15 + *((UINT32 *)(pData + 4)) = SWAP32(*((UINT32 *)(pData + 4))); // Byte 4~7, this must be swapped last +} +#endif // RTMP_MAC_PCI // + +/* + ======================================================================== + + Routine Description: + Endian conversion of all kinds of 802.11 frames . + + Arguments: + pAd Pointer to our adapter + pData Pointer to the 802.11 frame structure + Dir Direction of the frame + FromRxDoneInt Caller is from RxDone interrupt + + Return Value: + None + + Note: + Call this function when read or update buffer data + ======================================================================== +*/ +static inline VOID RTMPFrameEndianChange( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pData, + IN ULONG Dir, + IN BOOLEAN FromRxDoneInt) +{ + PHEADER_802_11 pFrame; + PUCHAR pMacHdr; + + // swab 16 bit fields - Frame Control field + if(Dir == DIR_READ) + { + *(USHORT *)pData = SWAP16(*(USHORT *)pData); + } + + pFrame = (PHEADER_802_11) pData; + pMacHdr = (PUCHAR) pFrame; + + // swab 16 bit fields - Duration/ID field + *(USHORT *)(pMacHdr + 2) = SWAP16(*(USHORT *)(pMacHdr + 2)); + + if (pFrame->FC.Type != BTYPE_CNTL) + { + // swab 16 bit fields - Sequence Control field + *(USHORT *)(pMacHdr + 22) = SWAP16(*(USHORT *)(pMacHdr + 22)); + } + + if(pFrame->FC.Type == BTYPE_MGMT) + { + switch(pFrame->FC.SubType) + { + case SUBTYPE_ASSOC_REQ: + case SUBTYPE_REASSOC_REQ: + // swab 16 bit fields - CapabilityInfo field + pMacHdr += sizeof(HEADER_802_11); + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + + // swab 16 bit fields - Listen Interval field + pMacHdr += 2; + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + break; + + case SUBTYPE_ASSOC_RSP: + case SUBTYPE_REASSOC_RSP: + // swab 16 bit fields - CapabilityInfo field + pMacHdr += sizeof(HEADER_802_11); + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + + // swab 16 bit fields - Status Code field + pMacHdr += 2; + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + + // swab 16 bit fields - AID field + pMacHdr += 2; + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + break; + + case SUBTYPE_AUTH: + // If from APHandleRxDoneInterrupt routine, it is still a encrypt format. + // The convertion is delayed to RTMPHandleDecryptionDoneInterrupt. + if(!FromRxDoneInt && pFrame->FC.Wep == 1) + break; + else + { + // swab 16 bit fields - Auth Alg No. field + pMacHdr += sizeof(HEADER_802_11); + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + + // swab 16 bit fields - Auth Seq No. field + pMacHdr += 2; + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + + // swab 16 bit fields - Status Code field + pMacHdr += 2; + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + } + break; + + case SUBTYPE_BEACON: + case SUBTYPE_PROBE_RSP: + // swab 16 bit fields - BeaconInterval field + pMacHdr += (sizeof(HEADER_802_11) + TIMESTAMP_LEN); + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + + // swab 16 bit fields - CapabilityInfo field + pMacHdr += sizeof(USHORT); + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + break; + + case SUBTYPE_DEAUTH: + case SUBTYPE_DISASSOC: + /* If the PMF is negotiated, those frames shall be encrypted */ + if(!FromRxDoneInt && pFrame->FC.Wep == 1) + break; + else + { + // swab 16 bit fields - Reason code field + pMacHdr += sizeof(HEADER_802_11); + *(USHORT *)pMacHdr = SWAP16(*(USHORT *)pMacHdr); + } + break; + } + } + else if( pFrame->FC.Type == BTYPE_DATA ) + { + } + else if(pFrame->FC.Type == BTYPE_CNTL) + { + switch(pFrame->FC.SubType) + { + case SUBTYPE_BLOCK_ACK_REQ: + { + PFRAME_BA_REQ pBAReq = (PFRAME_BA_REQ)pFrame; + *(USHORT *)(&pBAReq->BARControl) = SWAP16(*(USHORT *)(&pBAReq->BARControl)); + pBAReq->BAStartingSeq.word = SWAP16(pBAReq->BAStartingSeq.word); + } + break; + case SUBTYPE_BLOCK_ACK: + // For Block Ack packet, the HT_CONTROL field is in the same offset with Addr3 + *(UINT32 *)(&pFrame->Addr3[0]) = SWAP32(*(UINT32 *)(&pFrame->Addr3[0])); + break; + + case SUBTYPE_ACK: + //For ACK packet, the HT_CONTROL field is in the same offset with Addr2 + *(UINT32 *)(&pFrame->Addr2[0])= SWAP32(*(UINT32 *)(&pFrame->Addr2[0])); + break; + } + } + else + { + DBGPRINT(RT_DEBUG_ERROR,("Invalid Frame Type!!!\n")); + } + + // swab 16 bit fields - Frame Control + if(Dir == DIR_WRITE) + { + *(USHORT *)pData = SWAP16(*(USHORT *)pData); + } +} +#endif // RT_BIG_ENDIAN // + + +/*************************************************************************** + * Other static inline function definitions + **************************************************************************/ +static inline VOID ConvertMulticastIP2MAC( + IN PUCHAR pIpAddr, + IN PUCHAR *ppMacAddr, + IN UINT16 ProtoType) +{ + if (pIpAddr == NULL) + return; + + if (ppMacAddr == NULL || *ppMacAddr == NULL) + return; + + switch (ProtoType) + { + case ETH_P_IPV6: +// memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS); + *(*ppMacAddr) = 0x33; + *(*ppMacAddr + 1) = 0x33; + *(*ppMacAddr + 2) = pIpAddr[12]; + *(*ppMacAddr + 3) = pIpAddr[13]; + *(*ppMacAddr + 4) = pIpAddr[14]; + *(*ppMacAddr + 5) = pIpAddr[15]; + break; + + case ETH_P_IP: + default: +// memset(*ppMacAddr, 0, ETH_LENGTH_OF_ADDRESS); + *(*ppMacAddr) = 0x01; + *(*ppMacAddr + 1) = 0x00; + *(*ppMacAddr + 2) = 0x5e; + *(*ppMacAddr + 3) = pIpAddr[1] & 0x7f; + *(*ppMacAddr + 4) = pIpAddr[2]; + *(*ppMacAddr + 5) = pIpAddr[3]; + break; + } + + return; +} + + +char *GetPhyMode(int Mode); +char* GetBW(int BW); + + + +BOOLEAN RTMPCheckForHang( + IN NDIS_HANDLE MiniportAdapterContext); + +VOID RTMPHalt( + IN NDIS_HANDLE MiniportAdapterContext); + +// +// Private routines in rtmp_init.c +// +NDIS_STATUS RTMPAllocAdapterBlock( + IN PVOID handle, + OUT PRTMP_ADAPTER *ppAdapter); + +NDIS_STATUS RTMPAllocTxRxRingMemory( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS RTMPFindAdapter( + IN PRTMP_ADAPTER pAd, + IN NDIS_HANDLE WrapperConfigurationContext); + +NDIS_STATUS RTMPReadParametersHook( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS RTMPSetProfileParameters( + IN RTMP_ADAPTER *pAd, + IN PSTRING pBuffer); + +INT RTMPGetKeyParameter( + IN PSTRING key, + OUT PSTRING dest, + IN INT destsize, + IN PSTRING buffer, + IN BOOLEAN bTrimSpace); + + +VOID RTMPFreeAdapter( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS NICReadRegParameters( + IN PRTMP_ADAPTER pAd, + IN NDIS_HANDLE WrapperConfigurationContext); + +#ifdef RTMP_RF_RW_SUPPORT +VOID NICInitRFRegisters( + IN PRTMP_ADAPTER pAd); + +VOID RtmpChipOpsRFHook( + IN RTMP_ADAPTER *pAd); + +NDIS_STATUS RT30xxWriteRFRegister( + IN PRTMP_ADAPTER pAd, + IN UCHAR regID, + IN UCHAR value); + +NDIS_STATUS RT30xxReadRFRegister( + IN PRTMP_ADAPTER pAd, + IN UCHAR regID, + IN PUCHAR pValue); +#endif // RTMP_RF_RW_SUPPORT // + +VOID NICReadEEPROMParameters( + IN PRTMP_ADAPTER pAd, + IN PSTRING mac_addr); + +VOID NICInitAsicFromEEPROM( + IN PRTMP_ADAPTER pAd); + + +NDIS_STATUS NICInitializeAdapter( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bHardReset); + +NDIS_STATUS NICInitializeAsic( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bHardReset); + +VOID NICIssueReset( + IN PRTMP_ADAPTER pAd); + +VOID RTMPRingCleanUp( + IN PRTMP_ADAPTER pAd, + IN UCHAR RingType); + +VOID RxTest( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS DbgSendPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket); + +VOID UserCfgExit( + IN RTMP_ADAPTER *pAd); + +VOID UserCfgInit( + IN PRTMP_ADAPTER pAd); + +VOID NICResetFromError( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS NICLoadFirmware( + IN PRTMP_ADAPTER pAd); + +VOID NICEraseFirmware( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS NICLoadRateSwitchingParams( + IN PRTMP_ADAPTER pAd); + +BOOLEAN NICCheckForHang( + IN PRTMP_ADAPTER pAd); + +VOID NICUpdateFifoStaCounters( + IN PRTMP_ADAPTER pAd); + +VOID NICUpdateRawCounters( + IN PRTMP_ADAPTER pAd); + +VOID RTMPZeroMemory( + IN PVOID pSrc, + IN ULONG Length); + +ULONG RTMPCompareMemory( + IN PVOID pSrc1, + IN PVOID pSrc2, + IN ULONG Length); + +VOID RTMPMoveMemory( + OUT PVOID pDest, + IN PVOID pSrc, + IN ULONG Length); + +VOID AtoH( + PSTRING src, + PUCHAR dest, + int destlen); + +UCHAR BtoH( + char ch); + +VOID RTMPPatchMacBbpBug( + IN PRTMP_ADAPTER pAd); + +VOID RTMPPatchCardBus( + IN PRTMP_ADAPTER pAdapter); + +VOID RTMPPatchRalinkCardBus( + IN PRTMP_ADAPTER pAdapter, + IN ULONG Bus); + +ULONG RTMPReadCBConfig( + IN ULONG Bus, + IN ULONG Slot, + IN ULONG Func, + IN ULONG Offset); + +VOID RTMPWriteCBConfig( + IN ULONG Bus, + IN ULONG Slot, + IN ULONG Func, + IN ULONG Offset, + IN ULONG Value); + +VOID RTMPInitTimer( + IN PRTMP_ADAPTER pAd, + IN PRALINK_TIMER_STRUCT pTimer, + IN PVOID pTimerFunc, + IN PVOID pData, + IN BOOLEAN Repeat); + +VOID RTMPSetTimer( + IN PRALINK_TIMER_STRUCT pTimer, + IN ULONG Value); + + +VOID RTMPModTimer( + IN PRALINK_TIMER_STRUCT pTimer, + IN ULONG Value); + +VOID RTMPCancelTimer( + IN PRALINK_TIMER_STRUCT pTimer, + OUT BOOLEAN *pCancelled); + +VOID RTMPSetLED( + IN PRTMP_ADAPTER pAd, + IN UCHAR Status); + +VOID RTMPSetSignalLED( + IN PRTMP_ADAPTER pAd, + IN NDIS_802_11_RSSI Dbm); + + +VOID RTMPEnableRxTx( + IN PRTMP_ADAPTER pAd); + +// +// prototype in action.c +// +VOID ActionStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID MlmeADDBAAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeDELBAAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeDLSAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeInvalidAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeQOSAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +#ifdef DOT11_N_SUPPORT +VOID PeerAddBAReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerAddBARspAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerDelBAAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerBAAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); +#endif // DOT11_N_SUPPORT // + +VOID SendPSMPAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR Psmp); + + +VOID PeerRMAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerPublicAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +#ifdef CONFIG_STA_SUPPORT +VOID StaPublicAction( + IN PRTMP_ADAPTER pAd, + IN BSS_2040_COEXIST_IE *pBss2040CoexIE); +#endif // CONFIG_STA_SUPPORT // + + +VOID PeerBSSTranAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +#ifdef DOT11_N_SUPPORT +VOID PeerHTAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); +#endif // DOT11_N_SUPPORT // + +VOID PeerQOSAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +#ifdef QOS_DLS_SUPPORT +VOID PeerDLSAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); +#endif // QOS_DLS_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT +VOID DlsParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_DLS_REQ_STRUCT *pDlsReq, + IN PRT_802_11_DLS pDls, + IN USHORT reason); +#endif // QOS_DLS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +#ifdef DOT11_N_SUPPORT +VOID RECBATimerTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID ORIBATimerTimeout( + IN PRTMP_ADAPTER pAd); + +VOID SendRefreshBAR( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry); + +#ifdef DOT11N_DRAFT3 +VOID RTMP_11N_D3_TimerInit( + IN PRTMP_ADAPTER pAd); + +VOID SendBSS2040CoexistMgmtAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR apidx, + IN UCHAR InfoReq); + +VOID SendNotifyBWActionFrame( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR apidx); + +BOOLEAN ChannelSwitchSanityCheck( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR NewChannel, + IN UCHAR Secondary); + +VOID ChannelSwitchAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR Channel, + IN UCHAR Secondary); + +ULONG BuildIntolerantChannelRep( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDest); + +VOID Update2040CoexistFrameAndNotify( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN BOOLEAN bAddIntolerantCha); + +VOID Send2040CoexistAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN BOOLEAN bAddIntolerantCha); + +VOID UpdateBssScanParm( + IN PRTMP_ADAPTER pAd, + IN OVERLAP_BSS_SCAN_IE APBssScan); +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +VOID ActHeaderInit( + IN PRTMP_ADAPTER pAd, + IN OUT PHEADER_802_11 pHdr80211, + IN PUCHAR Addr1, + IN PUCHAR Addr2, + IN PUCHAR Addr3); + +VOID BarHeaderInit( + IN PRTMP_ADAPTER pAd, + IN OUT PFRAME_BAR pCntlBar, + IN PUCHAR pDA, + IN PUCHAR pSA); + +VOID InsertActField( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN UINT8 Category, + IN UINT8 ActCode); + +BOOLEAN QosBADataParse( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bAMSDU, + IN PUCHAR p8023Header, + IN UCHAR WCID, + IN UCHAR TID, + IN USHORT Sequence, + IN UCHAR DataOffset, + IN USHORT Datasize, + IN UINT CurRxIndex); + +#ifdef DOT11_N_SUPPORT +BOOLEAN CntlEnqueueForRecv( + IN PRTMP_ADAPTER pAd, + IN ULONG Wcid, + IN ULONG MsgLen, + IN PFRAME_BA_REQ pMsg); + +VOID BaAutoManSwitch( + IN PRTMP_ADAPTER pAd); +#endif // DOT11_N_SUPPORT // + +VOID HTIOTCheck( + IN PRTMP_ADAPTER pAd, + IN UCHAR BatRecIdx); + +// +// Private routines in rtmp_data.c +// +BOOLEAN RTMPHandleRxDoneInterrupt( + IN PRTMP_ADAPTER pAd); + +VOID RTMPHandleTxDoneInterrupt( + IN PRTMP_ADAPTER pAd); + +BOOLEAN RTMPHandleTxRingDmaDoneInterrupt( + IN PRTMP_ADAPTER pAd, + IN INT_SOURCE_CSR_STRUC TxRingBitmap); + +VOID RTMPHandleMgmtRingDmaDoneInterrupt( + IN PRTMP_ADAPTER pAd); + +VOID RTMPHandleTBTTInterrupt( + IN PRTMP_ADAPTER pAd); + +VOID RTMPHandlePreTBTTInterrupt( + IN PRTMP_ADAPTER pAd); + +void RTMPHandleTwakeupInterrupt( + IN PRTMP_ADAPTER pAd); + +VOID RTMPHandleRxCoherentInterrupt( + IN PRTMP_ADAPTER pAd); + + +BOOLEAN TxFrameIsAggregatible( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pPrevAddr1, + IN PUCHAR p8023hdr); + +BOOLEAN PeerIsAggreOn( + IN PRTMP_ADAPTER pAd, + IN ULONG TxRate, + IN PMAC_TABLE_ENTRY pMacEntry); + + +NDIS_STATUS Sniff2BytesFromNdisBuffer( + IN PNDIS_BUFFER pFirstBuffer, + IN UCHAR DesiredOffset, + OUT PUCHAR pByte0, + OUT PUCHAR pByte1); + +NDIS_STATUS STASendPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket); + +VOID STASendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET ppPacketArray, + IN UINT NumberOfPackets); + +VOID RTMPDeQueuePacket( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bIntContext, + IN UCHAR QueIdx, + IN UCHAR Max_Tx_Packets); + +NDIS_STATUS RTMPHardTransmit( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN UCHAR QueIdx, + OUT PULONG pFreeTXDLeft); + +NDIS_STATUS STAHardTransmit( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN UCHAR QueIdx); + +VOID STARxEAPOLFrameIndicate( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); + +NDIS_STATUS RTMPFreeTXDRequest( + IN PRTMP_ADAPTER pAd, + IN UCHAR RingType, + IN UCHAR NumberRequired, + IN PUCHAR FreeNumberIs); + +NDIS_STATUS MlmeHardTransmit( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket); + +NDIS_STATUS MlmeHardTransmitMgmtRing( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket); + +#ifdef RTMP_MAC_PCI +NDIS_STATUS MlmeHardTransmitTxRing( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket); + +NDIS_STATUS MlmeDataHardTransmit( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket); + +VOID RTMPWriteTxDescriptor( + IN PRTMP_ADAPTER pAd, + IN PTXD_STRUC pTxD, + IN BOOLEAN bWIV, + IN UCHAR QSEL); +#endif // RTMP_MAC_PCI // + +USHORT RTMPCalcDuration( + IN PRTMP_ADAPTER pAd, + IN UCHAR Rate, + IN ULONG Size); + +VOID RTMPWriteTxWI( + IN PRTMP_ADAPTER pAd, + IN PTXWI_STRUC pTxWI, + IN BOOLEAN FRAG, + IN BOOLEAN CFACK, + IN BOOLEAN InsTimestamp, + IN BOOLEAN AMPDU, + IN BOOLEAN Ack, + IN BOOLEAN NSeq, // HW new a sequence. + IN UCHAR BASize, + IN UCHAR WCID, + IN ULONG Length, + IN UCHAR PID, + IN UCHAR TID, + IN UCHAR TxRate, + IN UCHAR Txopmode, + IN BOOLEAN CfAck, + IN HTTRANSMIT_SETTING *pTransmit); + + +VOID RTMPWriteTxWI_Data( + IN PRTMP_ADAPTER pAd, + IN OUT PTXWI_STRUC pTxWI, + IN TX_BLK *pTxBlk); + + +VOID RTMPWriteTxWI_Cache( + IN PRTMP_ADAPTER pAd, + IN OUT PTXWI_STRUC pTxWI, + IN TX_BLK *pTxBlk); + +VOID RTMPSuspendMsduTransmission( + IN PRTMP_ADAPTER pAd); + +VOID RTMPResumeMsduTransmission( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS MiniportMMRequest( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN PUCHAR pData, + IN UINT Length); + +VOID RTMPSendNullFrame( + IN PRTMP_ADAPTER pAd, + IN UCHAR TxRate, + IN BOOLEAN bQosNull); + +VOID RTMPSendDisassociationFrame( + IN PRTMP_ADAPTER pAd); + +VOID RTMPSendRTSFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN unsigned int NextMpduSize, + IN UCHAR TxRate, + IN UCHAR RTSRate, + IN USHORT AckDuration, + IN UCHAR QueIdx, + IN UCHAR FrameGap); + + +NDIS_STATUS RTMPApplyPacketFilter( + IN PRTMP_ADAPTER pAd, + IN PRT28XX_RXD_STRUC pRxD, + IN PHEADER_802_11 pHeader); + +PQUEUE_HEADER RTMPCheckTxSwQueue( + IN PRTMP_ADAPTER pAd, + OUT UCHAR *QueIdx); + +#ifdef CONFIG_STA_SUPPORT +VOID RTMPReportMicError( + IN PRTMP_ADAPTER pAd, + IN PCIPHER_KEY pWpaKey); + +VOID WpaMicFailureReportFrame( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID WpaDisassocApAndBlockAssoc( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID WpaStaPairwiseKeySetting( + IN PRTMP_ADAPTER pAd); + +VOID WpaStaGroupKeySetting( + IN PRTMP_ADAPTER pAd); + +VOID WpaSendEapolStart( + IN PRTMP_ADAPTER pAdapter, + IN PUCHAR pBssid); +#endif // CONFIG_STA_SUPPORT // + +NDIS_STATUS RTMPCloneNdisPacket( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN pInsAMSDUHdr, + IN PNDIS_PACKET pInPacket, + OUT PNDIS_PACKET *ppOutPacket); + +NDIS_STATUS RTMPAllocateNdisPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET *pPacket, + IN PUCHAR pHeader, + IN UINT HeaderLen, + IN PUCHAR pData, + IN UINT DataLen); + +VOID RTMPFreeNdisPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket); + +BOOLEAN RTMPFreeTXDUponTxDmaDone( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx); + +BOOLEAN RTMPCheckDHCPFrame( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket); + + +BOOLEAN RTMPCheckEtherType( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PMAC_TABLE_ENTRY pMacEntry, + OUT PUCHAR pUserPriority, + OUT PUCHAR pQueIdx); + + +VOID RTMPCckBbpTuning( + IN PRTMP_ADAPTER pAd, + IN UINT TxRate); +// +// MLME routines +// + +// Asic/RF/BBP related functions + +VOID AsicAdjustTxPower( + IN PRTMP_ADAPTER pAd); + +VOID AsicUpdateProtect( + IN PRTMP_ADAPTER pAd, + IN USHORT OperaionMode, + IN UCHAR SetMask, + IN BOOLEAN bDisableBGProtect, + IN BOOLEAN bNonGFExist); + +VOID AsicBBPAdjust( + IN RTMP_ADAPTER *pAd); + +VOID AsicSwitchChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel, + IN BOOLEAN bScan); + +VOID AsicLockChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel) ; + +VOID AsicAntennaSelect( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel); + +VOID AsicAntennaSetting( + IN PRTMP_ADAPTER pAd, + IN ABGBAND_STATE BandState); + +VOID AsicRfTuningExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +#ifdef CONFIG_STA_SUPPORT + +VOID AsicResetBBPAgent( + IN PRTMP_ADAPTER pAd); + +VOID AsicSleepThenAutoWakeup( + IN PRTMP_ADAPTER pAd, + IN USHORT TbttNumToNextWakeUp); + +VOID AsicForceSleep( + IN PRTMP_ADAPTER pAd); + +VOID AsicForceWakeup( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bFromTx); +#endif // CONFIG_STA_SUPPORT // + +VOID AsicSetBssid( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pBssid); + +VOID AsicSetMcastWC( + IN PRTMP_ADAPTER pAd); + + +VOID AsicDelWcidTab( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid); + +VOID AsicEnableRDG( + IN PRTMP_ADAPTER pAd); + +VOID AsicDisableRDG( + IN PRTMP_ADAPTER pAd); + +VOID AsicDisableSync( + IN PRTMP_ADAPTER pAd); + +VOID AsicEnableBssSync( + IN PRTMP_ADAPTER pAd); + +VOID AsicEnableIbssSync( + IN PRTMP_ADAPTER pAd); + +VOID AsicSetEdcaParm( + IN PRTMP_ADAPTER pAd, + IN PEDCA_PARM pEdcaParm); + +VOID AsicSetSlotTime( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bUseShortSlotTime); + + +VOID AsicAddSharedKeyEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIndex, + IN UCHAR KeyIdx, + IN PCIPHER_KEY pCipherKey); + +VOID AsicRemoveSharedKeyEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIndex, + IN UCHAR KeyIdx); + +VOID AsicUpdateWCIDIVEIV( + IN PRTMP_ADAPTER pAd, + IN USHORT WCID, + IN ULONG uIV, + IN ULONG uEIV); + +VOID AsicUpdateRxWCIDTable( + IN PRTMP_ADAPTER pAd, + IN USHORT WCID, + IN PUCHAR pAddr); + +VOID AsicUpdateWcidAttributeEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIdx, + IN UCHAR KeyIdx, + IN UCHAR CipherAlg, + IN UINT8 Wcid, + IN UINT8 KeyTabFlag); + +VOID AsicAddPairwiseKeyEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR WCID, + IN PCIPHER_KEY pCipherKey); + +VOID AsicRemovePairwiseKeyEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid); + +BOOLEAN AsicSendCommandToMcu( + IN PRTMP_ADAPTER pAd, + IN UCHAR Command, + IN UCHAR Token, + IN UCHAR Arg0, + IN UCHAR Arg1); + + +#ifdef RTMP_MAC_PCI +BOOLEAN AsicCheckCommanOk( + IN PRTMP_ADAPTER pAd, + IN UCHAR Command); +#endif // RTMP_MAC_PCI // + + +VOID MacAddrRandomBssid( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pAddr); + +VOID MgtMacHeaderInit( + IN PRTMP_ADAPTER pAd, + IN OUT PHEADER_802_11 pHdr80211, + IN UCHAR SubType, + IN UCHAR ToDs, + IN PUCHAR pDA, + IN PUCHAR pBssid); + +VOID MlmeRadioOff( + IN PRTMP_ADAPTER pAd); + +VOID MlmeRadioOn( + IN PRTMP_ADAPTER pAd); + + +VOID BssTableInit( + IN BSS_TABLE *Tab); + +#ifdef DOT11_N_SUPPORT +VOID BATableInit( + IN PRTMP_ADAPTER pAd, + IN BA_TABLE *Tab); + +VOID BATableExit( + IN RTMP_ADAPTER *pAd); +#endif // DOT11_N_SUPPORT // + +ULONG BssTableSearch( + IN BSS_TABLE *Tab, + IN PUCHAR pBssid, + IN UCHAR Channel); + +ULONG BssSsidTableSearch( + IN BSS_TABLE *Tab, + IN PUCHAR pBssid, + IN PUCHAR pSsid, + IN UCHAR SsidLen, + IN UCHAR Channel); + +ULONG BssTableSearchWithSSID( + IN BSS_TABLE *Tab, + IN PUCHAR Bssid, + IN PUCHAR pSsid, + IN UCHAR SsidLen, + IN UCHAR Channel); + +ULONG BssSsidTableSearchBySSID( + IN BSS_TABLE *Tab, + IN PUCHAR pSsid, + IN UCHAR SsidLen); + +VOID BssTableDeleteEntry( + IN OUT PBSS_TABLE pTab, + IN PUCHAR pBssid, + IN UCHAR Channel); + +#ifdef DOT11_N_SUPPORT +VOID BATableDeleteORIEntry( + IN OUT PRTMP_ADAPTER pAd, + IN BA_ORI_ENTRY *pBAORIEntry); + +VOID BATableDeleteRECEntry( + IN OUT PRTMP_ADAPTER pAd, + IN BA_REC_ENTRY *pBARECEntry); + +VOID BATableTearORIEntry( + IN OUT PRTMP_ADAPTER pAd, + IN UCHAR TID, + IN UCHAR Wcid, + IN BOOLEAN bForceDelete, + IN BOOLEAN ALL); + +VOID BATableTearRECEntry( + IN OUT PRTMP_ADAPTER pAd, + IN UCHAR TID, + IN UCHAR WCID, + IN BOOLEAN ALL); +#endif // DOT11_N_SUPPORT // + +VOID BssEntrySet( + IN PRTMP_ADAPTER pAd, + OUT PBSS_ENTRY pBss, + IN PUCHAR pBssid, + IN CHAR Ssid[], + IN UCHAR SsidLen, + IN UCHAR BssType, + IN USHORT BeaconPeriod, + IN PCF_PARM CfParm, + IN USHORT AtimWin, + IN USHORT CapabilityInfo, + IN UCHAR SupRate[], + IN UCHAR SupRateLen, + IN UCHAR ExtRate[], + IN UCHAR ExtRateLen, + IN HT_CAPABILITY_IE *pHtCapability, + IN ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE + IN UCHAR HtCapabilityLen, + IN UCHAR AddHtInfoLen, + IN UCHAR NewExtChanOffset, + IN UCHAR Channel, + IN CHAR Rssi, + IN LARGE_INTEGER TimeStamp, + IN UCHAR CkipFlag, + IN PEDCA_PARM pEdcaParm, + IN PQOS_CAPABILITY_PARM pQosCapability, + IN PQBSS_LOAD_PARM pQbssLoad, + IN USHORT LengthVIE, + IN PNDIS_802_11_VARIABLE_IEs pVIE); + +ULONG BssTableSetEntry( + IN PRTMP_ADAPTER pAd, + OUT PBSS_TABLE pTab, + IN PUCHAR pBssid, + IN CHAR Ssid[], + IN UCHAR SsidLen, + IN UCHAR BssType, + IN USHORT BeaconPeriod, + IN CF_PARM *CfParm, + IN USHORT AtimWin, + IN USHORT CapabilityInfo, + IN UCHAR SupRate[], + IN UCHAR SupRateLen, + IN UCHAR ExtRate[], + IN UCHAR ExtRateLen, + IN HT_CAPABILITY_IE *pHtCapability, + IN ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE + IN UCHAR HtCapabilityLen, + IN UCHAR AddHtInfoLen, + IN UCHAR NewExtChanOffset, + IN UCHAR Channel, + IN CHAR Rssi, + IN LARGE_INTEGER TimeStamp, + IN UCHAR CkipFlag, + IN PEDCA_PARM pEdcaParm, + IN PQOS_CAPABILITY_PARM pQosCapability, + IN PQBSS_LOAD_PARM pQbssLoad, + IN USHORT LengthVIE, + IN PNDIS_802_11_VARIABLE_IEs pVIE); + +#ifdef DOT11_N_SUPPORT +VOID BATableInsertEntry( + IN PRTMP_ADAPTER pAd, + IN USHORT Aid, + IN USHORT TimeOutValue, + IN USHORT StartingSeq, + IN UCHAR TID, + IN UCHAR BAWinSize, + IN UCHAR OriginatorStatus, + IN BOOLEAN IsRecipient); + +#ifdef DOT11N_DRAFT3 +VOID Bss2040CoexistTimeOut( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + + +VOID TriEventInit( + IN PRTMP_ADAPTER pAd); + +INT TriEventTableSetEntry( + IN PRTMP_ADAPTER pAd, + OUT TRIGGER_EVENT_TAB *Tab, + IN PUCHAR pBssid, + IN HT_CAPABILITY_IE *pHtCapability, + IN UCHAR HtCapabilityLen, + IN UCHAR RegClass, + IN UCHAR ChannelNo); + +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +VOID BssTableSsidSort( + IN PRTMP_ADAPTER pAd, + OUT BSS_TABLE *OutTab, + IN CHAR Ssid[], + IN UCHAR SsidLen); + +VOID BssTableSortByRssi( + IN OUT BSS_TABLE *OutTab); + +VOID BssCipherParse( + IN OUT PBSS_ENTRY pBss); + +NDIS_STATUS MlmeQueueInit( + IN MLME_QUEUE *Queue); + +VOID MlmeQueueDestroy( + IN MLME_QUEUE *Queue); + +BOOLEAN MlmeEnqueue( + IN PRTMP_ADAPTER pAd, + IN ULONG Machine, + IN ULONG MsgType, + IN ULONG MsgLen, + IN VOID *Msg, + IN ULONG Priv); + +BOOLEAN MlmeEnqueueForRecv( + IN PRTMP_ADAPTER pAd, + IN ULONG Wcid, + IN ULONG TimeStampHigh, + IN ULONG TimeStampLow, + IN UCHAR Rssi0, + IN UCHAR Rssi1, + IN UCHAR Rssi2, + IN ULONG MsgLen, + IN PVOID Msg, + IN UCHAR Signal); + + +BOOLEAN MlmeDequeue( + IN MLME_QUEUE *Queue, + OUT MLME_QUEUE_ELEM **Elem); + +VOID MlmeRestartStateMachine( + IN PRTMP_ADAPTER pAd); + +BOOLEAN MlmeQueueEmpty( + IN MLME_QUEUE *Queue); + +BOOLEAN MlmeQueueFull( + IN MLME_QUEUE *Queue); + +BOOLEAN MsgTypeSubst( + IN PRTMP_ADAPTER pAd, + IN PFRAME_802_11 pFrame, + OUT INT *Machine, + OUT INT *MsgType); + +VOID StateMachineInit( + IN STATE_MACHINE *Sm, + IN STATE_MACHINE_FUNC Trans[], + IN ULONG StNr, + IN ULONG MsgNr, + IN STATE_MACHINE_FUNC DefFunc, + IN ULONG InitState, + IN ULONG Base); + +VOID StateMachineSetAction( + IN STATE_MACHINE *S, + IN ULONG St, + ULONG Msg, + IN STATE_MACHINE_FUNC F); + +VOID StateMachinePerformAction( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + IN MLME_QUEUE_ELEM *Elem, + IN ULONG CurrState); + +VOID Drop( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID AssocStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID ReassocTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID AssocTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID DisassocTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +//---------------------------------------------- +VOID MlmeDisassocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeAssocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeReassocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeDisassocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerAssocRspAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerReassocRspAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerDisassocAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID DisassocTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID AssocTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID ReassocTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID Cls3errAction( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr); + +VOID InvalidStateWhenAssoc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID InvalidStateWhenReassoc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID InvalidStateWhenDisassociate( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + + +VOID ComposePsPoll( + IN PRTMP_ADAPTER pAd); + +VOID ComposeNullFrame( + IN PRTMP_ADAPTER pAd); + +VOID AssocPostProc( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr2, + IN USHORT CapabilityInfo, + IN USHORT Aid, + IN UCHAR SupRate[], + IN UCHAR SupRateLen, + IN UCHAR ExtRate[], + IN UCHAR ExtRateLen, + IN PEDCA_PARM pEdcaParm, + IN HT_CAPABILITY_IE *pHtCapability, + IN UCHAR HtCapabilityLen, + IN ADD_HT_INFO_IE *pAddHtInfo); + +VOID AuthStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN PSTATE_MACHINE sm, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID AuthTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID MlmeAuthReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerAuthRspAtSeq2Action( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerAuthRspAtSeq4Action( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID AuthTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID Cls2errAction( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr); + +VOID MlmeDeauthReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID InvalidStateWhenAuth( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +//============================================= + +VOID AuthRspStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN PSTATE_MACHINE Sm, + IN STATE_MACHINE_FUNC Trans[]); + +VOID PeerDeauthAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerAuthSimpleRspGenAndSend( + IN PRTMP_ADAPTER pAd, + IN PHEADER_802_11 pHdr80211, + IN USHORT Alg, + IN USHORT Seq, + IN USHORT Reason, + IN USHORT Status); + +// +// Private routines in dls.c +// + +#ifdef CONFIG_STA_SUPPORT +#ifdef QOS_DLS_SUPPORT +void DlsStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID MlmeDlsReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerDlsReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerDlsRspAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeDlsTearDownAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerDlsTearDownAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID RTMPCheckDLSTimeOut( + IN PRTMP_ADAPTER pAd); + +BOOLEAN RTMPRcvFrameDLSCheck( + IN PRTMP_ADAPTER pAd, + IN PHEADER_802_11 pHeader, + IN ULONG Len, + IN PRT28XX_RXD_STRUC pRxD); + +INT RTMPCheckDLSFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA); + +VOID RTMPSendDLSTearDownFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA); + +NDIS_STATUS RTMPSendSTAKeyRequest( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA); + +NDIS_STATUS RTMPSendSTAKeyHandShake( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA); + +VOID DlsTimeoutAction( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +BOOLEAN MlmeDlsReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PRT_802_11_DLS *pDLS, + OUT PUSHORT pReason); + +INT Set_DlsEntryInfo_Display_Proc( + IN PRTMP_ADAPTER pAd, + IN PUCHAR arg); + +MAC_TABLE_ENTRY *MacTableInsertDlsEntry( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN UINT DlsEntryIdx); + +BOOLEAN MacTableDeleteDlsEntry( + IN PRTMP_ADAPTER pAd, + IN USHORT wcid, + IN PUCHAR pAddr); + +MAC_TABLE_ENTRY *DlsEntryTableLookup( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN BOOLEAN bResetIdelCount); + +MAC_TABLE_ENTRY *DlsEntryTableLookupByWcid( + IN PRTMP_ADAPTER pAd, + IN UCHAR wcid, + IN PUCHAR pAddr, + IN BOOLEAN bResetIdelCount); + +INT Set_DlsAddEntry_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_DlsTearDownEntry_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // QOS_DLS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +#ifdef QOS_DLS_SUPPORT +BOOLEAN PeerDlsReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pDA, + OUT PUCHAR pSA, + OUT USHORT *pCapabilityInfo, + OUT USHORT *pDlsTimeout, + OUT UCHAR *pRatesLen, + OUT UCHAR Rates[], + OUT UCHAR *pHtCapabilityLen, + OUT HT_CAPABILITY_IE *pHtCapability); + +BOOLEAN PeerDlsRspSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pDA, + OUT PUCHAR pSA, + OUT USHORT *pCapabilityInfo, + OUT USHORT *pStatus, + OUT UCHAR *pRatesLen, + OUT UCHAR Rates[], + OUT UCHAR *pHtCapabilityLen, + OUT HT_CAPABILITY_IE *pHtCapability); + +BOOLEAN PeerDlsTearDownSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pDA, + OUT PUCHAR pSA, + OUT USHORT *pReason); +#endif // QOS_DLS_SUPPORT // + +BOOLEAN PeerProbeReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT CHAR Ssid[], + OUT UCHAR *SsidLen, + OUT BOOLEAN *bRequestRssi); + +//======================================== + +VOID SyncStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID BeaconTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID ScanTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID MlmeScanReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID InvalidStateWhenScan( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID InvalidStateWhenJoin( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID InvalidStateWhenStart( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerBeacon( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID EnqueueProbeRequest( + IN PRTMP_ADAPTER pAd); + +BOOLEAN ScanRunning( + IN PRTMP_ADAPTER pAd); +//========================================= + +VOID MlmeCntlInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + OUT STATE_MACHINE_FUNC Trans[]); + +VOID MlmeCntlMachinePerformAction( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlIdleProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlOidScanProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlOidSsidProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM * Elem); + +VOID CntlOidRTBssidProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM * Elem); + +VOID CntlMlmeRoamingProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM * Elem); + +VOID CntlWaitDisassocProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlWaitJoinProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlWaitReassocProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlWaitStartProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlWaitAuthProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlWaitAuthProc2( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID CntlWaitAssocProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +#ifdef QOS_DLS_SUPPORT +VOID CntlOidDLSSetupProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); +#endif // QOS_DLS_SUPPORT // + + +VOID LinkUp( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssType); + +VOID LinkDown( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN IsReqFromAP); + +VOID IterateOnBssTab( + IN PRTMP_ADAPTER pAd); + +VOID IterateOnBssTab2( + IN PRTMP_ADAPTER pAd);; + +VOID JoinParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_JOIN_REQ_STRUCT *JoinReq, + IN ULONG BssIdx); + +VOID AssocParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_ASSOC_REQ_STRUCT *AssocReq, + IN PUCHAR pAddr, + IN USHORT CapabilityInfo, + IN ULONG Timeout, + IN USHORT ListenIntv); + +VOID ScanParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_SCAN_REQ_STRUCT *ScanReq, + IN STRING Ssid[], + IN UCHAR SsidLen, + IN UCHAR BssType, + IN UCHAR ScanType); + +VOID DisassocParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_DISASSOC_REQ_STRUCT *DisassocReq, + IN PUCHAR pAddr, + IN USHORT Reason); + +VOID StartParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_START_REQ_STRUCT *StartReq, + IN CHAR Ssid[], + IN UCHAR SsidLen); + +VOID AuthParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_AUTH_REQ_STRUCT *AuthReq, + IN PUCHAR pAddr, + IN USHORT Alg); + +VOID EnqueuePsPoll( + IN PRTMP_ADAPTER pAd); + +VOID EnqueueBeaconFrame( + IN PRTMP_ADAPTER pAd); + +VOID MlmeJoinReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeScanReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID MlmeStartReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID ScanTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID BeaconTimeoutAtJoinAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerBeaconAtScanAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerBeaconAtJoinAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerBeacon( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerProbeReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +VOID ScanNextChannel( + IN PRTMP_ADAPTER pAd); + +ULONG MakeIbssBeacon( + IN PRTMP_ADAPTER pAd); + +#ifdef CONFIG_STA_SUPPORT +VOID InitChannelRelatedValue( + IN PRTMP_ADAPTER pAd); +#endif // CONFIG_STA_SUPPORT // + +BOOLEAN MlmeScanReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT UCHAR *BssType, + OUT CHAR ssid[], + OUT UCHAR *SsidLen, + OUT UCHAR *ScanType); + +BOOLEAN PeerBeaconAndProbeRspSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + IN UCHAR MsgChannel, + OUT PUCHAR pAddr2, + OUT PUCHAR pBssid, + OUT CHAR Ssid[], + OUT UCHAR *pSsidLen, + OUT UCHAR *pBssType, + OUT USHORT *pBeaconPeriod, + OUT UCHAR *pChannel, + OUT UCHAR *pNewChannel, + OUT LARGE_INTEGER *pTimestamp, + OUT CF_PARM *pCfParm, + OUT USHORT *pAtimWin, + OUT USHORT *pCapabilityInfo, + OUT UCHAR *pErp, + OUT UCHAR *pDtimCount, + OUT UCHAR *pDtimPeriod, + OUT UCHAR *pBcastFlag, + OUT UCHAR *pMessageToMe, + OUT UCHAR SupRate[], + OUT UCHAR *pSupRateLen, + OUT UCHAR ExtRate[], + OUT UCHAR *pExtRateLen, + OUT UCHAR *pCkipFlag, + OUT UCHAR *pAironetCellPowerLimit, + OUT PEDCA_PARM pEdcaParm, + OUT PQBSS_LOAD_PARM pQbssLoad, + OUT PQOS_CAPABILITY_PARM pQosCapability, + OUT ULONG *pRalinkIe, + OUT UCHAR *pHtCapabilityLen, +#ifdef CONFIG_STA_SUPPORT + OUT UCHAR *pPreNHtCapabilityLen, +#endif // CONFIG_STA_SUPPORT // + OUT HT_CAPABILITY_IE *pHtCapability, + OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo, + OUT UCHAR *AddHtInfoLen, + OUT ADD_HT_INFO_IE *AddHtInfo, + OUT UCHAR *NewExtChannel, + OUT USHORT *LengthVIE, + OUT PNDIS_802_11_VARIABLE_IEs pVIE); + + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 +BOOLEAN PeerBeaconAndProbeRspSanity2( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + IN OVERLAP_BSS_SCAN_IE *BssScan, + OUT UCHAR *RegClass); +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +BOOLEAN PeerAddBAReqActionSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2); + +BOOLEAN PeerAddBARspActionSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen); + +BOOLEAN PeerDelBAActionSanity( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN VOID *pMsg, + IN ULONG MsgLen); + +BOOLEAN MlmeAssocReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pApAddr, + OUT USHORT *CapabilityInfo, + OUT ULONG *Timeout, + OUT USHORT *ListenIntv); + +BOOLEAN MlmeAuthReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr, + OUT ULONG *Timeout, + OUT USHORT *Alg); + +BOOLEAN MlmeStartReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT CHAR Ssid[], + OUT UCHAR *Ssidlen); + +BOOLEAN PeerAuthSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr, + OUT USHORT *Alg, + OUT USHORT *Seq, + OUT USHORT *Status, + OUT CHAR ChlgText[]); + +BOOLEAN PeerAssocRspSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT USHORT *pCapabilityInfo, + OUT USHORT *pStatus, + OUT USHORT *pAid, + OUT UCHAR SupRate[], + OUT UCHAR *pSupRateLen, + OUT UCHAR ExtRate[], + OUT UCHAR *pExtRateLen, + OUT HT_CAPABILITY_IE *pHtCapability, + OUT ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE + OUT UCHAR *pHtCapabilityLen, + OUT UCHAR *pAddHtInfoLen, + OUT UCHAR *pNewExtChannelOffset, + OUT PEDCA_PARM pEdcaParm, + OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo, + OUT UCHAR *pCkipFlag); + +BOOLEAN PeerDisassocSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT USHORT *Reason); + +BOOLEAN PeerDeauthSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr1, + OUT PUCHAR pAddr2, + OUT PUCHAR pAddr3, + OUT USHORT *Reason); + +BOOLEAN GetTimBit( + IN CHAR *Ptr, + IN USHORT Aid, + OUT UCHAR *TimLen, + OUT UCHAR *BcastFlag, + OUT UCHAR *DtimCount, + OUT UCHAR *DtimPeriod, + OUT UCHAR *MessageToMe); + +UCHAR ChannelSanity( + IN PRTMP_ADAPTER pAd, + IN UCHAR channel); + +NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity( + IN PBSS_ENTRY pBss); + + +BOOLEAN MlmeDelBAReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen); + +BOOLEAN MlmeAddBAReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2); + +ULONG MakeOutgoingFrame( + OUT UCHAR *Buffer, + OUT ULONG *Length, ...); + +VOID LfsrInit( + IN PRTMP_ADAPTER pAd, + IN ULONG Seed); + +UCHAR RandomByte( + IN PRTMP_ADAPTER pAd); + +VOID AsicUpdateAutoFallBackTable( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pTxRate); + +VOID MlmePeriodicExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID LinkDownExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID LinkUpExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID STAMlmePeriodicExec( + PRTMP_ADAPTER pAd); + +VOID MlmeAutoScan( + IN PRTMP_ADAPTER pAd); + +VOID MlmeAutoReconnectLastSSID( + IN PRTMP_ADAPTER pAd); + +BOOLEAN MlmeValidateSSID( + IN PUCHAR pSsid, + IN UCHAR SsidLen); + +VOID MlmeCheckForRoaming( + IN PRTMP_ADAPTER pAd, + IN ULONG Now32); + +BOOLEAN MlmeCheckForFastRoaming( + IN PRTMP_ADAPTER pAd); + +VOID MlmeDynamicTxRateSwitching( + IN PRTMP_ADAPTER pAd); + +VOID MlmeSetTxRate( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PRTMP_TX_RATE_SWITCH pTxRate); + +VOID MlmeSelectTxRateTable( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PUCHAR *ppTable, + IN PUCHAR pTableSize, + IN PUCHAR pInitTxRateIdx); + +VOID MlmeCalculateChannelQuality( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pMacEntry, + IN ULONG Now); + +VOID MlmeCheckPsmChange( + IN PRTMP_ADAPTER pAd, + IN ULONG Now32); + +VOID MlmeSetPsmBit( + IN PRTMP_ADAPTER pAd, + IN USHORT psm); + +VOID MlmeSetTxPreamble( + IN PRTMP_ADAPTER pAd, + IN USHORT TxPreamble); + +VOID UpdateBasicRateBitmap( + IN PRTMP_ADAPTER pAd); + +VOID MlmeUpdateTxRates( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bLinkUp, + IN UCHAR apidx); + +#ifdef DOT11_N_SUPPORT +VOID MlmeUpdateHtTxRates( + IN PRTMP_ADAPTER pAd, + IN UCHAR apidx); +#endif // DOT11_N_SUPPORT // + +VOID RTMPCheckRates( + IN PRTMP_ADAPTER pAd, + IN OUT UCHAR SupRate[], + IN OUT UCHAR *SupRateLen); + +#ifdef CONFIG_STA_SUPPORT +BOOLEAN RTMPCheckChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR CentralChannel, + IN UCHAR Channel); +#endif // CONFIG_STA_SUPPORT // + +BOOLEAN RTMPCheckHt( + IN PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN OUT HT_CAPABILITY_IE *pHtCapability, + IN OUT ADD_HT_INFO_IE *pAddHtInfo); + +VOID StaQuickResponeForRateUpExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID AsicBbpTuning1( + IN PRTMP_ADAPTER pAd); + +VOID AsicBbpTuning2( + IN PRTMP_ADAPTER pAd); + +VOID RTMPUpdateMlmeRate( + IN PRTMP_ADAPTER pAd); + +CHAR RTMPMaxRssi( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi0, + IN CHAR Rssi1, + IN CHAR Rssi2); +//Fix 2860 compile bug. +VOID AsicSetRxAnt( + IN PRTMP_ADAPTER pAd, + IN UCHAR Ant); + +#ifdef RT30xx + +//Move AsicSetRxAnt to the upper to fix 2860 compile bug. +VOID RTMPFilterCalibration( + IN PRTMP_ADAPTER pAd); + +#ifdef RTMP_EFUSE_SUPPORT +//2008/09/11:KH add to support efuse<-- +INT set_eFuseGetFreeBlockCount_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT set_eFusedump_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT set_eFuseLoadFromBin_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +VOID eFusePhysicalReadRegisters( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN USHORT Length, + OUT USHORT* pData); + +int RtmpEfuseSupportCheck( + IN RTMP_ADAPTER *pAd); + +#ifdef RALINK_ATE +INT set_eFuseBufferModeWriteBack_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // RALINK_ATE // + +INT eFuseLoadEEPROM( + IN PRTMP_ADAPTER pAd); + +INT eFuseWriteEeeppromBuf( + IN PRTMP_ADAPTER pAd); + +VOID eFuseGetFreeBlockCount(IN PRTMP_ADAPTER pAd, + PUINT EfuseFreeBlock); + +INT eFuse_init( + IN PRTMP_ADAPTER pAd); + +NTSTATUS eFuseRead( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + OUT PUSHORT pData, + IN USHORT Length); + +NTSTATUS eFuseWrite( + IN PRTMP_ADAPTER pAd, + IN USHORT Offset, + IN PUSHORT pData, + IN USHORT length); +//2008/09/11:KH add to support efuse--> +#endif // RTMP_EFUSE_SUPPORT // + +// add by johnli, RF power sequence setup +VOID RT30xxLoadRFNormalModeSetup( + IN PRTMP_ADAPTER pAd); + +VOID RT30xxLoadRFSleepModeSetup( + IN PRTMP_ADAPTER pAd); + +VOID RT30xxReverseRFSleepModeSetup( + IN PRTMP_ADAPTER pAd); +// end johnli + + + +VOID RT30xxHaltAction( + IN PRTMP_ADAPTER pAd); + +VOID RT30xxSetRxAnt( + IN PRTMP_ADAPTER pAd, + IN UCHAR Ant); +#endif // RT30xx // + +#ifdef RT35xx +VOID NICInitRT3572RFRegisters( + IN PRTMP_ADAPTER pAd); + +VOID RT3572ReverseRFSleepModeSetup( + IN PRTMP_ADAPTER pAd); +#endif // RT35xx // + + +VOID AsicEvaluateRxAnt( + IN PRTMP_ADAPTER pAd); + +VOID AsicRxAntEvalTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID APSDPeriodicExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +BOOLEAN RTMPCheckEntryEnableAutoRateSwitch( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry); + +UCHAR RTMPStaFixedTxMode( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry); + +VOID RTMPUpdateLegacyTxSetting( + UCHAR fixed_tx_mode, + PMAC_TABLE_ENTRY pEntry); + +BOOLEAN RTMPAutoRateSwitchCheck( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS MlmeInit( + IN PRTMP_ADAPTER pAd); + +VOID MlmeHandler( + IN PRTMP_ADAPTER pAd); + +VOID MlmeHalt( + IN PRTMP_ADAPTER pAd); + +VOID MlmeResetRalinkCounters( + IN PRTMP_ADAPTER pAd); + +VOID BuildChannelList( + IN PRTMP_ADAPTER pAd); + +UCHAR FirstChannel( + IN PRTMP_ADAPTER pAd); + +UCHAR NextChannel( + IN PRTMP_ADAPTER pAd, + IN UCHAR channel); + +VOID ChangeToCellPowerLimit( + IN PRTMP_ADAPTER pAd, + IN UCHAR AironetCellPowerLimit); + +// +// Prototypes of function definition in cmm_tkip.c +// +VOID RTMPInitTkipEngine( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pTKey, + IN UCHAR KeyId, + IN PUCHAR pTA, + IN PUCHAR pMICKey, + IN PUCHAR pTSC, + OUT PULONG pIV16, + OUT PULONG pIV32); + +VOID RTMPInitMICEngine( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pKey, + IN PUCHAR pDA, + IN PUCHAR pSA, + IN UCHAR UserPriority, + IN PUCHAR pMICKey); + +BOOLEAN RTMPTkipCompareMICValue( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pSrc, + IN PUCHAR pDA, + IN PUCHAR pSA, + IN PUCHAR pMICKey, + IN UCHAR UserPriority, + IN UINT Len); + +VOID RTMPCalculateMICValue( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PUCHAR pEncap, + IN PCIPHER_KEY pKey, + IN UCHAR apidx); + +BOOLEAN RTMPTkipCompareMICValueWithLLC( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pLLC, + IN PUCHAR pSrc, + IN PUCHAR pDA, + IN PUCHAR pSA, + IN PUCHAR pMICKey, + IN UINT Len); + +VOID RTMPTkipAppendByte( + IN PTKIP_KEY_INFO pTkip, + IN UCHAR uChar); + +VOID RTMPTkipAppend( + IN PTKIP_KEY_INFO pTkip, + IN PUCHAR pSrc, + IN UINT nBytes); + +VOID RTMPTkipGetMIC( + IN PTKIP_KEY_INFO pTkip); + +// +// Prototypes of function definition in cmm_cfg.c +// +INT RT_CfgSetCountryRegion( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg, + IN INT band); + +INT RT_CfgSetWirelessMode( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT RT_CfgSetShortSlot( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT RT_CfgSetWepKey( + IN PRTMP_ADAPTER pAd, + IN PSTRING keyString, + IN CIPHER_KEY *pSharedKey, + IN INT keyIdx); + +INT RT_CfgSetWPAPSKKey( + IN RTMP_ADAPTER *pAd, + IN PSTRING keyString, + IN UCHAR *pHashStr, + IN INT hashStrLen, + OUT PUCHAR pPMKBuf); + +INT RT_CfgSetFixedTxPhyMode( + IN PSTRING arg); + +INT RT_CfgSetMacAddress( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT RT_CfgSetTxMCSProc( + IN PSTRING arg, + OUT BOOLEAN *pAutoRate); + +INT RT_CfgSetAutoFallBack( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + + + +// +// Prototypes of function definition in cmm_info.c +// +NDIS_STATUS RTMPWPARemoveKeyProc( + IN PRTMP_ADAPTER pAd, + IN PVOID pBuf); + +VOID RTMPWPARemoveAllKeys( + IN PRTMP_ADAPTER pAd); + +BOOLEAN RTMPCheckStrPrintAble( + IN CHAR *pInPutStr, + IN UCHAR strLen); + +VOID RTMPSetPhyMode( + IN PRTMP_ADAPTER pAd, + IN ULONG phymode); + +VOID RTMPUpdateHTIE( + IN RT_HT_CAPABILITY *pRtHt, + IN UCHAR *pMcsSet, + OUT HT_CAPABILITY_IE *pHtCapability, + OUT ADD_HT_INFO_IE *pAddHtInfo); + +VOID RTMPAddWcidAttributeEntry( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssIdx, + IN UCHAR KeyIdx, + IN UCHAR CipherAlg, + IN MAC_TABLE_ENTRY *pEntry); + +PSTRING GetEncryptType( + CHAR enc); + +PSTRING GetAuthMode( + CHAR auth); + + +VOID RTMPIndicateWPA2Status( + IN PRTMP_ADAPTER pAdapter); + +VOID RTMPOPModeSwitching( + IN PRTMP_ADAPTER pAd); + + +#ifdef DOT11_N_SUPPORT +VOID RTMPSetHT( + IN PRTMP_ADAPTER pAd, + IN OID_SET_HT_PHYMODE *pHTPhyMode); + +VOID RTMPSetIndividualHT( + IN PRTMP_ADAPTER pAd, + IN UCHAR apidx); +#endif // DOT11_N_SUPPORT // + +#ifdef SYSTEM_LOG_SUPPORT +VOID RTMPSendWirelessEvent( + IN PRTMP_ADAPTER pAd, + IN USHORT Event_flag, + IN PUCHAR pAddr, + IN UCHAR BssIdx, + IN CHAR Rssi); +#else +#define RTMPSendWirelessEvent(_pAd, _Event_flag, _pAddr, _BssIdx, _Rssi) +#endif // SYSTEM_LOG_SUPPORT // + +VOID NICUpdateCntlCounters( + IN PRTMP_ADAPTER pAd, + IN PHEADER_802_11 pHeader, + IN UCHAR SubType, + IN PRXWI_STRUC pRxWI); + +VOID DBGPRINT_TX_RING( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx); + +VOID DBGPRINT_RX_RING( + IN PRTMP_ADAPTER pAd); + +CHAR ConvertToRssi( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi, + IN UCHAR RssiNumber); + + +#ifdef DOT11N_DRAFT3 +VOID BuildEffectedChannelList( + IN PRTMP_ADAPTER pAd); + + +VOID DeleteEffectedChannelList( + IN PRTMP_ADAPTER pAd); + +VOID CntlChannelWidth( + IN PRTMP_ADAPTER pAd, + IN UCHAR PrimaryChannel, + IN UCHAR CentralChannel, + IN UCHAR ChannelWidth, + IN UCHAR SecondaryChannelOffset); + +#endif // DOT11N_DRAFT3 // + + +VOID APAsicEvaluateRxAnt( + IN PRTMP_ADAPTER pAd); + + +VOID APAsicRxAntEvalTimeout( + IN PRTMP_ADAPTER pAd); + +#ifdef RT2883_TEMP_PATCH +VOID eTxBfProbeTimerExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); +#endif // RT2883_TEMP_PATCH // + +// +// function prototype in ap_wpa.c +// +VOID RTMPGetTxTscFromAsic( + IN PRTMP_ADAPTER pAd, + IN UCHAR apidx, + OUT PUCHAR pTxTsc); + +MAC_TABLE_ENTRY *PACInquiry( + IN PRTMP_ADAPTER pAd, + IN ULONG Wcid); + +UINT APValidateRSNIE( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PUCHAR pRsnIe, + IN UCHAR rsnie_len); + +VOID HandleCounterMeasure( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry); + +VOID WPAStart4WayHS( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN ULONG TimeInterval); + +VOID WPAStart2WayGroupHS( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry); + +VOID PeerPairMsg1Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerPairMsg2Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerPairMsg3Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerPairMsg4Action( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerGroupMsg1Action( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN MLME_QUEUE_ELEM *Elem); + +VOID PeerGroupMsg2Action( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN VOID *Msg, + IN UINT MsgLen); + +VOID CMTimerExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID WPARetryExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID EnqueueStartForPSKExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID RTMPHandleSTAKey( + IN PRTMP_ADAPTER pAdapter, + IN MAC_TABLE_ENTRY *pEntry, + IN MLME_QUEUE_ELEM *Elem); + +VOID PairDisAssocAction( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN USHORT Reason); + +VOID MlmeDeAuthAction( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN USHORT Reason, + IN BOOLEAN bDataFrameFirst); + +VOID GREKEYPeriodicExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID AES_128_CMAC( + IN PUCHAR key, + IN PUCHAR input, + IN INT len, + OUT PUCHAR mac); + +#ifdef DOT1X_SUPPORT +VOID WpaSend( + IN PRTMP_ADAPTER pAdapter, + IN PUCHAR pPacket, + IN ULONG Len); + +VOID RTMPAddPMKIDCache( + IN PRTMP_ADAPTER pAd, + IN INT apidx, + IN PUCHAR pAddr, + IN UCHAR *PMKID, + IN UCHAR *PMK); + +INT RTMPSearchPMKIDCache( + IN PRTMP_ADAPTER pAd, + IN INT apidx, + IN PUCHAR pAddr); + +VOID RTMPDeletePMKIDCache( + IN PRTMP_ADAPTER pAd, + IN INT apidx, + IN INT idx); + +VOID RTMPMaintainPMKIDCache( + IN PRTMP_ADAPTER pAd); +#else +#define RTMPMaintainPMKIDCache(_pAd) +#endif // DOT1X_SUPPORT // + +VOID RTMPSendTriggerFrame( + IN PRTMP_ADAPTER pAd, + IN PVOID pBuffer, + IN ULONG Length, + IN UCHAR TxRate, + IN BOOLEAN bQosNull); + +//typedef void (*TIMER_FUNCTION)(unsigned long); + + +/* timeout -- ms */ +VOID RTMP_SetPeriodicTimer( + IN NDIS_MINIPORT_TIMER *pTimer, + IN unsigned long timeout); + +VOID RTMP_OS_Init_Timer( + IN PRTMP_ADAPTER pAd, + IN NDIS_MINIPORT_TIMER *pTimer, + IN TIMER_FUNCTION function, + IN PVOID data); + +VOID RTMP_OS_Add_Timer( + IN NDIS_MINIPORT_TIMER *pTimer, + IN unsigned long timeout); + +VOID RTMP_OS_Mod_Timer( + IN NDIS_MINIPORT_TIMER *pTimer, + IN unsigned long timeout); + + +VOID RTMP_OS_Del_Timer( + IN NDIS_MINIPORT_TIMER *pTimer, + OUT BOOLEAN *pCancelled); + + +VOID RTMPusecDelay( + IN ULONG usec); + +NDIS_STATUS os_alloc_mem( + IN RTMP_ADAPTER *pAd, + OUT UCHAR **mem, + IN ULONG size); + +NDIS_STATUS os_free_mem( + IN PRTMP_ADAPTER pAd, + IN PVOID mem); + + +void RTMP_AllocateSharedMemory( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + +VOID RTMPFreeTxRxRingMemory( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS AdapterBlockAllocateMemory( + IN PVOID handle, + OUT PVOID *ppAd); + +void RTMP_AllocateTxDescMemory( + IN PRTMP_ADAPTER pAd, + IN UINT Index, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + +void RTMP_AllocateFirstTxBuffer( + IN PRTMP_ADAPTER pAd, + IN UINT Index, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + +void RTMP_FreeFirstTxBuffer( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + +void RTMP_AllocateMgmtDescMemory( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + +void RTMP_AllocateRxDescMemory( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + +void RTMP_FreeDescMemory( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + +PNDIS_PACKET RtmpOSNetPktAlloc( + IN RTMP_ADAPTER *pAd, + IN int size); + +PNDIS_PACKET RTMP_AllocateRxPacketBuffer( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + +PNDIS_PACKET RTMP_AllocateTxPacketBuffer( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress); + +PNDIS_PACKET RTMP_AllocateFragPacketBuffer( + IN PRTMP_ADAPTER pAd, + IN ULONG Length); + +void RTMP_QueryPacketInfo( + IN PNDIS_PACKET pPacket, + OUT PACKET_INFO *pPacketInfo, + OUT PUCHAR *pSrcBufVA, + OUT UINT *pSrcBufLen); + +void RTMP_QueryNextPacketInfo( + IN PNDIS_PACKET *ppPacket, + OUT PACKET_INFO *pPacketInfo, + OUT PUCHAR *pSrcBufVA, + OUT UINT *pSrcBufLen); + + +BOOLEAN RTMP_FillTxBlkInfo( + IN RTMP_ADAPTER *pAd, + IN TX_BLK *pTxBlk); + + +PRTMP_SCATTER_GATHER_LIST +rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg); + + + void announce_802_3_packet( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket); + + +UINT BA_Reorder_AMSDU_Annnounce( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket); + + +UINT Handle_AMSDU_Packet( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pData, + IN ULONG DataSize, + IN UCHAR FromWhichBSSID); + + +void convert_802_11_to_802_3_packet( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PUCHAR p8023hdr, + IN PUCHAR pData, + IN ULONG DataSize, + IN UCHAR FromWhichBSSID); + + +PNET_DEV get_netdev_from_bssid( + IN PRTMP_ADAPTER pAd, + IN UCHAR FromWhichBSSID); + + +PNDIS_PACKET duplicate_pkt( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHeader802_3, + IN UINT HdrLen, + IN PUCHAR pData, + IN ULONG DataSize, + IN UCHAR FromWhichBSSID); + + +PNDIS_PACKET duplicate_pkt_with_TKIP_MIC( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pOldPkt); + +PNDIS_PACKET duplicate_pkt_with_VLAN( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHeader802_3, + IN UINT HdrLen, + IN PUCHAR pData, + IN ULONG DataSize, + IN UCHAR FromWhichBSSID, + IN UCHAR *TPID); + + +PNDIS_PACKET ExpandPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN UINT32 ext_head_len, + IN UINT32 ext_tail_len); + +UCHAR VLAN_8023_Header_Copy( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHeader802_3, + IN UINT HdrLen, + OUT PUCHAR pData, + IN UCHAR FromWhichBSSID, + IN UCHAR *TPID); + +#ifdef DOT11_N_SUPPORT +void ba_flush_reordering_timeout_mpdus( + IN PRTMP_ADAPTER pAd, + IN PBA_REC_ENTRY pBAEntry, + IN ULONG Now32); + + +VOID BAOriSessionSetUp( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN UCHAR TID, + IN USHORT TimeOut, + IN ULONG DelayTime, + IN BOOLEAN isForced); + +VOID BASessionTearDownALL( + IN OUT PRTMP_ADAPTER pAd, + IN UCHAR Wcid); +#endif // DOT11_N_SUPPORT // + +BOOLEAN OS_Need_Clone_Packet(void); + + +VOID build_tx_packet( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PUCHAR pFrame, + IN ULONG FrameLen); + + +VOID BAOriSessionTearDown( + IN OUT PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR TID, + IN BOOLEAN bPassive, + IN BOOLEAN bForceSend); + +VOID BARecSessionTearDown( + IN OUT PRTMP_ADAPTER pAd, + IN UCHAR Wcid, + IN UCHAR TID, + IN BOOLEAN bPassive); + +BOOLEAN ba_reordering_resource_init(PRTMP_ADAPTER pAd, int num); +void ba_reordering_resource_release(PRTMP_ADAPTER pAd); + +INT ComputeChecksum( + IN UINT PIN); + +UINT GenerateWpsPinCode( + IN PRTMP_ADAPTER pAd, + IN UCHAR apidx); + + +#ifdef NINTENDO_AP +VOID InitNINTENDO_TABLE( + IN PRTMP_ADAPTER pAd); + +UCHAR CheckNINTENDO_TABLE( + IN PRTMP_ADAPTER pAd, + PCHAR pDS_Ssid, + UCHAR DS_SsidLen, + PUCHAR pDS_Addr); + +UCHAR DelNINTENDO_ENTRY( + IN PRTMP_ADAPTER pAd, + UCHAR * pDS_Addr); + +VOID RTMPIoctlNintendoCapable( + IN PRTMP_ADAPTER pAd, + IN struct iwreq *wrq); + +VOID RTMPIoctlNintendoGetTable( + IN PRTMP_ADAPTER pAd, + IN struct iwreq *wrq); + +VOID RTMPIoctlNintendoSetTable( + IN PRTMP_ADAPTER pAd, + IN struct iwreq *wrq); + +#endif // NINTENDO_AP // + +BOOLEAN rtstrmactohex( + IN PSTRING s1, + IN PSTRING s2); + +BOOLEAN rtstrcasecmp( + IN PSTRING s1, + IN PSTRING s2); + +PSTRING rtstrstruncasecmp( + IN PSTRING s1, + IN PSTRING s2); + +PSTRING rtstrstr( + IN const PSTRING s1, + IN const PSTRING s2); + +PSTRING rstrtok( + IN PSTRING s, + IN const PSTRING ct); + +int rtinet_aton( + const PSTRING cp, + unsigned int *addr); + +////////// common ioctl functions ////////// +INT Set_DriverVersion_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_CountryRegion_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_CountryRegionABand_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_WirelessMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_Channel_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ShortSlot_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_TxPower_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_BGProtection_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_TxPreamble_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_RTSThreshold_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_FragThreshold_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_TxBurst_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifdef AGGREGATION_SUPPORT +INT Set_PktAggregate_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // AGGREGATION_SUPPORT // + +#ifdef INF_AMAZON_PPA +INT Set_INF_AMAZON_SE_PPA_Proc( + IN PRTMP_ADAPTER pAd, + IN PUCHAR arg); + +#endif // INF_AMAZON_PPA // + +INT Set_IEEE80211H_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifdef DBG +INT Set_Debug_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif + +INT Show_DescInfo_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ResetStatCounter_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifdef DOT11_N_SUPPORT +INT Set_BASetup_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_BADecline_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_BAOriTearDown_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_BARecTearDown_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtBw_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtMcs_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtGi_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtOpMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtStbc_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtHtc_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtExtcha_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtMpduDensity_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtBaWinSize_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtRdg_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtLinkAdapt_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtAmsdu_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtAutoBa_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtProtect_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtMimoPs_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifdef DOT11N_DRAFT3 +INT Set_HT_BssCoex_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING pParam); +#endif // DOT11N_DRAFT3 // + + + +INT Set_ForceShortGI_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ForceGF_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT SetCommonHT( + IN PRTMP_ADAPTER pAd); + +INT Set_SendPSMPAction_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtMIMOPSmode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + + +INT Set_HtTxBASize_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_HtDisallowTKIP_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#endif // DOT11_N_SUPPORT // + +#ifdef RT2883_TEMP_PATCH +INT Set_ETxBfEnCond_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg); + +INT Set_NoSndgCntThrd_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg); + +INT Set_NdpSndgStreams_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg); + +INT Set_PerThrdAdj_Proc( + IN PRTMP_ADAPTER pAd, + IN PCHAR arg); + +INT Set_Trigger_Sounding_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PCHAR arg); +#endif // RT2883_TEMP_PATCH // + +#ifdef APCLI_SUPPORT +INT RTMPIoctlConnStatus( + IN PRTMP_ADAPTER pAdapter, + IN PCHAR arg); + +#endif //APCLI_SUPPORT// + + + +#ifdef CONFIG_STA_SUPPORT +//Dls , kathy +VOID RTMPSendDLSTearDownFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA); + +#ifdef DOT11_N_SUPPORT +//Block ACK +VOID QueryBATABLE( + IN PRTMP_ADAPTER pAd, + OUT PQUERYBA_TABLE pBAT); +#endif // DOT11_N_SUPPORT // + +#ifdef WPA_SUPPLICANT_SUPPORT +INT WpaCheckEapCode( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pFrame, + IN USHORT FrameLen, + IN USHORT OffSet); + +VOID WpaSendMicFailureToWpaSupplicant( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bUnicast); + +VOID SendAssocIEsToWpaSupplicant( + IN PRTMP_ADAPTER pAd); +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT +int wext_notify_event_assoc( + IN RTMP_ADAPTER *pAd); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + +#endif // CONFIG_STA_SUPPORT // + + + +#ifdef DOT11_N_SUPPORT +VOID Handle_BSS_Width_Trigger_Events( + IN PRTMP_ADAPTER pAd); + +void build_ext_channel_switch_ie( + IN PRTMP_ADAPTER pAd, + IN HT_EXT_CHANNEL_SWITCH_ANNOUNCEMENT_IE *pIE); +#endif // DOT11_N_SUPPORT // + + +BOOLEAN APRxDoneInterruptHandle( + IN PRTMP_ADAPTER pAd); + +BOOLEAN STARxDoneInterruptHandle( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN argc); + +#ifdef DOT11_N_SUPPORT +// AMPDU packet indication +VOID Indicate_AMPDU_Packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); + +// AMSDU packet indication +VOID Indicate_AMSDU_Packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); +#endif // DOT11_N_SUPPORT // + +#ifdef RT2883_TEMP_PATCH +VOID Trigger_Sounding_Packet( + IN PRTMP_ADAPTER pAd, + IN UCHAR SndgType, + IN UCHAR SndgBW, + IN UCHAR SndgMcs, + IN MAC_TABLE_ENTRY *pEntry); +#endif // RT2883_TEMP_PATCH // + +// Normal legacy Rx packet indication +VOID Indicate_Legacy_Packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); + +VOID Indicate_EAPOL_Packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); + +void update_os_packet_info( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); + +void wlan_802_11_to_802_3_packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN PUCHAR pHeader802_3, + IN UCHAR FromWhichBSSID, + IN UCHAR *TPID); + +UINT deaggregate_AMSDU_announce( + IN PRTMP_ADAPTER pAd, + PNDIS_PACKET pPacket, + IN PUCHAR pData, + IN ULONG DataSize); + + +#ifdef CONFIG_STA_SUPPORT +// remove LLC and get 802_3 Header +#define RTMP_802_11_REMOVE_LLC_AND_CONVERT_TO_802_3(_pRxBlk, _pHeader802_3) \ +{ \ + PUCHAR _pRemovedLLCSNAP = NULL, _pDA, _pSA; \ + \ + if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_WDS) || RX_BLK_TEST_FLAG(_pRxBlk, fRX_MESH)) \ + { \ + _pDA = _pRxBlk->pHeader->Addr3; \ + _pSA = (PUCHAR)_pRxBlk->pHeader + sizeof(HEADER_802_11); \ + } \ + else \ + { \ + if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_INFRA)) \ + { \ + _pDA = _pRxBlk->pHeader->Addr1; \ + if (RX_BLK_TEST_FLAG(_pRxBlk, fRX_DLS)) \ + _pSA = _pRxBlk->pHeader->Addr2; \ + else \ + _pSA = _pRxBlk->pHeader->Addr3; \ + } \ + else \ + { \ + _pDA = _pRxBlk->pHeader->Addr1; \ + _pSA = _pRxBlk->pHeader->Addr2; \ + } \ + } \ + \ + CONVERT_TO_802_3(_pHeader802_3, _pDA, _pSA, _pRxBlk->pData, \ + _pRxBlk->DataSize, _pRemovedLLCSNAP); \ +} +#endif // CONFIG_STA_SUPPORT // + + +BOOLEAN APFowardWirelessStaToWirelessSta( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN ULONG FromWhichBSSID); + +VOID Announce_or_Forward_802_3_Packet( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN UCHAR FromWhichBSSID); + +VOID Sta_Announce_or_Forward_802_3_Packet( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN UCHAR FromWhichBSSID); + + +#ifdef CONFIG_STA_SUPPORT +#define ANNOUNCE_OR_FORWARD_802_3_PACKET(_pAd, _pPacket, _FromWhichBSS)\ + Sta_Announce_or_Forward_802_3_Packet(_pAd, _pPacket, _FromWhichBSS); + //announce_802_3_packet(_pAd, _pPacket); +#endif // CONFIG_STA_SUPPORT // + + +PNDIS_PACKET DuplicatePacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN UCHAR FromWhichBSSID); + + +PNDIS_PACKET ClonePacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PUCHAR pData, + IN ULONG DataSize); + + +// Normal, AMPDU or AMSDU +VOID CmmRxnonRalinkFrameIndicate( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); + +VOID CmmRxRalinkFrameIndicate( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID); + +VOID Update_Rssi_Sample( + IN PRTMP_ADAPTER pAd, + IN RSSI_SAMPLE *pRssi, + IN PRXWI_STRUC pRxWI); + +PNDIS_PACKET GetPacketFromRxRing( + IN PRTMP_ADAPTER pAd, + OUT PRT28XX_RXD_STRUC pSaveRxD, + OUT BOOLEAN *pbReschedule, + IN OUT UINT32 *pRxPending); + +PNDIS_PACKET RTMPDeFragmentDataFrame( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk); + +//////////////////////////////////////// + +#if defined (AP_SCAN_SUPPORT) || defined (CONFIG_STA_SUPPORT) +VOID RTMPIoctlGetSiteSurvey( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq); +#endif + + + + + +#ifdef SNMP_SUPPORT +//for snmp , kathy +typedef struct _DefaultKeyIdxValue +{ + UCHAR KeyIdx; + UCHAR Value[16]; +} DefaultKeyIdxValue, *PDefaultKeyIdxValue; +#endif + + +#ifdef CONFIG_STA_SUPPORT +enum { + DIDmsg_lnxind_wlansniffrm = 0x00000044, + DIDmsg_lnxind_wlansniffrm_hosttime = 0x00010044, + DIDmsg_lnxind_wlansniffrm_mactime = 0x00020044, + DIDmsg_lnxind_wlansniffrm_channel = 0x00030044, + DIDmsg_lnxind_wlansniffrm_rssi = 0x00040044, + DIDmsg_lnxind_wlansniffrm_sq = 0x00050044, + DIDmsg_lnxind_wlansniffrm_signal = 0x00060044, + DIDmsg_lnxind_wlansniffrm_noise = 0x00070044, + DIDmsg_lnxind_wlansniffrm_rate = 0x00080044, + DIDmsg_lnxind_wlansniffrm_istx = 0x00090044, + DIDmsg_lnxind_wlansniffrm_frmlen = 0x000A0044 +}; +enum { + P80211ENUM_msgitem_status_no_value = 0x00 +}; +enum { + P80211ENUM_truth_false = 0x00, + P80211ENUM_truth_true = 0x01 +}; + +/* Definition from madwifi */ +typedef struct { + UINT32 did; + UINT16 status; + UINT16 len; + UINT32 data; +} p80211item_uint32_t; + +typedef struct { + UINT32 msgcode; + UINT32 msglen; +#define WLAN_DEVNAMELEN_MAX 16 + UINT8 devname[WLAN_DEVNAMELEN_MAX]; + p80211item_uint32_t hosttime; + p80211item_uint32_t mactime; + p80211item_uint32_t channel; + p80211item_uint32_t rssi; + p80211item_uint32_t sq; + p80211item_uint32_t signal; + p80211item_uint32_t noise; + p80211item_uint32_t rate; + p80211item_uint32_t istx; + p80211item_uint32_t frmlen; +} wlan_ng_prism2_header; + +/* The radio capture header precedes the 802.11 header. */ +typedef struct GNU_PACKED _ieee80211_radiotap_header { + UINT8 it_version; /* Version 0. Only increases + * for drastic changes, + * introduction of compatible + * new fields does not count. + */ + UINT8 it_pad; + UINT16 it_len; /* length of the whole + * header in bytes, including + * it_version, it_pad, + * it_len, and data fields. + */ + UINT32 it_present; /* A bitmap telling which + * fields are present. Set bit 31 + * (0x80000000) to extend the + * bitmap by another 32 bits. + * Additional extensions are made + * by setting bit 31. + */ +}ieee80211_radiotap_header ; + +enum ieee80211_radiotap_type { + IEEE80211_RADIOTAP_TSFT = 0, + IEEE80211_RADIOTAP_FLAGS = 1, + IEEE80211_RADIOTAP_RATE = 2, + IEEE80211_RADIOTAP_CHANNEL = 3, + IEEE80211_RADIOTAP_FHSS = 4, + IEEE80211_RADIOTAP_DBM_ANTSIGNAL = 5, + IEEE80211_RADIOTAP_DBM_ANTNOISE = 6, + IEEE80211_RADIOTAP_LOCK_QUALITY = 7, + IEEE80211_RADIOTAP_TX_ATTENUATION = 8, + IEEE80211_RADIOTAP_DB_TX_ATTENUATION = 9, + IEEE80211_RADIOTAP_DBM_TX_POWER = 10, + IEEE80211_RADIOTAP_ANTENNA = 11, + IEEE80211_RADIOTAP_DB_ANTSIGNAL = 12, + IEEE80211_RADIOTAP_DB_ANTNOISE = 13 +}; + +#define WLAN_RADIOTAP_PRESENT ( \ + (1 << IEEE80211_RADIOTAP_TSFT) | \ + (1 << IEEE80211_RADIOTAP_FLAGS) | \ + (1 << IEEE80211_RADIOTAP_RATE) | \ + 0) + +typedef struct _wlan_radiotap_header { + ieee80211_radiotap_header wt_ihdr; + INT64 wt_tsft; + UINT8 wt_flags; + UINT8 wt_rate; +} wlan_radiotap_header; +/* Definition from madwifi */ + + +void send_monitor_packets( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN CHAR (*RTMPMaxRssi)( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi0, + IN CHAR Rssi1, + IN CHAR Rssi2), + IN CHAR (*ConvertToRssi)( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi, + IN UCHAR RssiNumber)); + + +VOID RTMPSetDesiredRates( + IN PRTMP_ADAPTER pAdapter, + IN LONG Rates); + +#ifdef XLINK_SUPPORT +INT Set_XlinkMode_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); +#endif // XLINK_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +INT Set_FixedTxMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifdef CONFIG_APSTA_MIXED_SUPPORT +INT Set_OpMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // CONFIG_APSTA_MIXED_SUPPORT // + +INT Set_LongRetryLimit_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_ShortRetryLimit_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_AutoFallBack_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + + +BOOLEAN RT28XXChipsetCheck( + IN void *_dev_p); + + +VOID RT28XXDMADisable( + IN RTMP_ADAPTER *pAd); + +VOID RT28XXDMAEnable( + IN RTMP_ADAPTER *pAd); + +VOID RT28xx_UpdateBeaconToAsic( + IN RTMP_ADAPTER * pAd, + IN INT apidx, + IN ULONG BeaconLen, + IN ULONG UpdatePos); + +void CfgInitHook(PRTMP_ADAPTER pAd); + +int rt28xx_init( + IN PRTMP_ADAPTER pAd, + IN PSTRING pDefaultMac, + IN PSTRING pHostName); + +BOOLEAN RT28XXSecurityKeyAdd( + IN PRTMP_ADAPTER pAd, + IN ULONG apidx, + IN ULONG KeyIdx, + IN MAC_TABLE_ENTRY *pEntry); + +NDIS_STATUS RtmpNetTaskInit( + IN RTMP_ADAPTER *pAd); + +VOID RtmpNetTaskExit( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS RtmpMgmtTaskInit( + IN RTMP_ADAPTER *pAd); + +VOID RtmpMgmtTaskExit( + IN RTMP_ADAPTER *pAd); + +void tbtt_tasklet(unsigned long data); + + +PNET_DEV RtmpPhyNetDevInit( + IN RTMP_ADAPTER *pAd, + IN RTMP_OS_NETDEV_OP_HOOK *pNetHook); + +BOOLEAN RtmpPhyNetDevExit( + IN RTMP_ADAPTER *pAd, + IN PNET_DEV net_dev); + +INT RtmpRaDevCtrlInit( + IN RTMP_ADAPTER *pAd, + IN RTMP_INF_TYPE infType); + +BOOLEAN RtmpRaDevCtrlExit( + IN RTMP_ADAPTER *pAd); + + +#ifdef RTMP_MAC_PCI +// +// Function Prototype in cmm_data_pci.c +// +USHORT RtmpPCI_WriteTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN BOOLEAN bIsLast, + OUT USHORT *FreeNumber); + +USHORT RtmpPCI_WriteSingleTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN BOOLEAN bIsLast, + OUT USHORT *FreeNumber); + +USHORT RtmpPCI_WriteMultiTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN UCHAR frameNum, + OUT USHORT *FreeNumber); + +USHORT RtmpPCI_WriteFragTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN UCHAR fragNum, + OUT USHORT *FreeNumber); + +USHORT RtmpPCI_WriteSubTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN BOOLEAN bIsLast, + OUT USHORT *FreeNumber); + +VOID RtmpPCI_FinalWriteTxResource( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN USHORT totalMPDUSize, + IN USHORT FirstTxIdx); + +VOID RtmpPCIDataLastTxIdx( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN USHORT LastTxIdx); + +VOID RtmpPCIDataKickOut( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN UCHAR QueIdx); + + +int RtmpPCIMgmtKickOut( + IN RTMP_ADAPTER *pAd, + IN UCHAR QueIdx, + IN PNDIS_PACKET pPacket, + IN PUCHAR pSrcBufVA, + IN UINT SrcBufLen); + + +NDIS_STATUS RTMPCheckRxError( + IN PRTMP_ADAPTER pAd, + IN PHEADER_802_11 pHeader, + IN PRXWI_STRUC pRxWI, + IN PRT28XX_RXD_STRUC pRxD); + +BOOLEAN RT28xxPciAsicRadioOff( + IN PRTMP_ADAPTER pAd, + IN UCHAR Level, + IN USHORT TbttNumToNextWakeUp); + +BOOLEAN RT28xxPciAsicRadioOn( + IN PRTMP_ADAPTER pAd, + IN UCHAR Level); + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT +VOID RTMPInitPCIeLinkCtrlValue( + IN PRTMP_ADAPTER pAd); + +VOID RTMPFindHostPCIDev( + IN PRTMP_ADAPTER pAd); + +VOID RTMPPCIeLinkCtrlValueRestore( + IN PRTMP_ADAPTER pAd, + IN UCHAR Level); + +VOID RTMPPCIeLinkCtrlSetting( + IN PRTMP_ADAPTER pAd, + IN USHORT Max); + +VOID RTMPrt3xSetPCIePowerLinkCtrl( + IN PRTMP_ADAPTER pAd); + +VOID PsPollWakeExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); + +VOID RadioOnExec( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); +#endif // PCIE_PS_SUPPORT // + +VOID RT28xxPciStaAsicForceWakeup( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bFromTx); + +VOID RT28xxPciStaAsicSleepThenAutoWakeup( + IN PRTMP_ADAPTER pAd, + IN USHORT TbttNumToNextWakeUp); + +#endif // CONFIG_STA_SUPPORT // + +VOID RT28xxPciMlmeRadioOn( + IN PRTMP_ADAPTER pAd); + +VOID RT28xxPciMlmeRadioOFF( + IN PRTMP_ADAPTER pAd); +#endif // RTMP_MAC_PCI // + +VOID AsicTurnOffRFClk( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel); + +VOID AsicTurnOnRFClk( + IN PRTMP_ADAPTER pAd, + IN UCHAR Channel); + + + +#ifdef RTMP_TIMER_TASK_SUPPORT +INT RtmpTimerQThread( + IN ULONG Context); + +RTMP_TIMER_TASK_ENTRY *RtmpTimerQInsert( + IN RTMP_ADAPTER *pAd, + IN RALINK_TIMER_STRUCT *pTimer); + +BOOLEAN RtmpTimerQRemove( + IN RTMP_ADAPTER *pAd, + IN RALINK_TIMER_STRUCT *pTimer); + +void RtmpTimerQExit( + IN RTMP_ADAPTER *pAd); + +void RtmpTimerQInit( + IN RTMP_ADAPTER *pAd); +#endif // RTMP_TIMER_TASK_SUPPORT // + + + +//////////////////////////////////////// + +#ifdef AP_QLOAD_SUPPORT +VOID QBSS_LoadInit( + IN RTMP_ADAPTER *pAd); + +VOID QBSS_LoadAlarmReset( + IN RTMP_ADAPTER *pAd); + +VOID QBSS_LoadAlarmResume( + IN RTMP_ADAPTER *pAd); + +UINT32 QBSS_LoadBusyTimeGet( + IN RTMP_ADAPTER *pAd); + +BOOLEAN QBSS_LoadIsAlarmIssued( + IN RTMP_ADAPTER *pAd); + +BOOLEAN QBSS_LoadIsBusyTimeAccepted( + IN RTMP_ADAPTER *pAd, + IN UINT32 BusyTime); + +UINT32 QBSS_LoadElementAppend( + IN RTMP_ADAPTER *pAd, + OUT UINT8 *buf_p); + +UINT32 QBSS_LoadElementParse( + IN RTMP_ADAPTER *pAd, + IN UINT8 *pElement, + OUT UINT16 *pStationCount, + OUT UINT8 *pChanUtil, + OUT UINT16 *pAvalAdmCap); + +VOID QBSS_LoadUpdate( + IN RTMP_ADAPTER *pAd, + IN ULONG UpTime); + +VOID QBSS_LoadStatusClear( + IN RTMP_ADAPTER *pAd); + +INT Show_QoSLoad_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // AP_QLOAD_SUPPORT // + +/////////////////////////////////////// +INT RTMPShowCfgValue( + IN PRTMP_ADAPTER pAd, + IN PSTRING pName, + IN PSTRING pBuf); + +PSTRING RTMPGetRalinkAuthModeStr( + IN NDIS_802_11_AUTHENTICATION_MODE authMode); + +PSTRING RTMPGetRalinkEncryModeStr( + IN USHORT encryMode); +////////////////////////////////////// + +#ifdef CONFIG_STA_SUPPORT +VOID AsicStaBbpTuning( + IN PRTMP_ADAPTER pAd); + +BOOLEAN StaAddMacTableEntry( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN UCHAR MaxSupportedRateIn500Kbps, + IN HT_CAPABILITY_IE *pHtCapability, + IN UCHAR HtCapabilityLen, + IN ADD_HT_INFO_IE *pAddHtInfo, + IN UCHAR AddHtInfoLen, + IN USHORT CapabilityInfo); + + +BOOLEAN AUTH_ReqSend( + IN PRTMP_ADAPTER pAd, + IN PMLME_QUEUE_ELEM pElem, + IN PRALINK_TIMER_STRUCT pAuthTimer, + IN PSTRING pSMName, + IN USHORT SeqNo, + IN PUCHAR pNewElement, + IN ULONG ElementLen); +#endif // CONFIG_STA_SUPPORT // + +void RTMP_IndicateMediaState( + IN PRTMP_ADAPTER pAd); + +VOID ReSyncBeaconTime( + IN PRTMP_ADAPTER pAd); + +VOID RTMPSetAGCInitValue( + IN PRTMP_ADAPTER pAd, + IN UCHAR BandWidth); + +int rt28xx_close(IN PNET_DEV dev); +int rt28xx_open(IN PNET_DEV dev); + + +#define VIRTUAL_IF_INC(__pAd) ((__pAd)->VirtualIfCnt++) +#define VIRTUAL_IF_DEC(__pAd) ((__pAd)->VirtualIfCnt--) +#define VIRTUAL_IF_NUM(__pAd) ((__pAd)->VirtualIfCnt) + + + +#ifdef LINUX +__inline INT VIRTUAL_IF_UP(PRTMP_ADAPTER pAd) +{ + if (VIRTUAL_IF_NUM(pAd) == 0) + { + if (rt28xx_open(pAd->net_dev) != 0) + { + DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_open return fail!\n")); + return -1; + } + } + else + { + } + VIRTUAL_IF_INC(pAd); + return 0; +} + +__inline VOID VIRTUAL_IF_DOWN(PRTMP_ADAPTER pAd) +{ + VIRTUAL_IF_DEC(pAd); + if (VIRTUAL_IF_NUM(pAd) == 0) + rt28xx_close(pAd->net_dev); + return; +} +#endif // LINUX // + + + + +#ifdef SOFT_ENCRYPT +BOOLEAN RTMPExpandPacketForSwEncrypt( + IN PRTMP_ADAPTER pAd, + IN PTX_BLK pTxBlk); + +VOID RTMPUpdateSwCacheCipherInfo( + IN PRTMP_ADAPTER pAd, + IN PTX_BLK pTxBlk, + IN PUCHAR pHdr); +#endif // SOFT_ENCRYPT // + + +/* + OS Related funciton prototype definitions. + TODO: Maybe we need to move these function prototypes to other proper place. +*/ +int RtmpOSWrielessEventSend( + IN RTMP_ADAPTER *pAd, + IN UINT32 eventType, + IN INT flags, + IN PUCHAR pSrcMac, + IN PUCHAR pData, + IN UINT32 dataLen); + +int RtmpOSNetDevAddrSet( + IN PNET_DEV pNetDev, + IN PUCHAR pMacAddr); + +int RtmpOSNetDevAttach( + IN PNET_DEV pNetDev, + IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook); + +void RtmpOSNetDevClose( + IN PNET_DEV pNetDev); + +void RtmpOSNetDevDetach( + IN PNET_DEV pNetDev); + +INT RtmpOSNetDevAlloc( + IN PNET_DEV *pNewNetDev, + IN UINT32 privDataSize); + +void RtmpOSNetDevFree( + IN PNET_DEV pNetDev); + +PNET_DEV RtmpOSNetDevGetByName( + IN PNET_DEV pNetDev, + IN PSTRING pDevName); + +void RtmpOSNetDeviceRefPut( + IN PNET_DEV pNetDev); + +PNET_DEV RtmpOSNetDevCreate( + IN RTMP_ADAPTER *pAd, + IN INT devType, + IN INT devNum, + IN INT privMemSize, + IN PSTRING pNamePrefix); + +/* + Task operation related function prototypes +*/ +void RtmpOSTaskCustomize( + IN RTMP_OS_TASK *pTask); + +INT RtmpOSTaskNotifyToExit( + IN RTMP_OS_TASK *pTask); + +NDIS_STATUS RtmpOSTaskKill( + IN RTMP_OS_TASK *pTask); + +NDIS_STATUS RtmpOSTaskInit( + IN RTMP_OS_TASK *pTask, + PSTRING pTaskName, + VOID *pPriv); + +NDIS_STATUS RtmpOSTaskAttach( + IN RTMP_OS_TASK *pTask, + IN RTMP_OS_TASK_CALLBACK taskEntryPoint, + IN ULONG arg); + + +/* + File operation related function prototypes +*/ +RTMP_OS_FD RtmpOSFileOpen( + IN char *pPath, + IN int flag, + IN int mode); + +int RtmpOSFileClose( + IN RTMP_OS_FD osfd); + +void RtmpOSFileSeek( + IN RTMP_OS_FD osfd, + IN int offset); + +int RtmpOSFileRead( + IN RTMP_OS_FD osfd, + IN char *pDataPtr, + IN int readLen); + +int RtmpOSFileWrite( + IN RTMP_OS_FD osfd, + IN char *pDataPtr, + IN int writeLen); + +void RtmpOSFSInfoChange( + IN RTMP_OS_FS_INFO *pOSFSInfo, + IN BOOLEAN bSet); + +#ifdef RT35xx +NTSTATUS RT3572WriteBBPR66( + IN PRTMP_ADAPTER pAd, + IN UCHAR Value); +#endif // RT35xx // + +VOID RTInitializeCmdQ( + IN PCmdQ cmdq); + +INT RTPCICmdThread( + IN ULONG Context); + +VOID CMDHandler( + IN PRTMP_ADAPTER pAd); + +VOID RTThreadDequeueCmd( + IN PCmdQ cmdq, + OUT PCmdQElmt *pcmdqelmt); + +NDIS_STATUS RTEnqueueInternalCmd( + IN PRTMP_ADAPTER pAd, + IN NDIS_OID Oid, + IN PVOID pInformationBuffer, + IN UINT32 InformationBufferLength); + +#ifdef HOSTAPD_SUPPORT +VOID ieee80211_notify_michael_failure( + IN PRTMP_ADAPTER pAd, + IN PHEADER_802_11 pHeader, + IN UINT keyix, + IN INT report); + +const CHAR* ether_sprintf(const UINT8 *mac); +#endif//HOSTAPD_SUPPORT// + +#ifdef VENDOR_FEATURE3_SUPPORT +VOID RTMP_IO_WRITE32( + PRTMP_ADAPTER pAd, + UINT32 Offset, + UINT32 Value); + +VOID RTMP_BBP_IO_READ8_BY_REG_ID( + PRTMP_ADAPTER pAd, + UINT32 Offset, + UINT8 *pValue); + +VOID RTMP_BBP_IO_READ8( + PRTMP_ADAPTER pAd, + UCHAR Offset, + UINT8 *pValue, + BOOLEAN FlgValidMCR); + +VOID RTMP_BBP_IO_WRITE8_BY_REG_ID( + PRTMP_ADAPTER pAd, + UINT32 Offset, + UINT8 Value); + +VOID RTMP_BBP_IO_WRITE8( + PRTMP_ADAPTER pAd, + UCHAR Offset, + UINT8 Value, + BOOLEAN FlgValidMCR); +#endif // VENDOR_FEATURE3_SUPPORT // + +BOOLEAN CHAN_PropertyCheck( + IN PRTMP_ADAPTER pAd, + IN UINT32 ChanNum, + IN UCHAR Property); + +#ifdef CONFIG_STA_SUPPORT + +// command +INT Set_SSID_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +#ifdef WMM_SUPPORT +INT Set_WmmCapable_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif + +INT Set_NetworkType_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_AuthMode_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_EncrypType_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_DefaultKeyID_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_Key1_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_Key2_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_Key3_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_Key4_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_WPAPSK_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + + +INT Set_PSMode_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +#ifdef WPA_SUPPLICANT_SUPPORT +INT Set_Wpa_Support( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef DBG + +VOID RTMPIoctlMAC( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq); + +VOID RTMPIoctlE2PROM( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq); +#endif // DBG // + + +NDIS_STATUS RTMPWPANoneAddKeyProc( + IN PRTMP_ADAPTER pAd, + IN PVOID pBuf); + +INT Set_FragTest_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +#ifdef DOT11_N_SUPPORT +INT Set_TGnWifiTest_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // DOT11_N_SUPPORT // + +INT Set_LongRetryLimit_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +INT Set_ShortRetryLimit_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); + +#ifdef EXT_BUILD_CHANNEL_LIST +INT Set_Ieee80211dClientMode_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg); +#endif // EXT_BUILD_CHANNEL_LIST // + +#ifdef CARRIER_DETECTION_SUPPORT +INT Set_CarrierDetect_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); +#endif // CARRIER_DETECTION_SUPPORT // + +INT Show_Adhoc_MacTable_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING extra); + +#ifdef RTMP_RF_RW_SUPPORT +VOID RTMPIoctlRF( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq); +#endif // RTMP_RF_RW_SUPPORT // + + +INT Set_BeaconLostTime_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_AutoRoaming_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_SiteSurvey_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_ForceTxBurst_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + + +VOID RTMPAddKey( + IN PRTMP_ADAPTER pAd, + IN PNDIS_802_11_KEY pKey); + + +VOID StaSiteSurvey( + IN PRTMP_ADAPTER pAd, + IN PNDIS_802_11_SSID pSsid, + IN UCHAR ScanType); +#endif // CONFIG_STA_SUPPORT // + +void getRate( + IN HTTRANSMIT_SETTING HTSetting, + OUT ULONG* fLastTxRxRate); + +#endif // __RTMP_H__ + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_chip.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_chip.h new file mode 100644 index 000000000..c5fb837cf --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_chip.h @@ -0,0 +1,356 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_chip.h + + Abstract: + Ralink Wireless Chip related definition & structures + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#ifndef __RTMP_CHIP_H__ +#define __RTMP_CHIP_H__ + +#include "rtmp_type.h" + + +#ifdef RT2860 +#include "chip/rt2860.h" +#endif // RT2860 // + + + + + + +#ifdef RT35xx +#include "chip/rt35xx.h" +#endif // RT35xx // + + + +#define IS_RT3090A(_pAd) ((((_pAd)->MACVersion & 0xffff0000) == 0x30900000)) + +// We will have a cost down version which mac version is 0x3090xxxx +#define IS_RT3090(_pAd) ((((_pAd)->MACVersion & 0xffff0000) == 0x30710000) || (IS_RT3090A(_pAd))) + +#define IS_RT3070(_pAd) (((_pAd)->MACVersion & 0xffff0000) == 0x30700000) +#define IS_RT3071(_pAd) (((_pAd)->MACVersion & 0xffff0000) == 0x30710000) +#define IS_RT2070(_pAd) (((_pAd)->RfIcType == RFIC_2020) || ((_pAd)->EFuseTag == 0x27)) + +#define IS_RT30xx(_pAd) (((_pAd)->MACVersion & 0xfff00000) == 0x30700000||IS_RT3090A(_pAd)) +//#define IS_RT305X(_pAd) ((_pAd)->MACVersion == 0x28720200) + +/* RT3572, 3592, 3562, 3062 share the same MAC version */ +#define IS_RT3572(_pAd) (((_pAd)->MACVersion & 0xffff0000) == 0x35720000) + +#define IS_RT2883(_pAd) (((_pAd)->MACVersion & 0xffff0000) == 0x28830000) +#define IS_VERSION_BEFORE_F(_pAd) (((_pAd)->MACVersion&0xffff) <= 0x0211) +// F version is 0x0212, E version is 0x0211. 309x can save more power after F version. +#define IS_VERSION_AFTER_F(_pAd) ((((_pAd)->MACVersion&0xffff) >= 0x0212) || (((_pAd)->b3090ESpecialChip == TRUE))) + +//RT3390,RT3370 +#define IS_RT3390(_pAd) (((_pAd)->MACVersion & 0xFFFF0000) == 0x33900000) + +// ------------------------------------------------------ +// PCI registers - base address 0x0000 +// ------------------------------------------------------ +#define CHIP_PCI_CFG 0x0000 +#define CHIP_PCI_EECTRL 0x0004 +#define CHIP_PCI_MCUCTRL 0x0008 + +#define OPT_14 0x114 + +#define RETRY_LIMIT 10 + + + +// ------------------------------------------------------ +// BBP & RF definition +// ------------------------------------------------------ +#define BUSY 1 +#define IDLE 0 + + +//------------------------------------------------------------------------- +// EEPROM definition +//------------------------------------------------------------------------- +#define EEDO 0x08 +#define EEDI 0x04 +#define EECS 0x02 +#define EESK 0x01 +#define EERL 0x80 + +#define EEPROM_WRITE_OPCODE 0x05 +#define EEPROM_READ_OPCODE 0x06 +#define EEPROM_EWDS_OPCODE 0x10 +#define EEPROM_EWEN_OPCODE 0x13 + +#define NUM_EEPROM_BBP_PARMS 19 // Include NIC Config 0, 1, CR, TX ALC step, BBPs +#define NUM_EEPROM_TX_G_PARMS 7 + +#define VALID_EEPROM_VERSION 1 +#define EEPROM_VERSION_OFFSET 0x02 +#define EEPROM_NIC1_OFFSET 0x34 // The address is from NIC config 0, not BBP register ID +#define EEPROM_NIC2_OFFSET 0x36 // The address is from NIC config 1, not BBP register ID +#define EEPROM_TXPOWER_DELTA 0x50 // 20MHZ AND 40 MHZ use different power. This is delta in 40MHZ. +#define EEPROM_COUNTRY_REGION 0x38 +#define EEPROM_BBP_BASE_OFFSET 0xf0 // The address is from NIC config 0, not BBP register ID +#define EEPROM_FREQ_OFFSET 0x3a +#define EEPROM_LED1_OFFSET 0x3c +#define EEPROM_LED2_OFFSET 0x3e +#define EEPROM_LED3_OFFSET 0x40 +#define EEPROM_LNA_OFFSET 0x44 +#define EEPROM_RSSI_BG_OFFSET 0x46 +#define EEPROM_TXMIXER_GAIN_2_4G 0x48 +#define EEPROM_RSSI_A_OFFSET 0x4a +#define EEPROM_TXMIXER_GAIN_5G 0x4c +#define EEPROM_DEFINE_MAX_TXPWR 0x4e +#define EEPROM_G_TX_PWR_OFFSET 0x52 +#define EEPROM_G_TX2_PWR_OFFSET 0x60 +#define EEPROM_G_TSSI_BOUND1 0x6e +#define EEPROM_G_TSSI_BOUND2 0x70 +#define EEPROM_G_TSSI_BOUND3 0x72 +#define EEPROM_G_TSSI_BOUND4 0x74 +#define EEPROM_G_TSSI_BOUND5 0x76 +#define EEPROM_A_TX_PWR_OFFSET 0x78 +#define EEPROM_A_TX2_PWR_OFFSET 0xa6 +#define EEPROM_A_TSSI_BOUND1 0xd4 +#define EEPROM_A_TSSI_BOUND2 0xd6 +#define EEPROM_A_TSSI_BOUND3 0xd8 +#define EEPROM_A_TSSI_BOUND4 0xda +#define EEPROM_A_TSSI_BOUND5 0xdc +#define EEPROM_TXPOWER_BYRATE_20MHZ_2_4G 0xde // 20MHZ 2.4G tx power. +#define EEPROM_TXPOWER_BYRATE_40MHZ_2_4G 0xee // 40MHZ 2.4G tx power. +#define EEPROM_TXPOWER_BYRATE_20MHZ_5G 0xfa // 20MHZ 5G tx power. +#define EEPROM_TXPOWER_BYRATE_40MHZ_5G 0x10a // 40MHZ 5G tx power. +#define EEPROM_TXPOWER_BYRATE 0xde // 20MHZ power. +//#define EEPROM_Japan_TX_PWR_OFFSET 0x90 // 802.11j +//#define EEPROM_Japan_TX2_PWR_OFFSET 0xbe +//#define EEPROM_TSSI_REF_OFFSET 0x54 +//#define EEPROM_TSSI_DELTA_OFFSET 0x24 +//#define EEPROM_CCK_TX_PWR_OFFSET 0x62 +//#define EEPROM_CALIBRATE_OFFSET 0x7c + + + +/* + * EEPROM operation related marcos + */ +#define RT28xx_EEPROM_READ16(_pAd, _offset, _value) \ + (_pAd)->chipOps.eeread((RTMP_ADAPTER *)(_pAd), (USHORT)(_offset), (PUSHORT)&(_value)) + +#define RT28xx_EEPROM_WRITE16(_pAd, _offset, _value) \ + (_pAd)->chipOps.eewrite((RTMP_ADAPTER *)(_pAd), (USHORT)(_offset), (USHORT)(_value)) + + + +// ------------------------------------------------------------------- +// E2PROM data layout +// ------------------------------------------------------------------- + +// +// MCU_LEDCS: MCU LED Control Setting. +// +typedef union _MCU_LEDCS_STRUC { + struct { +#ifdef RT_BIG_ENDIAN + UCHAR Polarity:1; + UCHAR LedMode:7; +#else + UCHAR LedMode:7; + UCHAR Polarity:1; +#endif // RT_BIG_ENDIAN // + } field; + UCHAR word; +} MCU_LEDCS_STRUC, *PMCU_LEDCS_STRUC; + + +// +// EEPROM antenna select format +// +#ifdef RT_BIG_ENDIAN +typedef union _EEPROM_ANTENNA_STRUC { + struct { + USHORT Rsv:4; + USHORT RfIcType:4; // see E2PROM document + USHORT TxPath:4; // 1: 1T, 2: 2T + USHORT RxPath:4; // 1: 1R, 2: 2R, 3: 3R + } field; + USHORT word; +} EEPROM_ANTENNA_STRUC, *PEEPROM_ANTENNA_STRUC; +#else +typedef union _EEPROM_ANTENNA_STRUC { + struct { + USHORT RxPath:4; // 1: 1R, 2: 2R, 3: 3R + USHORT TxPath:4; // 1: 1T, 2: 2T + USHORT RfIcType:4; // see E2PROM document + USHORT Rsv:4; + } field; + USHORT word; +} EEPROM_ANTENNA_STRUC, *PEEPROM_ANTENNA_STRUC; +#endif + +#ifdef RT_BIG_ENDIAN +typedef union _EEPROM_NIC_CINFIG2_STRUC { + struct { + USHORT DACTestBit:1; // control if driver should patch the DAC issue + USHORT Rsv2:3; // must be 0 + USHORT AntDiversity:1; // Antenna diversity + USHORT Rsv1:1; // must be 0 + USHORT BW40MAvailForA:1; // 0:enable, 1:disable + USHORT BW40MAvailForG:1; // 0:enable, 1:disable + USHORT EnableWPSPBC:1; // WPS PBC Control bit + USHORT BW40MSidebandForA:1; + USHORT BW40MSidebandForG:1; + USHORT CardbusAcceleration:1; // !!! NOTE: 0 - enable, 1 - disable + USHORT ExternalLNAForA:1; // external LNA enable for 5G + USHORT ExternalLNAForG:1; // external LNA enable for 2.4G + USHORT DynamicTxAgcControl:1; // + USHORT HardwareRadioControl:1; // Whether RF is controlled by driver or HW. 1:enable hw control, 0:disable + } field; + USHORT word; +} EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC; +#else +typedef union _EEPROM_NIC_CINFIG2_STRUC { + struct { + USHORT HardwareRadioControl:1; // 1:enable, 0:disable + USHORT DynamicTxAgcControl:1; // + USHORT ExternalLNAForG:1; // + USHORT ExternalLNAForA:1; // external LNA enable for 2.4G + USHORT CardbusAcceleration:1; // !!! NOTE: 0 - enable, 1 - disable + USHORT BW40MSidebandForG:1; + USHORT BW40MSidebandForA:1; + USHORT EnableWPSPBC:1; // WPS PBC Control bit + USHORT BW40MAvailForG:1; // 0:enable, 1:disable + USHORT BW40MAvailForA:1; // 0:enable, 1:disable + USHORT Rsv1:1; // must be 0 + USHORT AntDiversity:1; // Antenna diversity + USHORT Rsv2:3; // must be 0 + USHORT DACTestBit:1; // control if driver should patch the DAC issue + } field; + USHORT word; +} EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC; +#endif + +// +// TX_PWR Value valid range 0xFA(-6) ~ 0x24(36) +// +#ifdef RT_BIG_ENDIAN +typedef union _EEPROM_TX_PWR_STRUC { + struct { + signed char Byte1; // High Byte + signed char Byte0; // Low Byte + } field; + USHORT word; +} EEPROM_TX_PWR_STRUC, *PEEPROM_TX_PWR_STRUC; +#else +typedef union _EEPROM_TX_PWR_STRUC { + struct { + signed char Byte0; // Low Byte + signed char Byte1; // High Byte + } field; + USHORT word; +} EEPROM_TX_PWR_STRUC, *PEEPROM_TX_PWR_STRUC; +#endif + +#ifdef RT_BIG_ENDIAN +typedef union _EEPROM_VERSION_STRUC { + struct { + UCHAR Version; // High Byte + UCHAR FaeReleaseNumber; // Low Byte + } field; + USHORT word; +} EEPROM_VERSION_STRUC, *PEEPROM_VERSION_STRUC; +#else +typedef union _EEPROM_VERSION_STRUC { + struct { + UCHAR FaeReleaseNumber; // Low Byte + UCHAR Version; // High Byte + } field; + USHORT word; +} EEPROM_VERSION_STRUC, *PEEPROM_VERSION_STRUC; +#endif + +#ifdef RT_BIG_ENDIAN +typedef union _EEPROM_LED_STRUC { + struct { + USHORT Rsvd:3; // Reserved + USHORT LedMode:5; // Led mode. + USHORT PolarityGPIO_4:1; // Polarity GPIO#4 setting. + USHORT PolarityGPIO_3:1; // Polarity GPIO#3 setting. + USHORT PolarityGPIO_2:1; // Polarity GPIO#2 setting. + USHORT PolarityGPIO_1:1; // Polarity GPIO#1 setting. + USHORT PolarityGPIO_0:1; // Polarity GPIO#0 setting. + USHORT PolarityACT:1; // Polarity ACT setting. + USHORT PolarityRDY_A:1; // Polarity RDY_A setting. + USHORT PolarityRDY_G:1; // Polarity RDY_G setting. + } field; + USHORT word; +} EEPROM_LED_STRUC, *PEEPROM_LED_STRUC; +#else +typedef union _EEPROM_LED_STRUC { + struct { + USHORT PolarityRDY_G:1; // Polarity RDY_G setting. + USHORT PolarityRDY_A:1; // Polarity RDY_A setting. + USHORT PolarityACT:1; // Polarity ACT setting. + USHORT PolarityGPIO_0:1; // Polarity GPIO#0 setting. + USHORT PolarityGPIO_1:1; // Polarity GPIO#1 setting. + USHORT PolarityGPIO_2:1; // Polarity GPIO#2 setting. + USHORT PolarityGPIO_3:1; // Polarity GPIO#3 setting. + USHORT PolarityGPIO_4:1; // Polarity GPIO#4 setting. + USHORT LedMode:5; // Led mode. + USHORT Rsvd:3; // Reserved + } field; + USHORT word; +} EEPROM_LED_STRUC, *PEEPROM_LED_STRUC; +#endif + +#ifdef RT_BIG_ENDIAN +typedef union _EEPROM_TXPOWER_DELTA_STRUC { + struct { + UCHAR TxPowerEnable:1;// Enable + UCHAR Type:1; // 1: plus the delta value, 0: minus the delta value + UCHAR DeltaValue:6; // Tx Power dalta value (MAX=4) + } field; + UCHAR value; +} EEPROM_TXPOWER_DELTA_STRUC, *PEEPROM_TXPOWER_DELTA_STRUC; +#else +typedef union _EEPROM_TXPOWER_DELTA_STRUC { + struct { + UCHAR DeltaValue:6; // Tx Power dalta value (MAX=4) + UCHAR Type:1; // 1: plus the delta value, 0: minus the delta value + UCHAR TxPowerEnable:1;// Enable + } field; + UCHAR value; +} EEPROM_TXPOWER_DELTA_STRUC, *PEEPROM_TXPOWER_DELTA_STRUC; +#endif + +#endif // __RTMP_CHIP_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_cmd.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_cmd.h new file mode 100644 index 000000000..eb3816281 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_cmd.h @@ -0,0 +1,98 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + +#ifndef __RTMP_CMD_H__ +#define __RTMP_CMD_H__ + +#include "rtmp_type.h" + + +typedef struct _CmdQElmt { + UINT command; + PVOID buffer; + ULONG bufferlength; + BOOLEAN CmdFromNdis; + BOOLEAN SetOperation; + struct _CmdQElmt *next; +} CmdQElmt, *PCmdQElmt; + +typedef struct _CmdQ { + UINT size; + CmdQElmt *head; + CmdQElmt *tail; + UINT32 CmdQState; +} CmdQ, *PCmdQ; + + +#define EnqueueCmd(cmdq, cmdqelmt) \ +{ \ + if (cmdq->size == 0) \ + cmdq->head = cmdqelmt; \ + else \ + cmdq->tail->next = cmdqelmt; \ + cmdq->tail = cmdqelmt; \ + cmdqelmt->next = NULL; \ + cmdq->size++; \ +} + +#define NDIS_OID UINT + +#ifdef KTHREAD_SUPPORT +#define RTCMDUp(pAd) \ + do{ \ + RTMP_OS_TASK *_pTask = &((pAd)->cmdQTask); \ + { \ + _pTask->kthread_running = TRUE; \ + wake_up(&_pTask->kthread_q); \ + } \ + }while(0) +#else +#define RTCMDUp(pAd) \ + do{ \ + RTMP_OS_TASK *_pTask = &((pAd)->cmdQTask); \ + CHECK_PID_LEGALITY(_pTask->taskPID) \ + {\ + RTMP_SEM_EVENT_UP(&(_pTask->taskSema)); \ + }\ + }while(0) +#endif + +#ifdef CONFIG_STA_SUPPORT +char * rtstrchr(const char * s, int c); + +int rt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info, + void *w, char *extra); + +#if defined(SIOCGIWSCAN) || defined(RT_CFG80211_SUPPORT) +int rt_ioctl_siwscan(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *extra); +#endif // SIOCGIWSCAN || RT_CFG80211_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +void getRate(HTTRANSMIT_SETTING HTSetting, ULONG* fLastTxRxRate); + +#endif // __RTMP_CMD_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_def.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_def.h new file mode 100644 index 000000000..1f9cf53d5 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_def.h @@ -0,0 +1,1743 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_def.h + + Abstract: + Miniport related definition header + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Paul Lin 08-01-2002 created + John Chang 08-05-2003 add definition for 11g & other drafts +*/ +#ifndef __RTMP_DEF_H__ +#define __RTMP_DEF_H__ + +#include "oid.h" + +#undef AP_WSC_INCLUDED +#undef STA_WSC_INCLUDED +#undef WSC_INCLUDED + + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + +#if defined(AP_WSC_INCLUDED) || defined(STA_WSC_INCLUDED) +#define WSC_INCLUDED +#endif +// +// Debug information verbosity: lower values indicate higher urgency +// +#define RT_DEBUG_OFF 0 +#define RT_DEBUG_ERROR 1 +#define RT_DEBUG_WARN 2 +#define RT_DEBUG_TRACE 3 +#define RT_DEBUG_INFO 4 +#define RT_DEBUG_LOUD 5 + +#define NIC_TAG ((ULONG)'0682') +#define NIC_DBG_STRING ("**RT28xx**") + +#ifdef SNMP_SUPPORT +// for snmp +// to get manufacturer OUI, kathy, 2008_0220 +#define ManufacturerOUI_LEN 3 +#define ManufacturerNAME ("Ralink Technology Company.") +#define ResourceTypeIdName ("Ralink_ID") +#endif + + +//#define GNU_PACKED +#define RALINK_3883_VERSION ((UINT32)0x38830400) +#define RALINK_2883_VERSION ((UINT32)0x28830300) +#define RALINK_2880E_VERSION ((UINT32)0x28720200) +#define RALINK_3070_VERSION ((UINT32)0x30700200) + +#define MAX_RX_PKT_LEN 1520 + +// +// Entry number for each DMA descriptor ring +// + +#ifdef RTMP_MAC_PCI +#define TX_RING_SIZE 64 //64 +#define MGMT_RING_SIZE 128 +#define RX_RING_SIZE 128 //64 +#define MAX_TX_PROCESS TX_RING_SIZE //8 +#define MAX_DMA_DONE_PROCESS TX_RING_SIZE +#define MAX_TX_DONE_PROCESS TX_RING_SIZE //8 +#define LOCAL_TXBUF_SIZE 2 +#endif // RTMP_MAC_PCI // + +#define PCI_VIRT_TO_PHYS(__Addr) (((UINT32)(__Addr)) & 0x0FFFFFFF) + + +#ifdef MULTIPLE_CARD_SUPPORT +// MC: Multple Cards +#define MAX_NUM_OF_MULTIPLE_CARD 32 +#endif // MULTIPLE_CARD_SUPPORT // + +#define MAX_RX_PROCESS 128 //64 //32 +#define NUM_OF_LOCAL_TXBUF 2 +#define TXD_SIZE 16 +#define TXWI_SIZE 16 +#define RXD_SIZE 16 +#define RXWI_SIZE 16 +// TXINFO_SIZE + TXWI_SIZE + 802.11 Header Size + AMSDU sub frame header +#define TX_DMA_1ST_BUFFER_SIZE 96 // only the 1st physical buffer is pre-allocated +#define MGMT_DMA_BUFFER_SIZE 1536 //2048 +#define RX_BUFFER_AGGRESIZE 3840 //3904 //3968 //4096 //2048 //4096 +#define RX_BUFFER_NORMSIZE 3840 //3904 //3968 //4096 //2048 //4096 +#define TX_BUFFER_NORMSIZE RX_BUFFER_NORMSIZE +#define MAX_FRAME_SIZE 2346 // Maximum 802.11 frame size +#define MAX_AGGREGATION_SIZE 3840 //3904 //3968 //4096 +#define MAX_NUM_OF_TUPLE_CACHE 2 +#define MAX_MCAST_LIST_SIZE 32 +#define MAX_LEN_OF_VENDOR_DESC 64 +//#define MAX_SIZE_OF_MCAST_PSQ (NUM_OF_LOCAL_TXBUF >> 2) // AP won't spend more than 1/4 of total buffers on M/BCAST PSQ +#define MAX_SIZE_OF_MCAST_PSQ 32 + +#define MAX_RX_PROCESS_CNT (RX_RING_SIZE) + + +/* + WMM Note: If memory of your system is not much, please reduce the definition; + or when you do WMM test, the queue for low priority AC will be full, i.e. + TX_RING_SIZE + MAX_PACKETS_IN_QUEUE packets for the AC will be buffered in + WLAN, maybe no any packet buffer can be got in Ethernet driver. + + Sometimes no packet buffer can be got in Ethernet driver, the system will + send flow control packet to the sender to slow down its sending rate. + So no WMM can be saw in the air. +*/ + +/* + Need to use 64 in vxworks for test case WMM A5-T07 + Two dnlink (10Mbps) from a WMM station to a non-WMM station. + If use 256, queue is not enough. + And in rt_main_end.c, clConfig.clNum = RX_RING_SIZE * 3; is changed to + clConfig.clNum = RX_RING_SIZE * 4; +*/ +// TODO: For VxWorks the size is 256. Shall we cahnge the value as 256 for all OS????? +#define MAX_PACKETS_IN_QUEUE (512) //(512) // to pass WMM A5-WPAPSK + +#define MAX_PACKETS_IN_MCAST_PS_QUEUE 32 +#define MAX_PACKETS_IN_PS_QUEUE 128 //32 +#define WMM_NUM_OF_AC 4 /* AC0, AC1, AC2, and AC3 */ + + +#ifdef RTMP_EFUSE_SUPPORT +//2008/09/11:KH add to support efuse<-- +#define MAX_EEPROM_BIN_FILE_SIZE 1024 +#define EFUSE_BUFFER_PATH "/tmp/RT30xxEEPROM.bin" +//2008/09/11:KH add to support efuse--> +#endif // RTMP_EFUSE_SUPPORT // + +// RxFilter +#define STANORMAL 0x17f97 +#define APNORMAL 0x15f97 +#ifdef CONFIG_STA_SUPPORT +#ifdef XLINK_SUPPORT +#define PSPXLINK 0x17f93 +#endif // XLINK_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + +// +// RTMP_ADAPTER flags +// +#define fRTMP_ADAPTER_MAP_REGISTER 0x00000001 +#define fRTMP_ADAPTER_INTERRUPT_IN_USE 0x00000002 +#define fRTMP_ADAPTER_HARDWARE_ERROR 0x00000004 +#define fRTMP_ADAPTER_SCATTER_GATHER 0x00000008 +#define fRTMP_ADAPTER_SEND_PACKET_ERROR 0x00000010 +#define fRTMP_ADAPTER_MLME_RESET_IN_PROGRESS 0x00000020 +#define fRTMP_ADAPTER_HALT_IN_PROGRESS 0x00000040 +#define fRTMP_ADAPTER_RESET_IN_PROGRESS 0x00000080 +#define fRTMP_ADAPTER_NIC_NOT_EXIST 0x00000100 +#define fRTMP_ADAPTER_TX_RING_ALLOCATED 0x00000200 +#define fRTMP_ADAPTER_REMOVE_IN_PROGRESS 0x00000400 +#define fRTMP_ADAPTER_MIMORATE_INUSED 0x00000800 +#define fRTMP_ADAPTER_RX_RING_ALLOCATED 0x00001000 +#define fRTMP_ADAPTER_INTERRUPT_ACTIVE 0x00002000 +#define fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS 0x00004000 +#define fRTMP_ADAPTER_REASSOC_IN_PROGRESS 0x00008000 +#define fRTMP_ADAPTER_MEDIA_STATE_PENDING 0x00010000 +#define fRTMP_ADAPTER_RADIO_OFF 0x00020000 +#define fRTMP_ADAPTER_BULKOUT_RESET 0x00040000 +#define fRTMP_ADAPTER_BULKIN_RESET 0x00080000 +#define fRTMP_ADAPTER_RDG_ACTIVE 0x00100000 +#define fRTMP_ADAPTER_DYNAMIC_BE_TXOP_ACTIVE 0x00200000 +#define fRTMP_ADAPTER_SCAN_2040 0x04000000 +#define fRTMP_ADAPTER_RADIO_MEASUREMENT 0x08000000 + +#define fRTMP_ADAPTER_START_UP 0x10000000 //Devive already initialized and enabled Tx/Rx. +#define fRTMP_ADAPTER_MEDIA_STATE_CHANGE 0x20000000 +#define fRTMP_ADAPTER_IDLE_RADIO_OFF 0x40000000 + +// Lock bit for accessing different ring buffers +//#define fRTMP_ADAPTER_TX_RING_BUSY 0x80000000 +//#define fRTMP_ADAPTER_MGMT_RING_BUSY 0x40000000 +//#define fRTMP_ADAPTER_ATIM_RING_BUSY 0x20000000 +//#define fRTMP_ADAPTER_RX_RING_BUSY 0x10000000 + +// Lock bit for accessing different queue +//#define fRTMP_ADAPTER_TX_QUEUE_BUSY 0x08000000 +//#define fRTMP_ADAPTER_MGMT_QUEUE_BUSY 0x04000000 + +// +// STA operation status flags +// +#define fOP_STATUS_INFRA_ON 0x00000001 +#define fOP_STATUS_ADHOC_ON 0x00000002 +#define fOP_STATUS_BG_PROTECTION_INUSED 0x00000004 +#define fOP_STATUS_SHORT_SLOT_INUSED 0x00000008 +#define fOP_STATUS_SHORT_PREAMBLE_INUSED 0x00000010 +#define fOP_STATUS_RECEIVE_DTIM 0x00000020 +//#define fOP_STATUS_TX_RATE_SWITCH_ENABLED 0x00000040 +#define fOP_STATUS_MEDIA_STATE_CONNECTED 0x00000080 +#define fOP_STATUS_WMM_INUSED 0x00000100 +#define fOP_STATUS_AGGREGATION_INUSED 0x00000200 +#define fOP_STATUS_DOZE 0x00000400 // debug purpose +#define fOP_STATUS_PIGGYBACK_INUSED 0x00000800 // piggy-back, and aggregation +#define fOP_STATUS_APSD_INUSED 0x00001000 +#define fOP_STATUS_TX_AMSDU_INUSED 0x00002000 +#define fOP_STATUS_MAX_RETRY_ENABLED 0x00004000 +#define fOP_STATUS_WAKEUP_NOW 0x00008000 +#define fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE 0x00020000 + + +// +// RTMP_ADAPTER PSFlags : related to advanced power save. +// +// Indicate whether driver can go to sleep mode from now. This flag is useful AFTER link up +#define fRTMP_PS_CAN_GO_SLEEP 0x00000001 +// Indicate whether driver has issue a LinkControl command to PCIe L1 +#define fRTMP_PS_SET_PCI_CLK_OFF_COMMAND 0x00000002 +// Indicate driver should disable kick off hardware to send packets from now. +#define fRTMP_PS_DISABLE_TX 0x00000004 +// Indicate driver should IMMEDIATELY fo to sleep after receiving AP's beacon in which doesn't indicate unicate nor multicast packets for me +//. This flag is used ONLY in RTMPHandleRxDoneInterrupt routine. +#define fRTMP_PS_GO_TO_SLEEP_NOW 0x00000008 +#define fRTMP_PS_TOGGLE_L1 0x00000010 // Use Toggle L1 mechanism for rt28xx PCIe +#ifdef DOT11N_DRAFT3 +#define fOP_STATUS_SCAN_2040 0x00040000 +#endif // DOT11N_DRAFT3 // + +#define CCKSETPROTECT 0x1 +#define OFDMSETPROTECT 0x2 +#define MM20SETPROTECT 0x4 +#define MM40SETPROTECT 0x8 +#define GF20SETPROTECT 0x10 +#define GR40SETPROTECT 0x20 +#define ALLN_SETPROTECT (GR40SETPROTECT | GF20SETPROTECT | MM40SETPROTECT | MM20SETPROTECT) + +// +// AP's client table operation status flags +// +#define fCLIENT_STATUS_WMM_CAPABLE 0x00000001 // CLIENT can parse QOS DATA frame +#define fCLIENT_STATUS_AGGREGATION_CAPABLE 0x00000002 // CLIENT can receive Ralink's proprietary TX aggregation frame +#define fCLIENT_STATUS_PIGGYBACK_CAPABLE 0x00000004 // CLIENT support piggy-back +#define fCLIENT_STATUS_AMSDU_INUSED 0x00000008 +#define fCLIENT_STATUS_SGI20_CAPABLE 0x00000010 +#define fCLIENT_STATUS_SGI40_CAPABLE 0x00000020 +#define fCLIENT_STATUS_TxSTBC_CAPABLE 0x00000040 +#define fCLIENT_STATUS_RxSTBC_CAPABLE 0x00000080 +#define fCLIENT_STATUS_HTC_CAPABLE 0x00000100 +#define fCLIENT_STATUS_RDG_CAPABLE 0x00000200 +#define fCLIENT_STATUS_MCSFEEDBACK_CAPABLE 0x00000400 +#define fCLIENT_STATUS_APSD_CAPABLE 0x00000800 /* UAPSD STATION */ + +#ifdef DOT11N_DRAFT3 +#define fCLIENT_STATUS_BSSCOEXIST_CAPABLE 0x00001000 +#endif // DOT11N_DRAFT3 // +#define fCLIENT_STATUS_SOFTWARE_ENCRYPT 0x00002000 /* Indicate the client encrypt/decrypt by software */ +#define fCLIENT_STATUS_RALINK_CHIPSET 0x00100000 + +#ifdef CLIENT_WDS +#define fCLIENT_STATUS_CLI_WDS 0x00200000 +#endif // CLIENT_WDS // + +// +// STA configuration flags +// +//#define fSTA_CFG_ENABLE_TX_BURST 0x00000001 + +// 802.11n Operating Mode Definition. 0-3 also used in ASICUPdateProtect switch case +#define HT_NO_PROTECT 0 +#define HT_LEGACY_PROTECT 1 +#define HT_40_PROTECT 2 +#define HT_2040_PROTECT 3 +#define HT_RTSCTS_6M 7 +//following is our own definition in order to turn on our ASIC protection register in INFRASTRUCTURE. +#define HT_ATHEROS 8 // rt2860c has problem with atheros chip. we need to turn on RTS/CTS . +#define HT_FORCERTSCTS 9 // Force turn on RTS/CTS first. then go to evaluate if this force RTS is necessary. + +// +// RX Packet Filter control flags. Apply on pAd->PacketFilter +// +#define fRX_FILTER_ACCEPT_DIRECT NDIS_PACKET_TYPE_DIRECTED +#define fRX_FILTER_ACCEPT_MULTICAST NDIS_PACKET_TYPE_MULTICAST +#define fRX_FILTER_ACCEPT_BROADCAST NDIS_PACKET_TYPE_BROADCAST +#define fRX_FILTER_ACCEPT_ALL_MULTICAST NDIS_PACKET_TYPE_ALL_MULTICAST +#define fRX_FILTER_ACCEPT_PROMISCUOUS NDIS_PACKET_TYPE_PROMISCUOUS + +// +// Error code section +// +// NDIS_ERROR_CODE_ADAPTER_NOT_FOUND +#define ERRLOG_READ_PCI_SLOT_FAILED 0x00000101L +#define ERRLOG_WRITE_PCI_SLOT_FAILED 0x00000102L +#define ERRLOG_VENDOR_DEVICE_NOMATCH 0x00000103L + +// NDIS_ERROR_CODE_ADAPTER_DISABLED +#define ERRLOG_BUS_MASTER_DISABLED 0x00000201L + +// NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION +#define ERRLOG_INVALID_SPEED_DUPLEX 0x00000301L +#define ERRLOG_SET_SECONDARY_FAILED 0x00000302L + +// NDIS_ERROR_CODE_OUT_OF_RESOURCES +#define ERRLOG_OUT_OF_MEMORY 0x00000401L +#define ERRLOG_OUT_OF_SHARED_MEMORY 0x00000402L +#define ERRLOG_OUT_OF_MAP_REGISTERS 0x00000403L +#define ERRLOG_OUT_OF_BUFFER_POOL 0x00000404L +#define ERRLOG_OUT_OF_NDIS_BUFFER 0x00000405L +#define ERRLOG_OUT_OF_PACKET_POOL 0x00000406L +#define ERRLOG_OUT_OF_NDIS_PACKET 0x00000407L +#define ERRLOG_OUT_OF_LOOKASIDE_MEMORY 0x00000408L + +// NDIS_ERROR_CODE_HARDWARE_FAILURE +#define ERRLOG_SELFTEST_FAILED 0x00000501L +#define ERRLOG_INITIALIZE_ADAPTER 0x00000502L +#define ERRLOG_REMOVE_MINIPORT 0x00000503L + +// NDIS_ERROR_CODE_RESOURCE_CONFLICT +#define ERRLOG_MAP_IO_SPACE 0x00000601L +#define ERRLOG_QUERY_ADAPTER_RESOURCES 0x00000602L +#define ERRLOG_NO_IO_RESOURCE 0x00000603L +#define ERRLOG_NO_INTERRUPT_RESOURCE 0x00000604L +#define ERRLOG_NO_MEMORY_RESOURCE 0x00000605L + + +// WDS definition +#define MAX_WDS_ENTRY 4 +#define WDS_PAIRWISE_KEY_OFFSET 60 // WDS links uses pairwise key#60 ~ 63 in ASIC pairwise key table + +#define WDS_DISABLE_MODE 0 +#define WDS_RESTRICT_MODE 1 +#define WDS_BRIDGE_MODE 2 +#define WDS_REPEATER_MODE 3 +#define WDS_LAZY_MODE 4 + + +#define MAX_MESH_NUM 0 + +#define MAX_APCLI_NUM 0 +#ifdef APCLI_SUPPORT +#undef MAX_APCLI_NUM +#define MAX_APCLI_NUM 1 +#endif // APCLI_SUPPORT // + +#define MAX_MBSSID_NUM 1 +#ifdef MBSS_SUPPORT +#undef MAX_MBSSID_NUM +#define MAX_MBSSID_NUM (8 - MAX_MESH_NUM - MAX_APCLI_NUM) +#endif // MBSS_SUPPORT // + +/* sanity check for apidx */ +#define MBSS_MR_APIDX_SANITY_CHECK(apidx) \ + { if (apidx > MAX_MBSSID_NUM) { \ + DBGPRINT(RT_DEBUG_ERROR, ("%s> Error! apidx = %d > MAX_MBSSID_NUM!\n", __FUNCTION__, apidx)); \ + apidx = MAIN_MBSSID; } } + +#define VALID_WCID(_wcid) ((_wcid) > 0 && (_wcid) < MAX_LEN_OF_MAC_TABLE ) + +#define MAIN_MBSSID 0 +#define FIRST_MBSSID 1 + + +#define MAX_BEACON_SIZE 512 +// If the MAX_MBSSID_NUM is larger than 6, +// it shall reserve some WCID space(wcid 222~253) for beacon frames. +// - these wcid 238~253 are reserved for beacon#6(ra6). +// - these wcid 222~237 are reserved for beacon#7(ra7). +#if defined(MAX_MBSSID_NUM) && (MAX_MBSSID_NUM == 8) +#define HW_RESERVED_WCID 222 +#elif defined(MAX_MBSSID_NUM) && (MAX_MBSSID_NUM == 7) +#define HW_RESERVED_WCID 238 +#else +#define HW_RESERVED_WCID 255 +#endif + +// Then dedicate wcid of DFS and Carrier-Sense. +#define DFS_CTS_WCID (HW_RESERVED_WCID - 1) +#define CS_CTS_WCID (HW_RESERVED_WCID - 2) +#define LAST_SPECIFIC_WCID (HW_RESERVED_WCID - 2) + +// If MAX_MBSSID_NUM is 8, the maximum available wcid for the associated STA is 211. +// If MAX_MBSSID_NUM is 7, the maximum available wcid for the associated STA is 228. +#define MAX_AVAILABLE_CLIENT_WCID (LAST_SPECIFIC_WCID - MAX_MBSSID_NUM - 1) + +// TX need WCID to find Cipher Key +// these wcid 212 ~ 219 are reserved for bc/mc packets if MAX_MBSSID_NUM is 8. +#define GET_GroupKey_WCID(__wcid, __bssidx) \ + { \ + __wcid = LAST_SPECIFIC_WCID - (MAX_MBSSID_NUM) + __bssidx; \ + } + +#define IsGroupKeyWCID(__wcid) (((__wcid) < LAST_SPECIFIC_WCID) && ((__wcid) >= (LAST_SPECIFIC_WCID - (MAX_MBSSID_NUM)))) + + +// definition to support multiple BSSID +#define BSS0 0 +#define BSS1 1 +#define BSS2 2 +#define BSS3 3 +#define BSS4 4 +#define BSS5 5 +#define BSS6 6 +#define BSS7 7 + + +//============================================================ +// Length definitions +#define PEER_KEY_NO 2 +#define MAC_ADDR_LEN 6 +#define TIMESTAMP_LEN 8 +#define MAX_LEN_OF_SUPPORTED_RATES MAX_LENGTH_OF_SUPPORT_RATES // 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 +#define MAX_NUM_OF_REGULATORY_CLASS 16 +#define MAX_LEN_OF_KEY 32 // 32 octets == 256 bits, Redefine for WPA +#define MAX_NUM_OF_CHANNELS MAX_NUM_OF_CHS // 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL termination +#define MAX_NUM_OF_11JCHANNELS 20 // 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL termination +#define MAX_LEN_OF_SSID 32 +#define CIPHER_TEXT_LEN 128 +#define HASH_TABLE_SIZE 256 /* Size of hash tab must be power of 2. */ +#define MAX_VIE_LEN 1024 // New for WPA cipher suite variable IE sizes. +#define MAX_SUPPORT_MCS 32 +#define MAX_NUM_OF_BBP_LATCH 140 +//============================================================ +// ASIC WCID Table definition. +//============================================================ +#define BSSID_WCID 1 // in infra mode, always put bssid with this WCID +#define MCAST_WCID 0x0 +#define BSS0Mcast_WCID 0x0 +#define BSS1Mcast_WCID 0xf8 +#define BSS2Mcast_WCID 0xf9 +#define BSS3Mcast_WCID 0xfa +#define BSS4Mcast_WCID 0xfb +#define BSS5Mcast_WCID 0xfc +#define BSS6Mcast_WCID 0xfd +#define BSS7Mcast_WCID 0xfe +#define RESERVED_WCID 0xff + +#define MAX_NUM_OF_ACL_LIST MAX_NUMBER_OF_ACL + +#define MAX_LEN_OF_MAC_TABLE MAX_NUMBER_OF_MAC // if MAX_MBSSID_NUM is 8, this value can't be larger than 211 + +#if MAX_LEN_OF_MAC_TABLE>MAX_AVAILABLE_CLIENT_WCID +#error MAX_LEN_OF_MAC_TABLE can not be larger than MAX_AVAILABLE_CLIENT_WCID!!!! +#endif + +#define MAX_NUM_OF_WDS_LINK_PERBSSID 3 +#define MAX_NUM_OF_WDS_LINK (MAX_NUM_OF_WDS_LINK_PERBSSID*MAX_MBSSID_NUM) +#define MAX_NUM_OF_EVENT MAX_NUMBER_OF_EVENT +#define WDS_LINK_START_WCID (MAX_LEN_OF_MAC_TABLE-1) + +#define NUM_OF_TID 8 +#define MAX_AID_BA 4 +#define MAX_LEN_OF_BA_REC_TABLE ((NUM_OF_TID * MAX_LEN_OF_MAC_TABLE)/2)// (NUM_OF_TID*MAX_AID_BA + 32) //Block ACK recipient +#define MAX_LEN_OF_BA_ORI_TABLE ((NUM_OF_TID * MAX_LEN_OF_MAC_TABLE)/2)// (NUM_OF_TID*MAX_AID_BA + 32) // Block ACK originator +#define MAX_LEN_OF_BSS_TABLE 64 +#define MAX_REORDERING_MPDU_NUM 512 + +// key related definitions +#define SHARE_KEY_NUM 4 +#define MAX_LEN_OF_SHARE_KEY 16 // byte count +#define MAX_LEN_OF_PEER_KEY 16 // byte count +#define PAIRWISE_KEY_NUM 64 // in MAC ASIC pairwise key table +#define GROUP_KEY_NUM 4 +#define PMK_LEN 32 +#define WDS_PAIRWISE_KEY_OFFSET 60 // WDS links uses pairwise key#60 ~ 63 in ASIC pairwise key table +#define PMKID_NO 4 // Number of PMKID saved supported +#define MAX_LEN_OF_MLME_BUFFER 2048 + +// power status related definitions +#define PWR_ACTIVE 0 +#define PWR_SAVE 1 +#define PWR_MMPS 2 //MIMO power save +//#define PWR_UNKNOWN 2 + +// Auth and Assoc mode related definitions +#define AUTH_MODE_OPEN 0x00 +#define AUTH_MODE_KEY 0x01 +//#define AUTH_MODE_AUTO_SWITCH 0x03 +//#define AUTH_MODE_DEAUTH 0x04 +//#define AUTH_MODE_UPLAYER 0x05 // reserved for 802.11i use + +// BSS Type definitions +#define BSS_ADHOC 0 // = Ndis802_11IBSS +#define BSS_INFRA 1 // = Ndis802_11Infrastructure +#define BSS_ANY 2 // = Ndis802_11AutoUnknown +#define BSS_MONITOR 3 // = Ndis802_11Monitor + + +// Reason code definitions +#define REASON_RESERVED 0 +#define REASON_UNSPECIFY 1 +#define REASON_NO_LONGER_VALID 2 +#define REASON_DEAUTH_STA_LEAVING 3 +#define REASON_DISASSOC_INACTIVE 4 +#define REASON_DISASSPC_AP_UNABLE 5 +#define REASON_CLS2ERR 6 +#define REASON_CLS3ERR 7 +#define REASON_DISASSOC_STA_LEAVING 8 +#define REASON_STA_REQ_ASSOC_NOT_AUTH 9 +#define REASON_INVALID_IE 13 +#define REASON_MIC_FAILURE 14 +#define REASON_4_WAY_TIMEOUT 15 +#define REASON_GROUP_KEY_HS_TIMEOUT 16 +#define REASON_IE_DIFFERENT 17 +#define REASON_MCIPHER_NOT_VALID 18 +#define REASON_UCIPHER_NOT_VALID 19 +#define REASON_AKMP_NOT_VALID 20 +#define REASON_UNSUPPORT_RSNE_VER 21 +#define REASON_INVALID_RSNE_CAP 22 +#define REASON_8021X_AUTH_FAIL 23 +#define REASON_CIPHER_SUITE_REJECTED 24 +#define REASON_DECLINED 37 + +#define REASON_QOS_UNSPECIFY 32 +#define REASON_QOS_LACK_BANDWIDTH 33 +#define REASON_POOR_CHANNEL_CONDITION 34 +#define REASON_QOS_OUTSIDE_TXOP_LIMITION 35 +#define REASON_QOS_QSTA_LEAVING_QBSS 36 +#define REASON_QOS_UNWANTED_MECHANISM 37 +#define REASON_QOS_MECH_SETUP_REQUIRED 38 +#define REASON_QOS_REQUEST_TIMEOUT 39 +#define REASON_QOS_CIPHER_NOT_SUPPORT 45 + + +#define REASON_FT_INVALID_FTIE 55 + +// Status code definitions +#define MLME_SUCCESS 0 +#define MLME_UNSPECIFY_FAIL 1 +#define MLME_CANNOT_SUPPORT_CAP 10 +#define MLME_REASSOC_DENY_ASSOC_EXIST 11 +#define MLME_ASSOC_DENY_OUT_SCOPE 12 +#define MLME_ALG_NOT_SUPPORT 13 +#define MLME_SEQ_NR_OUT_OF_SEQUENCE 14 +#define MLME_REJ_CHALLENGE_FAILURE 15 +#define MLME_REJ_TIMEOUT 16 +#define MLME_ASSOC_REJ_UNABLE_HANDLE_STA 17 +#define MLME_ASSOC_REJ_DATA_RATE 18 + +#define MLME_ASSOC_REJ_NO_EXT_RATE 22 +#define MLME_ASSOC_REJ_NO_EXT_RATE_PBCC 23 +#define MLME_ASSOC_REJ_NO_CCK_OFDM 24 + + +#define MLME_QOS_UNSPECIFY 32 +#define MLME_REQUEST_DECLINED 37 +#define MLME_REQUEST_WITH_INVALID_PARAM 38 +#define MLME_INVALID_INFORMATION_ELEMENT 40 +#define MLME_INVALID_GROUP_CIPHER 41 +#define MLME_INVALID_PAIRWISE_CIPHER 42 +#define MLME_INVALID_AKMP 43 +#define MLME_NOT_SUPPORT_RSN_VERSION 44 +#define MLME_INVALID_RSN_CAPABILITIES 45 +#define MLME_DLS_NOT_ALLOW_IN_QBSS 48 +#define MLME_DEST_STA_NOT_IN_QBSS 49 +#define MLME_DEST_STA_IS_NOT_A_QSTA 50 + +#define MLME_INVALID_FORMAT 0x51 +#define MLME_FAIL_NO_RESOURCE 0x52 +#define MLME_STATE_MACHINE_REJECT 0x53 +#define MLME_MAC_TABLE_FAIL 0x54 + +// IE code +#define IE_SSID 0 +#define IE_SUPP_RATES 1 +#define IE_FH_PARM 2 +#define IE_DS_PARM 3 +#define IE_CF_PARM 4 +#define IE_TIM 5 +#define IE_IBSS_PARM 6 +#define IE_COUNTRY 7 // 802.11d +#define IE_802_11D_REQUEST 10 // 802.11d +#define IE_QBSS_LOAD 11 // 802.11e d9 +#define IE_EDCA_PARAMETER 12 // 802.11e d9 +#define IE_TSPEC 13 // 802.11e d9 +#define IE_TCLAS 14 // 802.11e d9 +#define IE_SCHEDULE 15 // 802.11e d9 +#define IE_CHALLENGE_TEXT 16 +#define IE_POWER_CONSTRAINT 32 // 802.11h d3.3 +#define IE_POWER_CAPABILITY 33 // 802.11h d3.3 +#define IE_TPC_REQUEST 34 // 802.11h d3.3 +#define IE_TPC_REPORT 35 // 802.11h d3.3 +#define IE_SUPP_CHANNELS 36 // 802.11h d3.3 +#define IE_CHANNEL_SWITCH_ANNOUNCEMENT 37 // 802.11h d3.3 +#define IE_MEASUREMENT_REQUEST 38 // 802.11h d3.3 +#define IE_MEASUREMENT_REPORT 39 // 802.11h d3.3 +#define IE_QUIET 40 // 802.11h d3.3 +#define IE_IBSS_DFS 41 // 802.11h d3.3 +#define IE_ERP 42 // 802.11g +#define IE_TS_DELAY 43 // 802.11e d9 +#define IE_TCLAS_PROCESSING 44 // 802.11e d9 +#define IE_QOS_CAPABILITY 46 // 802.11e d6 +#define IE_HT_CAP 45 // 802.11n d1. HT CAPABILITY. ELEMENT ID TBD +#define IE_AP_CHANNEL_REPORT 51 // 802.11k d6 +#define IE_HT_CAP2 52 // 802.11n d1. HT CAPABILITY. ELEMENT ID TBD +#define IE_RSN 48 // 802.11i d3.0 +#define IE_WPA2 48 // WPA2 +#define IE_EXT_SUPP_RATES 50 // 802.11g +#define IE_SUPP_REG_CLASS 59 // 802.11y. Supported regulatory classes. +#define IE_EXT_CHANNEL_SWITCH_ANNOUNCEMENT 60 // 802.11n +#define IE_ADD_HT 61 // 802.11n d1. ADDITIONAL HT CAPABILITY. ELEMENT ID TBD +#define IE_ADD_HT2 53 // 802.11n d1. ADDITIONAL HT CAPABILITY. ELEMENT ID TBD + + +// For 802.11n D3.03 +//#define IE_NEW_EXT_CHA_OFFSET 62 // 802.11n d1. New extension channel offset elemet +#define IE_SECONDARY_CH_OFFSET 62 // 802.11n D3.03 Secondary Channel Offset element +#define IE_WAPI 68 // WAPI information element. Same as Bss Ac Access Dealy Element. +#define IE_2040_BSS_COEXIST 72 // 802.11n D3.0.3 +#define IE_2040_BSS_INTOLERANT_REPORT 73 // 802.11n D3.03 +#define IE_OVERLAPBSS_SCAN_PARM 74 // 802.11n D3.03 +#define IE_EXT_CAPABILITY 127 // 802.11n D3.03 + + +#define IE_WPA 221 // WPA +#define IE_VENDOR_SPECIFIC 221 // Wifi WMM (WME) +#define IE_WFA_WSC 221 + +#define OUI_BROADCOM_HT 51 // +#define OUI_BROADCOM_HTADD 52 // +#define OUI_PREN_HT_CAP 51 // +#define OUI_PREN_ADD_HT 52 // + +// CCX information +#define IE_AIRONET_CKIP 133 // CCX1.0 ID 85H for CKIP +#define IE_AP_TX_POWER 150 // CCX 2.0 for AP transmit power +#define IE_MEASUREMENT_CAPABILITY 221 // CCX 2.0 +#define IE_CCX_V2 221 +#define IE_AIRONET_IPADDRESS 149 // CCX ID 95H for IP Address +#define IE_AIRONET_CCKMREASSOC 156 // CCX ID 9CH for CCKM Reassociation Request element +#define CKIP_NEGOTIATION_LENGTH 30 +#define AIRONET_IPADDRESS_LENGTH 10 +#define AIRONET_CCKMREASSOC_LENGTH 24 + +// ======================================================== +// MLME state machine definition +// ======================================================== + +// STA MLME state mahcines +#define ASSOC_STATE_MACHINE 1 +#define AUTH_STATE_MACHINE 2 +#define AUTH_RSP_STATE_MACHINE 3 +#define SYNC_STATE_MACHINE 4 +#define MLME_CNTL_STATE_MACHINE 5 +#define WPA_PSK_STATE_MACHINE 6 +//#define LEAP_STATE_MACHINE 7 +#define AIRONET_STATE_MACHINE 8 +#define ACTION_STATE_MACHINE 9 + + +// AP MLME state machines +#define AP_ASSOC_STATE_MACHINE 11 +#define AP_AUTH_STATE_MACHINE 12 +#define AP_SYNC_STATE_MACHINE 14 +#define AP_CNTL_STATE_MACHINE 15 +#define WSC_STATE_MACHINE 17 +#define WSC_UPNP_STATE_MACHINE 18 + + +#define WPA_STATE_MACHINE 23 + + +#ifdef QOS_DLS_SUPPORT +#define DLS_STATE_MACHINE 26 +#endif // QOS_DLS_SUPPORT // + + + +// +// STA's CONTROL/CONNECT state machine: states, events, total function # +// +#define CNTL_IDLE 0 +#define CNTL_WAIT_DISASSOC 1 +#define CNTL_WAIT_JOIN 2 +#define CNTL_WAIT_REASSOC 3 +#define CNTL_WAIT_START 4 +#define CNTL_WAIT_AUTH 5 +#define CNTL_WAIT_ASSOC 6 +#define CNTL_WAIT_AUTH2 7 +#define CNTL_WAIT_OID_LIST_SCAN 8 +#define CNTL_WAIT_OID_DISASSOC 9 + +#define MT2_ASSOC_CONF 34 +#define MT2_AUTH_CONF 35 +#define MT2_DEAUTH_CONF 36 +#define MT2_DISASSOC_CONF 37 +#define MT2_REASSOC_CONF 38 +#define MT2_PWR_MGMT_CONF 39 +#define MT2_JOIN_CONF 40 +#define MT2_SCAN_CONF 41 +#define MT2_START_CONF 42 +#define MT2_GET_CONF 43 +#define MT2_SET_CONF 44 +#define MT2_RESET_CONF 45 +#define MT2_FT_OTD_CONF 46 +#define MT2_MLME_ROAMING_REQ 52 + +#define CNTL_FUNC_SIZE 1 + +// +// STA's ASSOC state machine: states, events, total function # +// +#define ASSOC_IDLE 0 +#define ASSOC_WAIT_RSP 1 +#define REASSOC_WAIT_RSP 2 +#define DISASSOC_WAIT_RSP 3 +#define MAX_ASSOC_STATE 4 + +#define ASSOC_MACHINE_BASE 0 +#define MT2_MLME_ASSOC_REQ 0 +#define MT2_MLME_REASSOC_REQ 1 +#define MT2_MLME_DISASSOC_REQ 2 +#define MT2_PEER_DISASSOC_REQ 3 +#define MT2_PEER_ASSOC_REQ 4 +#define MT2_PEER_ASSOC_RSP 5 +#define MT2_PEER_REASSOC_REQ 6 +#define MT2_PEER_REASSOC_RSP 7 +#define MT2_DISASSOC_TIMEOUT 8 +#define MT2_ASSOC_TIMEOUT 9 +#define MT2_REASSOC_TIMEOUT 10 +#define MAX_ASSOC_MSG 11 + +#define ASSOC_FUNC_SIZE (MAX_ASSOC_STATE * MAX_ASSOC_MSG) + +// +// ACT state machine: states, events, total function # +// +#define ACT_IDLE 0 +#define MAX_ACT_STATE 1 + +#define ACT_MACHINE_BASE 0 + +/* Those PEER_xx_CATE number is based on real Categary value in IEEE spec. + Please doesn't modify it by yourself. */ +//Category +#define MT2_PEER_SPECTRUM_CATE 0 +#define MT2_PEER_QOS_CATE 1 +#define MT2_PEER_DLS_CATE 2 +#define MT2_PEER_BA_CATE 3 +#define MT2_PEER_PUBLIC_CATE 4 +#define MT2_PEER_RM_CATE 5 +/* "FT_CATEGORY_BSS_TRANSITION equal to 6" is defined file of "dot11r_ft.h" */ +#define MT2_PEER_HT_CATE 7 // 7.4.7 +#define MT2_PEER_PMF_CATE 8 /* defined in IEEE 802.11w-D8.0 7.3.1.11*/ +#define MT2_PEER_RESV_9 9 +#define MT2_PEER_RESV_10 10 +#define MT2_PEER_RESV_11 11 +#define MT2_PEER_RESV_12 12 +#define MT2_PEER_RESV_13 13 +#define MT2_PEER_RESV_14 14 +#define MT2_PEER_RESV_15 15 +#define MT2_PEER_RESV_16 16 +/* + In WMM spec v1.1. the category must be 17 + (see Table 7 Management Action Frame Fields) +*/ +#define MT2_PEER_WMM 17 +#define MAX_IEEE_STD_CATE 17 /* Indicate the maximum category code defined in IEEE-802.11-Std */ +#define MAX_PEER_CATE_MSG MAX_IEEE_STD_CATE + +#define MT2_MLME_ADD_BA_CATE (MAX_IEEE_STD_CATE + 1) +#define MT2_MLME_ORI_DELBA_CATE (MAX_IEEE_STD_CATE + 2) +#define MT2_MLME_REC_DELBA_CATE (MAX_IEEE_STD_CATE + 3) +#define MT2_MLME_QOS_CATE (MAX_IEEE_STD_CATE + 4) +#define MT2_MLME_DLS_CATE (MAX_IEEE_STD_CATE + 5) +#define MT2_ACT_INVALID (MAX_IEEE_STD_CATE + 6) + +#define MAX_ACT_MSG (MAX_IEEE_STD_CATE + 7) + + +//Category field +#define CATEGORY_SPECTRUM 0 +#define CATEGORY_QOS 1 +#define CATEGORY_DLS 2 +#define CATEGORY_BA 3 +#define CATEGORY_PUBLIC 4 +#define CATEGORY_RM 5 +#define CATEGORY_FT 6 +#define CATEGORY_HT 7 +#define CATEGORY_PMF 8 /* defined in IEEE 802.11w-D8.0 7.3.1.11*/ + +// DLS Action frame definition +#define ACTION_DLS_REQUEST 0 +#define ACTION_DLS_RESPONSE 1 +#define ACTION_DLS_TEARDOWN 2 + +//Spectrum Action field value 802.11h 7.4.1 +#define SPEC_MRQ 0 // Request +#define SPEC_MRP 1 //Report +#define SPEC_TPCRQ 2 +#define SPEC_TPCRP 3 +#define SPEC_CHANNEL_SWITCH 4 + + +//BA Action field value +#define ADDBA_REQ 0 +#define ADDBA_RESP 1 +#define DELBA 2 + +//Public's Action field value in Public Category. Some in 802.11y and some in 11n +#define ACTION_BSS_2040_COEXIST 0 // 11n +#define ACTION_DSE_ENABLEMENT 1 // 11y D9.0 +#define ACTION_DSE_DEENABLEMENT 2 // 11y D9.0 +#define ACTION_DSE_REG_LOCATION_ANNOUNCE 3 // 11y D9.0 +#define ACTION_EXT_CH_SWITCH_ANNOUNCE 4 // 11y D9.0 +#define ACTION_DSE_MEASUREMENT_REQ 5 // 11y D9.0 +#define ACTION_DSE_MEASUREMENT_REPORT 6 // 11y D9.0 +#define ACTION_MEASUREMENT_PILOT_ACTION 7 // 11y D9.0 +#define ACTION_DSE_POWER_CONSTRAINT 8 // 11y D9.0 + + +//HT Action field value +#define NOTIFY_BW_ACTION 0 +#define SMPS_ACTION 1 +#define PSMP_ACTION 2 +#define SETPCO_ACTION 3 +#define MIMO_CHA_MEASURE_ACTION 4 +#define MIMO_N_BEACONFORM 5 +#define MIMO_BEACONFORM 6 +#define ANTENNA_SELECT 7 +#define HT_INFO_EXCHANGE 8 + +#define ACT_FUNC_SIZE (MAX_ACT_STATE * MAX_ACT_MSG) +// +// STA's AUTHENTICATION state machine: states, evvents, total function # +// +#define AUTH_REQ_IDLE 0 +#define AUTH_WAIT_SEQ2 1 +#define AUTH_WAIT_SEQ4 2 +#define MAX_AUTH_STATE 3 + +#define AUTH_MACHINE_BASE 0 +#define MT2_MLME_AUTH_REQ 0 +#define MT2_PEER_AUTH_EVEN 1 +#define MT2_AUTH_TIMEOUT 2 +#define MAX_AUTH_MSG 3 + +#define AUTH_FUNC_SIZE (MAX_AUTH_STATE * MAX_AUTH_MSG) + +// +// STA's AUTH_RSP state machine: states, events, total function # +// +#define AUTH_RSP_IDLE 0 +#define AUTH_RSP_WAIT_CHAL 1 +#define MAX_AUTH_RSP_STATE 2 + +#define AUTH_RSP_MACHINE_BASE 0 +#define MT2_AUTH_CHALLENGE_TIMEOUT 0 +#define MT2_PEER_AUTH_ODD 1 +#define MT2_PEER_DEAUTH 2 +#define MAX_AUTH_RSP_MSG 3 + +#define AUTH_RSP_FUNC_SIZE (MAX_AUTH_RSP_STATE * MAX_AUTH_RSP_MSG) + +// +// STA's SYNC state machine: states, events, total function # +// +#define SYNC_IDLE 0 // merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state +#define JOIN_WAIT_BEACON 1 +#define SCAN_LISTEN 2 +#define MAX_SYNC_STATE 3 + +#define SYNC_MACHINE_BASE 0 +#define MT2_MLME_SCAN_REQ 0 +#define MT2_MLME_JOIN_REQ 1 +#define MT2_MLME_START_REQ 2 +#define MT2_PEER_BEACON 3 +#define MT2_PEER_PROBE_RSP 4 +#define MT2_PEER_ATIM 5 +#define MT2_SCAN_TIMEOUT 6 +#define MT2_BEACON_TIMEOUT 7 +#define MT2_ATIM_TIMEOUT 8 +#define MT2_PEER_PROBE_REQ 9 +#define MAX_SYNC_MSG 10 + +#define SYNC_FUNC_SIZE (MAX_SYNC_STATE * MAX_SYNC_MSG) + +//Messages for the DLS state machine +#define DLS_IDLE 0 +#define MAX_DLS_STATE 1 + +#define DLS_MACHINE_BASE 0 +#define MT2_MLME_DLS_REQ 0 +#define MT2_PEER_DLS_REQ 1 +#define MT2_PEER_DLS_RSP 2 +#define MT2_MLME_DLS_TEAR_DOWN 3 +#define MT2_PEER_DLS_TEAR_DOWN 4 +#define MAX_DLS_MSG 5 + +#define DLS_FUNC_SIZE (MAX_DLS_STATE * MAX_DLS_MSG) + + +// +// WSC State machine: states, events, total function # +// + +// +// AP's CONTROL/CONNECT state machine: states, events, total function # +// +#define AP_CNTL_FUNC_SIZE 1 + +// +// AP's ASSOC state machine: states, events, total function # +// +#define AP_ASSOC_IDLE 0 +#define AP_MAX_ASSOC_STATE 1 + +#define AP_ASSOC_MACHINE_BASE 0 +#define APMT2_MLME_DISASSOC_REQ 0 +#define APMT2_PEER_DISASSOC_REQ 1 +#define APMT2_PEER_ASSOC_REQ 2 +#define APMT2_PEER_REASSOC_REQ 3 +#define APMT2_CLS3ERR 4 +#define AP_MAX_ASSOC_MSG 5 + +#define AP_ASSOC_FUNC_SIZE (AP_MAX_ASSOC_STATE * AP_MAX_ASSOC_MSG) + +// +// AP's AUTHENTICATION state machine: states, events, total function # +// +#define AP_AUTH_REQ_IDLE 0 +#define AP_MAX_AUTH_STATE 1 + +#define AP_AUTH_MACHINE_BASE 0 +#define APMT2_MLME_DEAUTH_REQ 0 +#define APMT2_CLS2ERR 1 +#define APMT2_PEER_DEAUTH 2 +#define APMT2_PEER_AUTH_REQ 3 +#define APMT2_PEER_AUTH_CONFIRM 4 +#define AP_MAX_AUTH_MSG 5 + +#define AP_AUTH_FUNC_SIZE (AP_MAX_AUTH_STATE * AP_MAX_AUTH_MSG) + +// +// AP's SYNC state machine: states, events, total function # +// +#define AP_SYNC_IDLE 0 +#ifdef AP_SCAN_SUPPORT +#define AP_SCAN_LISTEN 1 +#define AP_MAX_SYNC_STATE 2 +#else +#define AP_MAX_SYNC_STATE 1 +#endif + +#define AP_SYNC_MACHINE_BASE 0 +#define APMT2_PEER_PROBE_REQ 0 +#define APMT2_PEER_BEACON 1 +#define APMT2_PEER_PROBE_RSP 2 +#ifdef AP_SCAN_SUPPORT +#define APMT2_MLME_SCAN_REQ 3 +#define APMT2_SCAN_TIMEOUT 4 +#define APMT2_MLME_SCAN_CNCL 5 +#define AP_MAX_SYNC_MSG 6 +#else +#define AP_MAX_SYNC_MSG 3 +#endif + +#define AP_SYNC_FUNC_SIZE (AP_MAX_SYNC_STATE * AP_MAX_SYNC_MSG) + +#ifdef APCLI_SUPPORT +//ApCli authentication state machine +#define APCLI_AUTH_REQ_IDLE 0 +#define APCLI_AUTH_WAIT_SEQ2 1 +#define APCLI_AUTH_WAIT_SEQ4 2 +#define APCLI_MAX_AUTH_STATE 3 + +#define APCLI_AUTH_MACHINE_BASE 0 +#define APCLI_MT2_MLME_AUTH_REQ 0 +#define APCLI_MT2_MLME_DEAUTH_REQ 1 +#define APCLI_MT2_PEER_AUTH_EVEN 2 +#define APCLI_MT2_PEER_DEAUTH 3 +#define APCLI_MT2_AUTH_TIMEOUT 4 +#define APCLI_MAX_AUTH_MSG 5 + +#define APCLI_AUTH_FUNC_SIZE (APCLI_MAX_AUTH_STATE * APCLI_MAX_AUTH_MSG) + +//ApCli association state machine +#define APCLI_ASSOC_IDLE 0 +#define APCLI_ASSOC_WAIT_RSP 1 +#define APCLI_MAX_ASSOC_STATE 2 + +#define APCLI_ASSOC_MACHINE_BASE 0 +#define APCLI_MT2_MLME_ASSOC_REQ 0 +#define APCLI_MT2_MLME_DISASSOC_REQ 1 +#define APCLI_MT2_PEER_DISASSOC_REQ 2 +#define APCLI_MT2_PEER_ASSOC_RSP 3 +#define APCLI_MT2_ASSOC_TIMEOUT 4 +#define APCLI_MAX_ASSOC_MSG 5 + +#define APCLI_ASSOC_FUNC_SIZE (APCLI_MAX_ASSOC_STATE * APCLI_MAX_ASSOC_MSG) + +//ApCli sync state machine +#define APCLI_SYNC_IDLE 0 // merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state +#define APCLI_JOIN_WAIT_PROBE_RSP 1 +#define APCLI_MAX_SYNC_STATE 2 + +#define APCLI_SYNC_MACHINE_BASE 0 +#define APCLI_MT2_MLME_PROBE_REQ 0 +#define APCLI_MT2_PEER_PROBE_RSP 1 +#define APCLI_MT2_PROBE_TIMEOUT 2 +#define APCLI_MAX_SYNC_MSG 3 + +#define APCLI_SYNC_FUNC_SIZE (APCLI_MAX_SYNC_STATE * APCLI_MAX_SYNC_MSG) + +//ApCli ctrl state machine +#define APCLI_CTRL_DISCONNECTED 0 // merge NO_BSS,IBSS_IDLE,IBSS_ACTIVE and BSS in to 1 state +#define APCLI_CTRL_PROBE 1 +#define APCLI_CTRL_AUTH 2 +#define APCLI_CTRL_AUTH_2 3 +#define APCLI_CTRL_ASSOC 4 +#define APCLI_CTRL_DEASSOC 5 +#define APCLI_CTRL_CONNECTED 6 +#define APCLI_MAX_CTRL_STATE 7 + +#define APCLI_CTRL_MACHINE_BASE 0 +#define APCLI_CTRL_JOIN_REQ 0 +#define APCLI_CTRL_PROBE_RSP 1 +#define APCLI_CTRL_AUTH_RSP 2 +#define APCLI_CTRL_DISCONNECT_REQ 3 +#define APCLI_CTRL_PEER_DISCONNECT_REQ 4 +#define APCLI_CTRL_ASSOC_RSP 5 +#define APCLI_CTRL_DEASSOC_RSP 6 +#define APCLI_CTRL_JOIN_REQ_TIMEOUT 7 +#define APCLI_CTRL_AUTH_REQ_TIMEOUT 8 +#define APCLI_CTRL_ASSOC_REQ_TIMEOUT 9 +#define APCLI_MAX_CTRL_MSG 10 + +#define APCLI_CTRL_FUNC_SIZE (APCLI_MAX_CTRL_STATE * APCLI_MAX_CTRL_MSG) + + +#endif // APCLI_SUPPORT // + + +// ============================================================================= + +// value domain of 802.11 header FC.Tyte, which is b3..b2 of the 1st-byte of MAC header +#define BTYPE_MGMT 0 +#define BTYPE_CNTL 1 +#define BTYPE_DATA 2 + +// value domain of 802.11 MGMT frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header +#define SUBTYPE_ASSOC_REQ 0 +#define SUBTYPE_ASSOC_RSP 1 +#define SUBTYPE_REASSOC_REQ 2 +#define SUBTYPE_REASSOC_RSP 3 +#define SUBTYPE_PROBE_REQ 4 +#define SUBTYPE_PROBE_RSP 5 +#define SUBTYPE_BEACON 8 +#define SUBTYPE_ATIM 9 +#define SUBTYPE_DISASSOC 10 +#define SUBTYPE_AUTH 11 +#define SUBTYPE_DEAUTH 12 +#define SUBTYPE_ACTION 13 +#define SUBTYPE_ACTION_NO_ACK 14 + +// value domain of 802.11 CNTL frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header +#define SUBTYPE_WRAPPER 7 +#define SUBTYPE_BLOCK_ACK_REQ 8 +#define SUBTYPE_BLOCK_ACK 9 +#define SUBTYPE_PS_POLL 10 +#define SUBTYPE_RTS 11 +#define SUBTYPE_CTS 12 +#define SUBTYPE_ACK 13 +#define SUBTYPE_CFEND 14 +#define SUBTYPE_CFEND_CFACK 15 + +// value domain of 802.11 DATA frame's FC.subtype, which is b7..4 of the 1st-byte of MAC header +#define SUBTYPE_DATA 0 +#define SUBTYPE_DATA_CFACK 1 +#define SUBTYPE_DATA_CFPOLL 2 +#define SUBTYPE_DATA_CFACK_CFPOLL 3 +#define SUBTYPE_NULL_FUNC 4 +#define SUBTYPE_CFACK 5 +#define SUBTYPE_CFPOLL 6 +#define SUBTYPE_CFACK_CFPOLL 7 +#define SUBTYPE_QDATA 8 +#define SUBTYPE_QDATA_CFACK 9 +#define SUBTYPE_QDATA_CFPOLL 10 +#define SUBTYPE_QDATA_CFACK_CFPOLL 11 +#define SUBTYPE_QOS_NULL 12 +#define SUBTYPE_QOS_CFACK 13 +#define SUBTYPE_QOS_CFPOLL 14 +#define SUBTYPE_QOS_CFACK_CFPOLL 15 + +// ACK policy of QOS Control field bit 6:5 +#define NORMAL_ACK 0x00 // b6:5 = 00 +#define NO_ACK 0x20 // b6:5 = 01 +#define NO_EXPLICIT_ACK 0x40 // b6:5 = 10 +#define BLOCK_ACK 0x60 // b6:5 = 11 + +// +// rtmp_data.c use these definition +// +#define LENGTH_802_11 24 +#define LENGTH_802_11_AND_H 30 +#define LENGTH_802_11_CRC_H 34 +#define LENGTH_802_11_CRC 28 +#define LENGTH_802_11_WITH_ADDR4 30 +#define LENGTH_802_3 14 +#define LENGTH_802_3_TYPE 2 +#define LENGTH_802_1_H 8 +#define LENGTH_EAPOL_H 4 +#define LENGTH_WMMQOS_H 2 +#define LENGTH_CRC 4 +#define MAX_SEQ_NUMBER 0x0fff +#define LENGTH_802_3_NO_TYPE 12 +#define LENGTH_802_1Q 4 /* VLAN related */ + +// STA_CSR4.field.TxResult +#define TX_RESULT_SUCCESS 0 +#define TX_RESULT_ZERO_LENGTH 1 +#define TX_RESULT_UNDER_RUN 2 +#define TX_RESULT_OHY_ERROR 4 +#define TX_RESULT_RETRY_FAIL 6 + +// All PHY rate summary in TXD +// Preamble MODE in TxD +#define MODE_CCK 0 +#define MODE_OFDM 1 +#ifdef DOT11_N_SUPPORT +#define MODE_HTMIX 2 +#define MODE_HTGREENFIELD 3 +#endif // DOT11_N_SUPPORT // +// MCS for CCK. BW.SGI.STBC are reserved +#define MCS_LONGP_RATE_1 0 // long preamble CCK 1Mbps +#define MCS_LONGP_RATE_2 1 // long preamble CCK 1Mbps +#define MCS_LONGP_RATE_5_5 2 +#define MCS_LONGP_RATE_11 3 +#define MCS_SHORTP_RATE_1 4 // long preamble CCK 1Mbps. short is forbidden in 1Mbps +#define MCS_SHORTP_RATE_2 5 // short preamble CCK 2Mbps +#define MCS_SHORTP_RATE_5_5 6 +#define MCS_SHORTP_RATE_11 7 +// To send duplicate legacy OFDM. set BW=BW_40. SGI.STBC are reserved +#define MCS_RATE_6 0 // legacy OFDM +#define MCS_RATE_9 1 // OFDM +#define MCS_RATE_12 2 // OFDM +#define MCS_RATE_18 3 // OFDM +#define MCS_RATE_24 4 // OFDM +#define MCS_RATE_36 5 // OFDM +#define MCS_RATE_48 6 // OFDM +#define MCS_RATE_54 7 // OFDM +// HT +#define MCS_0 0 // 1S +#define MCS_1 1 +#define MCS_2 2 +#define MCS_3 3 +#define MCS_4 4 +#define MCS_5 5 +#define MCS_6 6 +#define MCS_7 7 +#define MCS_8 8 // 2S +#define MCS_9 9 +#define MCS_10 10 +#define MCS_11 11 +#define MCS_12 12 +#define MCS_13 13 +#define MCS_14 14 +#define MCS_15 15 +#define MCS_16 16 // 3*3 +#define MCS_17 17 +#define MCS_18 18 +#define MCS_19 19 +#define MCS_20 20 +#define MCS_21 21 +#define MCS_22 22 +#define MCS_23 23 +#define MCS_32 32 +#define MCS_AUTO 33 + +#ifdef DOT11_N_SUPPORT +// OID_HTPHYMODE +// MODE +#define HTMODE_MM 0 +#define HTMODE_GF 1 +#endif // DOT11_N_SUPPORT // + +// Fixed Tx MODE - HT, CCK or OFDM +#define FIXED_TXMODE_HT 0 +#define FIXED_TXMODE_CCK 1 +#define FIXED_TXMODE_OFDM 2 +// BW +#define BW_20 BAND_WIDTH_20 +#define BW_40 BAND_WIDTH_40 +#define BW_BOTH BAND_WIDTH_BOTH +#define BW_10 BAND_WIDTH_10 // 802.11j has 10MHz. This definition is for internal usage. doesn't fill in the IE or other field. + +#ifdef DOT11_N_SUPPORT +// SHORTGI +#define GI_400 GAP_INTERVAL_400 // only support in HT mode +#define GI_BOTH GAP_INTERVAL_BOTH +#endif // DOT11_N_SUPPORT // +#define GI_800 GAP_INTERVAL_800 +// STBC +#define STBC_NONE 0 +#ifdef DOT11_N_SUPPORT +#define STBC_USE 1 // limited use in rt2860b phy +#define RXSTBC_ONE 1 // rx support of one spatial stream +#define RXSTBC_TWO 2 // rx support of 1 and 2 spatial stream +#define RXSTBC_THR 3 // rx support of 1~3 spatial stream +// MCS FEEDBACK +#define MCSFBK_NONE 0 // not support mcs feedback / +#define MCSFBK_RSV 1 // reserved +#define MCSFBK_UNSOLICIT 2 // only support unsolict mcs feedback +#define MCSFBK_MRQ 3 // response to both MRQ and unsolict mcs feedback + +// MIMO power safe +#define MMPS_STATIC 0 +#define MMPS_DYNAMIC 1 +#define MMPS_RSV 2 +#define MMPS_ENABLE 3 + + +// A-MSDU size +#define AMSDU_0 0 +#define AMSDU_1 1 + +#endif // DOT11_N_SUPPORT // + +// MCS use 7 bits +#define TXRATEMIMO 0x80 +#define TXRATEMCS 0x7F +#define TXRATEOFDM 0x7F +#define RATE_1 0 +#define RATE_2 1 +#define RATE_5_5 2 +#define RATE_11 3 +#define RATE_6 4 // OFDM +#define RATE_9 5 // OFDM +#define RATE_12 6 // OFDM +#define RATE_18 7 // OFDM +#define RATE_24 8 // OFDM +#define RATE_36 9 // OFDM +#define RATE_48 10 // OFDM +#define RATE_54 11 // OFDM +#define RATE_FIRST_OFDM_RATE RATE_6 +#define RATE_LAST_OFDM_RATE RATE_54 +#define RATE_6_5 12 // HT mix +#define RATE_13 13 // HT mix +#define RATE_19_5 14 // HT mix +#define RATE_26 15 // HT mix +#define RATE_39 16 // HT mix +#define RATE_52 17 // HT mix +#define RATE_58_5 18 // HT mix +#define RATE_65 19 // HT mix +#define RATE_78 20 // HT mix +#define RATE_104 21 // HT mix +#define RATE_117 22 // HT mix +#define RATE_130 23 // HT mix +//#define RATE_AUTO_SWITCH 255 // for StaCfg.FixedTxRate only +#define HTRATE_0 12 +#define RATE_FIRST_MM_RATE HTRATE_0 +#define RATE_FIRST_HT_RATE HTRATE_0 +#define RATE_LAST_HT_RATE HTRATE_0 + +// pTxWI->txop +#define IFS_HTTXOP 0 // The txop will be handles by ASIC. +#define IFS_PIFS 1 +#define IFS_SIFS 2 +#define IFS_BACKOFF 3 + +// pTxD->RetryMode +#define LONG_RETRY 1 +#define SHORT_RETRY 0 + +// Country Region definition +#define REGION_MINIMUM_BG_BAND 0 +#define REGION_0_BG_BAND 0 // 1-11 +#define REGION_1_BG_BAND 1 // 1-13 +#define REGION_2_BG_BAND 2 // 10-11 +#define REGION_3_BG_BAND 3 // 10-13 +#define REGION_4_BG_BAND 4 // 14 +#define REGION_5_BG_BAND 5 // 1-14 +#define REGION_6_BG_BAND 6 // 3-9 +#define REGION_7_BG_BAND 7 // 5-13 +#define REGION_31_BG_BAND 31 // 5-13 +#define REGION_MAXIMUM_BG_BAND 7 + +#define REGION_MINIMUM_A_BAND 0 +#define REGION_0_A_BAND 0 // 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 +#define REGION_1_A_BAND 1 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 +#define REGION_2_A_BAND 2 // 36, 40, 44, 48, 52, 56, 60, 64 +#define REGION_3_A_BAND 3 // 52, 56, 60, 64, 149, 153, 157, 161 +#define REGION_4_A_BAND 4 // 149, 153, 157, 161, 165 +#define REGION_5_A_BAND 5 // 149, 153, 157, 161 +#define REGION_6_A_BAND 6 // 36, 40, 44, 48 +#define REGION_7_A_BAND 7 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165, 169, 173 +#define REGION_8_A_BAND 8 // 52, 56, 60, 64 +#define REGION_9_A_BAND 9 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 +#define REGION_10_A_BAND 10 // 36, 40, 44, 48, 149, 153, 157, 161, 165 +#define REGION_11_A_BAND 11 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 +#define REGION_12_A_BAND 12 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 +#define REGION_13_A_BAND 13 // 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161 +#define REGION_14_A_BAND 14 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165 +#define REGION_15_A_BAND 15 // 149, 153, 157, 161, 165, 169, 173 +#define REGION_16_A_BAND 16 // 52, 56, 60, 64, 149, 153, 157, 161, 165 +#define REGION_MAXIMUM_A_BAND 16 + +/* The security mode definition in MAC register */ +#define CIPHER_NONE 0 +#define CIPHER_WEP64 1 +#define CIPHER_WEP128 2 +#define CIPHER_TKIP 3 +#define CIPHER_AES 4 +#define CIPHER_CKIP64 5 +#define CIPHER_CKIP128 6 +#define CIPHER_CKIP152 7 +#define CIPHER_SMS4 8 + + +// LED Status. +#define LED_LINK_DOWN 0 +#define LED_LINK_UP 1 +#define LED_RADIO_OFF 2 +#define LED_RADIO_ON 3 +#define LED_HALT 4 +#define LED_WPS 5 +#define LED_ON_SITE_SURVEY 6 +#define LED_POWER_UP 7 +#ifdef RT35xx +#ifdef RALINK_ATE +/* set LED to controll by MAC registers instead of by firmware */ +#define LED_HW_CONTROL 8 +#endif // RALINK_ATE // +#endif // RT35xx // + + +// value domain of pAd->LedCntl.LedMode and E2PROM +#define LED_MODE_DEFAULT 0 +#define LED_MODE_TWO_LED 1 +//#define LED_MODE_SIGNAL_STREGTH 8 // EEPROM define =8 +#define LED_MODE_SIGNAL_STREGTH 0x40 // EEPROM define = 64 + +// RC4 init value, used fro WEP & TKIP +#define PPPINITFCS32 0xffffffff /* Initial FCS value */ + +// value domain of pAd->StaCfg.PortSecured. 802.1X controlled port definition +#define WPA_802_1X_PORT_SECURED 1 +#define WPA_802_1X_PORT_NOT_SECURED 2 + +#define PAIRWISE_KEY 1 +#define GROUP_KEY 2 + +//definition of DRS +#define MAX_STEP_OF_TX_RATE_SWITCH 32 + + +// pre-allocated free NDIS PACKET/BUFFER poll for internal usage +#define MAX_NUM_OF_FREE_NDIS_PACKET 128 + +//Block ACK +#define MAX_TX_REORDERBUF 64 +#define MAX_RX_REORDERBUF 64 +#define DEFAULT_TX_TIMEOUT 30 +#define DEFAULT_RX_TIMEOUT 30 + +// definition of Recipient or Originator +#define I_RECIPIENT TRUE +#define I_ORIGINATOR FALSE + +#define DEFAULT_BBP_TX_POWER 0 +#define DEFAULT_RF_TX_POWER 5 + +#define MAX_INI_BUFFER_SIZE 4096 +#define MAX_PARAM_BUFFER_SIZE (2048) // enough for ACL (18*64) + //18 : the length of Mac address acceptable format "01:02:03:04:05:06;") + //64 : MAX_NUM_OF_ACL_LIST +// definition of pAd->OpMode +#define OPMODE_STA 0 +#define OPMODE_AP 1 +//#define OPMODE_L3_BRG 2 // as AP and STA at the same time + +#ifdef RT_BIG_ENDIAN +#define DIR_READ 0 +#define DIR_WRITE 1 +#define TYPE_TXD 0 +#define TYPE_RXD 1 +#define TYPE_TXINFO 0 +#define TYPE_RXINFO 1 +#define TYPE_TXWI 0 +#define TYPE_RXWI 1 +#endif + +// ========================= AP rtmp_def.h =========================== +// value domain for pAd->EventTab.Log[].Event +#define EVENT_RESET_ACCESS_POINT 0 // Log = "hh:mm:ss Restart Access Point" +#define EVENT_ASSOCIATED 1 // Log = "hh:mm:ss STA 00:01:02:03:04:05 associated" +#define EVENT_DISASSOCIATED 2 // Log = "hh:mm:ss STA 00:01:02:03:04:05 left this BSS" +#define EVENT_AGED_OUT 3 // Log = "hh:mm:ss STA 00:01:02:03:04:05 was aged-out and removed from this BSS" +#define EVENT_COUNTER_M 4 +#define EVENT_INVALID_PSK 5 +#define EVENT_MAX_EVENT_TYPE 6 +// ==== end of AP rtmp_def.h ============ + +// definition RSSI Number +#define RSSI_0 0 +#define RSSI_1 1 +#define RSSI_2 2 + +// definition of radar detection +#define RD_NORMAL_MODE 0 // Not found radar signal +#define RD_SWITCHING_MODE 1 // Found radar signal, and doing channel switch +#define RD_SILENCE_MODE 2 // After channel switch, need to be silence a while to ensure radar not found + +//Driver defined cid for mapping status and command. +#define SLEEPCID 0x11 +#define WAKECID 0x22 +#define QUERYPOWERCID 0x33 +#define OWNERMCU 0x1 +#define OWNERCPU 0x0 + +// MBSSID definition +#define ENTRY_NOT_FOUND 0xFF + + +/* After Linux 2.6.9, + * VLAN module use Private (from user) interface flags (netdevice->priv_flags). + * #define IFF_802_1Q_VLAN 0x1 -- 802.1Q VLAN device. in if.h + * ref to ip_sabotage_out() [ out->priv_flags & IFF_802_1Q_VLAN ] in br_netfilter.c + * + * For this reason, we MUST use EVEN value in priv_flags + */ +#define INT_MAIN 0x0100 +#define INT_MBSSID 0x0200 +#define INT_WDS 0x0300 +#define INT_APCLI 0x0400 +#define INT_MESH 0x0500 + +#define ENTRY_NONE 0 +#define ENTRY_CLIENT 1 +#define ENTRY_WDS 2 +#define ENTRY_APCLI 3 +#define ENTRY_MESH 4 +#define ENTRY_DLS 5 +#define ENTRY_TDLS 6 + +#define IS_ENTRY_NONE(_x) ((_x)->EntryType == ENTRY_NONE) +#define IS_ENTRY_CLIENT(_x) ((_x)->EntryType == ENTRY_CLIENT) +#define IS_ENTRY_WDS(_x) ((_x)->EntryType == ENTRY_WDS) +#define IS_ENTRY_APCLI(_x) ((_x)->EntryType == ENTRY_APCLI) +#define IS_ENTRY_MESH(_x) ((_x)->EntryType == ENTRY_MESH) +#define IS_ENTRY_DLS(_x) ((_x)->EntryType == ENTRY_DLS) +#define IS_ENTRY_TDLS(_x) ((_x)->EntryType == ENTRY_TDLS) +#ifdef CLIENT_WDS +#define IS_ENTRY_CLIWDS(_x) CLIENT_STATUS_TEST_FLAG((_x), fCLIENT_STATUS_CLI_WDS) +#endif // CLIENT_WDS // + +#define SET_ENTRY_NONE(_x) ((_x)->EntryType = ENTRY_NONE) +#define SET_ENTRY_CLIENT(_x) ((_x)->EntryType = ENTRY_CLIENT) +#define SET_ENTRY_WDS(_x) ((_x)->EntryType = ENTRY_WDS) +#define SET_ENTRY_APCLI(_x) ((_x)->EntryType = ENTRY_APCLI) +#define SET_ENTRY_MESH(_x) ((_x)->EntryType = ENTRY_MESH) +#define SET_ENTRY_DLS(_x) ((_x)->EntryType = ENTRY_DLS) +#define SET_ENTRY_TDLS(_x) ((_x)->EntryType = ENTRY_TDLS) +#ifdef CLIENT_WDS +#define SET_ENTRY_CLIWDS(_x) CLIENT_STATUS_SET_FLAG((_x), fCLIENT_STATUS_CLI_WDS) +#endif // CLIENT_WDS // + +#define INF_MAIN_DEV_NAME "ra" +#define INF_MBSSID_DEV_NAME "ra" +#define INF_WDS_DEV_NAME "wds" +#define INF_APCLI_DEV_NAME "apcli" +#define INF_MESH_DEV_NAME "mesh" + +#ifdef RALINK_ATE +/* + Use bitmap to allow coexist of ATE_TXFRAME + and ATE_RXFRAME(i.e.,to support LoopBack mode). +*/ +#define fATE_IDLE 0x00 +#define fATE_TX_ENABLE 0x01 +#define fATE_RX_ENABLE 0x02 +#define fATE_TXCONT_ENABLE 0x04 +#define fATE_TXCARR_ENABLE 0x08 +#define fATE_TXCARRSUPP_ENABLE 0x10 +#define fATE_RESERVED_1 0x20 +#define fATE_RESERVED_2 0x40 +#define fATE_EXIT 0x80 + +/* Enter/Reset ATE */ +#define ATE_START (fATE_IDLE) +/* Stop/Exit ATE */ +#define ATE_STOP (fATE_EXIT) +/* Continuous Transmit */ +#define ATE_TXCONT ((fATE_TX_ENABLE)|(fATE_TXCONT_ENABLE)) +/* Transmit Carrier */ +#define ATE_TXCARR ((fATE_TX_ENABLE)|(fATE_TXCARR_ENABLE)) +/* Transmit Carrier Suppression (information without carrier) */ +#define ATE_TXCARRSUPP ((fATE_TX_ENABLE)|(fATE_TXCARRSUPP_ENABLE)) +/* Transmit Frames */ +#define ATE_TXFRAME (fATE_TX_ENABLE) +/* Receive Frames */ +#define ATE_RXFRAME (fATE_RX_ENABLE) +#ifdef RALINK_28xx_QA +/* Stop Transmition */ +#define ATE_TXSTOP ((~(fATE_TX_ENABLE))&(~(fATE_TXCONT_ENABLE))&(~(fATE_TXCARR_ENABLE))&(~(fATE_TXCARRSUPP_ENABLE))) +/* Stop receiving Frames */ +#define ATE_RXSTOP (~(fATE_RX_ENABLE)) + +/* NOTE : may be different with chipset in the future ++ */ +#define BBP22_TXFRAME 0x00 /* Transmit Frames */ +#define BBP22_TXCONT_OR_CARRSUPP 0x80 /* Continuous Transmit or Carrier Suppression */ +#define BBP22_TXCARR 0xc1 /* Transmit Carrier */ +#define BBP24_TXCONT 0x00 /* Continuous Transmit */ +#define BBP24_CARRSUPP 0x01 /* Carrier Suppression */ +/* NOTE : may be different with chipset in the future -- */ +#endif // RALINK_28xx_QA // +#endif // RALINK_ATE // + +// WEP Key TYPE +#define WEP_HEXADECIMAL_TYPE 0 +#define WEP_ASCII_TYPE 1 + + + +// WIRELESS EVENTS definition +/* Max number of char in custom event, refer to wireless_tools.28/wireless.20.h */ +#define IW_CUSTOM_MAX_LEN 255 /* In bytes */ + +// For system event - start +#define IW_SYS_EVENT_FLAG_START 0x0200 +#define IW_ASSOC_EVENT_FLAG 0x0200 +#define IW_DISASSOC_EVENT_FLAG 0x0201 +#define IW_DEAUTH_EVENT_FLAG 0x0202 +#define IW_AGEOUT_EVENT_FLAG 0x0203 +#define IW_COUNTER_MEASURES_EVENT_FLAG 0x0204 +#define IW_REPLAY_COUNTER_DIFF_EVENT_FLAG 0x0205 +#define IW_RSNIE_DIFF_EVENT_FLAG 0x0206 +#define IW_MIC_DIFF_EVENT_FLAG 0x0207 +#define IW_ICV_ERROR_EVENT_FLAG 0x0208 +#define IW_MIC_ERROR_EVENT_FLAG 0x0209 +#define IW_GROUP_HS_TIMEOUT_EVENT_FLAG 0x020A +#define IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG 0x020B +#define IW_RSNIE_SANITY_FAIL_EVENT_FLAG 0x020C +#define IW_SET_KEY_DONE_WPA1_EVENT_FLAG 0x020D +#define IW_SET_KEY_DONE_WPA2_EVENT_FLAG 0x020E +#define IW_STA_LINKUP_EVENT_FLAG 0x020F +#define IW_STA_LINKDOWN_EVENT_FLAG 0x0210 +#define IW_SCAN_COMPLETED_EVENT_FLAG 0x0211 +#define IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG 0x0212 +#define IW_CHANNEL_CHANGE_EVENT_FLAG 0x0213 +#define IW_STA_MODE_EVENT_FLAG 0x0214 +#define IW_MAC_FILTER_LIST_EVENT_FLAG 0x0215 +#define IW_AUTH_REJECT_CHALLENGE_FAILURE 0x0216 +#define IW_SCANNING_EVENT_FLAG 0x0217 +#define IW_START_IBSS_FLAG 0x0218 +#define IW_JOIN_IBSS_FLAG 0x0219 +// if add new system event flag, please upadte the IW_SYS_EVENT_FLAG_END +#define IW_SYS_EVENT_FLAG_END 0x0219 +#define IW_SYS_EVENT_TYPE_NUM (IW_SYS_EVENT_FLAG_END - IW_SYS_EVENT_FLAG_START + 1) +// For system event - end + +#ifdef IDS_SUPPORT +// For spoof attack event - start +#define IW_SPOOF_EVENT_FLAG_START 0x0300 +#define IW_CONFLICT_SSID_EVENT_FLAG 0x0300 +#define IW_SPOOF_ASSOC_RESP_EVENT_FLAG 0x0301 +#define IW_SPOOF_REASSOC_RESP_EVENT_FLAG 0x0302 +#define IW_SPOOF_PROBE_RESP_EVENT_FLAG 0x0303 +#define IW_SPOOF_BEACON_EVENT_FLAG 0x0304 +#define IW_SPOOF_DISASSOC_EVENT_FLAG 0x0305 +#define IW_SPOOF_AUTH_EVENT_FLAG 0x0306 +#define IW_SPOOF_DEAUTH_EVENT_FLAG 0x0307 +#define IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG 0x0308 +#define IW_REPLAY_ATTACK_EVENT_FLAG 0x0309 +// if add new spoof attack event flag, please upadte the IW_SPOOF_EVENT_FLAG_END +#define IW_SPOOF_EVENT_FLAG_END 0x0309 +#define IW_SPOOF_EVENT_TYPE_NUM (IW_SPOOF_EVENT_FLAG_END - IW_SPOOF_EVENT_FLAG_START + 1) +// For spoof attack event - end + +// For flooding attack event - start +#define IW_FLOOD_EVENT_FLAG_START 0x0400 +#define IW_FLOOD_AUTH_EVENT_FLAG 0x0400 +#define IW_FLOOD_ASSOC_REQ_EVENT_FLAG 0x0401 +#define IW_FLOOD_REASSOC_REQ_EVENT_FLAG 0x0402 +#define IW_FLOOD_PROBE_REQ_EVENT_FLAG 0x0403 +#define IW_FLOOD_DISASSOC_EVENT_FLAG 0x0404 +#define IW_FLOOD_DEAUTH_EVENT_FLAG 0x0405 +#define IW_FLOOD_EAP_REQ_EVENT_FLAG 0x0406 +// if add new flooding attack event flag, please upadte the IW_FLOOD_EVENT_FLAG_END +#define IW_FLOOD_EVENT_FLAG_END 0x0406 +#define IW_FLOOD_EVENT_TYPE_NUM (IW_FLOOD_EVENT_FLAG_END - IW_FLOOD_EVENT_FLAG_START + 1) +// For flooding attack - end +#endif // IDS_SUPPORT // + +// End - WIRELESS EVENTS definition + +#ifdef CONFIG_STA_SUPPORT +// definition for DLS, kathy +#define MAX_NUM_OF_INIT_DLS_ENTRY 1 +#define MAX_NUM_OF_DLS_ENTRY MAX_NUMBER_OF_DLS_ENTRY + +//Block ACK, kathy +#define MAX_TX_REORDERBUF 64 +#define MAX_RX_REORDERBUF 64 +#define DEFAULT_TX_TIMEOUT 30 +#define DEFAULT_RX_TIMEOUT 30 +#define MAX_BARECI_SESSION 8 + +#ifndef IW_ESSID_MAX_SIZE +/* Maximum size of the ESSID and pAd->nickname strings */ +#define IW_ESSID_MAX_SIZE 32 +#endif +#endif // CONFIG_STA_SUPPORT // + +#ifdef MCAST_RATE_SPECIFIC +#define MCAST_DISABLE 0 +#define MCAST_CCK 1 +#define MCAST_OFDM 2 +#define MCAST_HTMIX 3 +#endif // MCAST_RATE_SPECIFIC // + +// For AsicRadioOff/AsicRadioOn function +#define DOT11POWERSAVE 0 +#define GUIRADIO_OFF 1 +#define RTMP_HALT 2 +#define GUI_IDLE_POWER_SAVE 3 +// -- + + +// definition for WpaSupport flag +#define WPA_SUPPLICANT_DISABLE 0x00 +#define WPA_SUPPLICANT_ENABLE 0x01 +#define WPA_SUPPLICANT_ENABLE_WITH_WEB_UI 0x02 +#define WPA_SUPPLICANT_ENABLE_WPS 0x80 + +// definition for Antenna Diversity flag + + +// Endian byte swapping codes +#define SWAP16(x) \ + ((UINT16)( \ + (((UINT16)(x) & (UINT16) 0x00ffU) << 8) | \ + (((UINT16)(x) & (UINT16) 0xff00U) >> 8) )) + +#define SWAP32(x) \ + ((UINT32)( \ + (((UINT32)(x) & (UINT32) 0x000000ffUL) << 24) | \ + (((UINT32)(x) & (UINT32) 0x0000ff00UL) << 8) | \ + (((UINT32)(x) & (UINT32) 0x00ff0000UL) >> 8) | \ + (((UINT32)(x) & (UINT32) 0xff000000UL) >> 24) )) + +#define SWAP64(x) \ + ((UINT64)( \ + (UINT64)(((UINT64)(x) & (UINT64) 0x00000000000000ffULL) << 56) | \ + (UINT64)(((UINT64)(x) & (UINT64) 0x000000000000ff00ULL) << 40) | \ + (UINT64)(((UINT64)(x) & (UINT64) 0x0000000000ff0000ULL) << 24) | \ + (UINT64)(((UINT64)(x) & (UINT64) 0x00000000ff000000ULL) << 8) | \ + (UINT64)(((UINT64)(x) & (UINT64) 0x000000ff00000000ULL) >> 8) | \ + (UINT64)(((UINT64)(x) & (UINT64) 0x0000ff0000000000ULL) >> 24) | \ + (UINT64)(((UINT64)(x) & (UINT64) 0x00ff000000000000ULL) >> 40) | \ + (UINT64)(((UINT64)(x) & (UINT64) 0xff00000000000000ULL) >> 56) )) + +#ifdef RT_BIG_ENDIAN + +#define cpu2le64(x) SWAP64((x)) +#define le2cpu64(x) SWAP64((x)) +#define cpu2le32(x) SWAP32((x)) +#define le2cpu32(x) SWAP32((x)) +#define cpu2le16(x) SWAP16((x)) +#define le2cpu16(x) SWAP16((x)) +#define cpu2be64(x) ((UINT64)(x)) +#define be2cpu64(x) ((UINT64)(x)) +#define cpu2be32(x) ((UINT32)(x)) +#define be2cpu32(x) ((UINT32)(x)) +#define cpu2be16(x) ((UINT16)(x)) +#define be2cpu16(x) ((UINT16)(x)) + +#else // Little_Endian + +#define cpu2le64(x) ((UINT64)(x)) +#define le2cpu64(x) ((UINT64)(x)) +#define cpu2le32(x) ((UINT32)(x)) +#define le2cpu32(x) ((UINT32)(x)) +#define cpu2le16(x) ((UINT16)(x)) +#define le2cpu16(x) ((UINT16)(x)) +#define cpu2be64(x) SWAP64((x)) +#define be2cpu64(x) SWAP64((x)) +#define cpu2be32(x) SWAP32((x)) +#define be2cpu32(x) SWAP32((x)) +#define cpu2be16(x) SWAP16((x)) +#define be2cpu16(x) SWAP16((x)) + +#endif // RT_BIG_ENDIAN + +#define ABS(_x, _y) ((_x) > (_y)) ? ((_x) -(_y)) : ((_y) -(_x)) + + +#define A2Dec(_X, _p) \ +{ \ + UCHAR *p; \ + _X = 0; \ + p = _p; \ + while (((*p >= '0') && (*p <= '9'))) \ + { \ + if ((*p >= '0') && (*p <= '9')) \ + _X = _X * 10 + *p - 48; \ + p++; \ + } \ +} + + +#define A2Hex(_X, _p) \ +do{ \ + char *__p; \ + (_X) = 0; \ + __p = (char *)(_p); \ + while (((*__p >= 'a') && (*__p <= 'f')) || ((*__p >= 'A') && (*__p <= 'F')) || ((*__p >= '0') && (*__p <= '9'))) \ + { \ + if ((*__p >= 'a') && (*__p <= 'f')) \ + (_X) = (_X) * 16 + *__p - 87; \ + else if ((*__p >= 'A') && (*__p <= 'F')) \ + (_X) = (_X) * 16 + *__p - 55; \ + else if ((*__p >= '0') && (*__p <= '9')) \ + (_X) = (_X) * 16 + *__p - 48; \ + __p++; \ + } \ +}while(0) + +#endif // __RTMP_DEF_H__ + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_dot11.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_dot11.h new file mode 100644 index 000000000..1a840741b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_dot11.h @@ -0,0 +1,146 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* +*/ + +#ifndef __DOT11_BASE_H__ +#define __DOT11_BASE_H__ + +#include "rtmp_type.h" + + +// 4-byte HTC field. maybe included in any frame except non-QOS data frame. The Order bit must set 1. +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + UINT32 RDG:1; //RDG / More PPDU + UINT32 ACConstraint:1; //feedback request + UINT32 rsv2:5; //calibration sequence + UINT32 NDPAnnouce:1; // ZLF announcement + UINT32 CSISTEERING:2; //CSI/ STEERING + UINT32 rsv1:2; // Reserved + UINT32 CalSeq:2; //calibration sequence + UINT32 CalPos:2; // calibration position + UINT32 MFBorASC:7; //Link adaptation feedback containing recommended MCS. 0x7f for no feedback or not available + UINT32 MFSI:3; //SET to the received value of MRS. 0x111 for unsolicited MFB. + UINT32 MSI:3; //MCS Request, MRQ Sequence identifier + UINT32 MRQ:1; //MCS feedback. Request for a MCS feedback + UINT32 TRQ:1; //sounding request + UINT32 rsv:1; // Reserved +#else + UINT32 rsv:1; // Reserved + UINT32 TRQ:1; //sounding request + UINT32 MRQ:1; //MCS feedback. Request for a MCS feedback + UINT32 MSI:3; //MCS Request, MRQ Sequence identifier + UINT32 MFSI:3; //SET to the received value of MRS. 0x111 for unsolicited MFB. + UINT32 MFBorASC:7; //Link adaptation feedback containing recommended MCS. 0x7f for no feedback or not available + UINT32 CalPos:2; // calibration position + UINT32 CalSeq:2; //calibration sequence + UINT32 rsv1:2; // Reserved + UINT32 CSISTEERING:2; //CSI/ STEERING + UINT32 NDPAnnouce:1; // ZLF announcement + UINT32 rsv2:5; //calibration sequence + UINT32 ACConstraint:1; //feedback request + UINT32 RDG:1; //RDG / More PPDU +#endif /* !RT_BIG_ENDIAN */ +} HT_CONTROL, *PHT_CONTROL; + +// 2-byte QOS CONTROL field +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT Txop_QueueSize:8; + USHORT AMsduPresent:1; + USHORT AckPolicy:2; //0: normal ACK 1:No ACK 2:scheduled under MTBA/PSMP 3: BA + USHORT EOSP:1; + USHORT TID:4; +#else + USHORT TID:4; + USHORT EOSP:1; + USHORT AckPolicy:2; //0: normal ACK 1:No ACK 2:scheduled under MTBA/PSMP 3: BA + USHORT AMsduPresent:1; + USHORT Txop_QueueSize:8; +#endif /* !RT_BIG_ENDIAN */ +} QOS_CONTROL, *PQOS_CONTROL; + + +// 2-byte Frame control field +typedef struct GNU_PACKED { +#ifdef RT_BIG_ENDIAN + USHORT Order:1; // Strict order expected + USHORT Wep:1; // Wep data + USHORT MoreData:1; // More data bit + USHORT PwrMgmt:1; // Power management bit + USHORT Retry:1; // Retry status bit + USHORT MoreFrag:1; // More fragment bit + USHORT FrDs:1; // From DS indication + USHORT ToDs:1; // To DS indication + USHORT SubType:4; // MSDU subtype + USHORT Type:2; // MSDU type + USHORT Ver:2; // Protocol version +#else + USHORT Ver:2; // Protocol version + USHORT Type:2; // MSDU type + USHORT SubType:4; // MSDU subtype + USHORT ToDs:1; // To DS indication + USHORT FrDs:1; // From DS indication + USHORT MoreFrag:1; // More fragment bit + USHORT Retry:1; // Retry status bit + USHORT PwrMgmt:1; // Power management bit + USHORT MoreData:1; // More data bit + USHORT Wep:1; // Wep data + USHORT Order:1; // Strict order expected +#endif /* !RT_BIG_ENDIAN */ +} FRAME_CONTROL, *PFRAME_CONTROL; + +typedef struct GNU_PACKED _HEADER_802_11 { + FRAME_CONTROL FC; + USHORT Duration; + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; + UCHAR Addr3[MAC_ADDR_LEN]; +#ifdef RT_BIG_ENDIAN + USHORT Sequence:12; + USHORT Frag:4; +#else + USHORT Frag:4; + USHORT Sequence:12; +#endif /* !RT_BIG_ENDIAN */ + UCHAR Octet[0]; +} HEADER_802_11, *PHEADER_802_11; + +typedef struct GNU_PACKED _PSPOLL_FRAME { + FRAME_CONTROL FC; + USHORT Aid; + UCHAR Bssid[MAC_ADDR_LEN]; + UCHAR Ta[MAC_ADDR_LEN]; +} PSPOLL_FRAME, *PPSPOLL_FRAME; + +typedef struct GNU_PACKED _RTS_FRAME { + FRAME_CONTROL FC; + USHORT Duration; + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; +}RTS_FRAME, *PRTS_FRAME; + +#endif // __DOT11_BASE_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_iface.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_iface.h new file mode 100644 index 000000000..cbf0f2791 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_iface.h @@ -0,0 +1,85 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt_iface.h + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + +#ifndef __RTMP_IFACE_H__ +#define __RTMP_IFACE_H__ + + +#ifdef RTMP_PCI_SUPPORT +#include "iface/rtmp_pci.h" +#endif // RTMP_PCI_SUPPORT // + + + + +typedef struct _INF_PCI_CONFIG_ +{ + unsigned long CSRBaseAddress; // PCI MMIO Base Address, all access will use + unsigned int irq_num; +}INF_PCI_CONFIG; + + +typedef struct _INF_USB_CONFIG_ +{ + unsigned char BulkInEpAddr; // bulk-in endpoint address + unsigned char BulkOutEpAddr[6]; // bulk-out endpoint address +}INF_USB_CONFIG; + + +typedef struct _INF_RBUS_CONFIG_ +{ + unsigned long csr_addr; + unsigned int irq; +}INF_RBUS_CONFIG; + + +typedef enum _RTMP_INF_TYPE_ +{ + RTMP_DEV_INF_UNKNOWN = 0, + RTMP_DEV_INF_PCI = 1, + RTMP_DEV_INF_USB = 2, + RTMP_DEV_INF_RBUS = 4, + RTMP_DEV_INF_PCIE = 5, +}RTMP_INF_TYPE; + + +typedef union _RTMP_INF_CONFIG_{ + struct _INF_PCI_CONFIG_ pciConfig; + struct _INF_USB_CONFIG_ usbConfig; + struct _INF_RBUS_CONFIG_ rbusConfig; +}RTMP_INF_CONFIG; + +#endif // __RTMP_IFACE_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_mcu.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_mcu.h new file mode 100644 index 000000000..2f399df9d --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_mcu.h @@ -0,0 +1,55 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_mcu.h + + Abstract: + Miniport header file for mcu related information + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#ifndef __RTMP_MCU_H__ +#define __RTMP_MCU_H__ + + +INT RtmpAsicEraseFirmware( + IN PRTMP_ADAPTER pAd); + +NDIS_STATUS RtmpAsicLoadFirmware( + IN PRTMP_ADAPTER pAd); + +INT RtmpAsicSendCommandToMcu( + IN PRTMP_ADAPTER pAd, + IN UCHAR Command, + IN UCHAR Token, + IN UCHAR Arg0, + IN UCHAR Arg1); + +#endif // __RTMP_MCU_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_os.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_os.h new file mode 100644 index 000000000..dd4f629cc --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_os.h @@ -0,0 +1,104 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_os.h + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + + +#ifndef __RTMP_OS_H__ +#define __RTMP_OS_H__ + +#ifdef LINUX +#include "os/rt_linux.h" +#endif // LINUX // + + + +/* + This data structure mainly strip some callback function defined in + "struct net_device" in kernel source "include/linux/netdevice.h". + + The definition of this data structure may various depends on different + OS. Use it carefully. +*/ +typedef struct _RTMP_OS_NETDEV_OP_HOOK_ +{ + void *open; + void *stop; + void *xmit; + void *ioctl; + void *get_stats; + void *priv; + void *get_wstats; + void *iw_handler; + int priv_flags; + unsigned char devAddr[6]; + unsigned char devName[16]; + unsigned char needProtcted; +}RTMP_OS_NETDEV_OP_HOOK, *PRTMP_OS_NETDEV_OP_HOOK; + + +typedef enum _RTMP_TASK_STATUS_ +{ + RTMP_TASK_STAT_UNKNOWN = 0, + RTMP_TASK_STAT_INITED = 1, + RTMP_TASK_STAT_RUNNING = 2, + RTMP_TASK_STAT_STOPED = 4, +}RTMP_TASK_STATUS; +#define RTMP_TASK_CAN_DO_INSERT (RTMP_TASK_STAT_INITED |RTMP_TASK_STAT_RUNNING) + +#define RTMP_OS_TASK_NAME_LEN 16 +typedef struct _RTMP_OS_TASK_ +{ + char taskName[RTMP_OS_TASK_NAME_LEN]; + void *priv; + //unsigned long taskFlags; + RTMP_TASK_STATUS taskStatus; +#ifndef KTHREAD_SUPPORT + RTMP_OS_SEM taskSema; + RTMP_OS_PID taskPID; + struct completion taskComplete; +#endif + unsigned char task_killed; +#ifdef KTHREAD_SUPPORT + struct task_struct *kthread_task; + wait_queue_head_t kthread_q; + BOOLEAN kthread_running; +#endif +}RTMP_OS_TASK; + + +int RtmpOSIRQRequest(IN PNET_DEV pNetDev); +int RtmpOSIRQRelease(IN PNET_DEV pNetDev); + +#endif // __RMTP_OS_H__ // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_timer.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_timer.h new file mode 100644 index 000000000..d07caae38 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_timer.h @@ -0,0 +1,165 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_timer.h + + Abstract: + Ralink Wireless Driver timer related data structures and delcarations + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs + Shiang Tu Aug-28-2008 init version + +*/ + +#ifndef __RTMP_TIMER_H__ +#define __RTMP_TIMER_H__ + +#include "rtmp_os.h" + + +#define DECLARE_TIMER_FUNCTION(_func) \ + void rtmp_timer_##_func(unsigned long data) + +#define GET_TIMER_FUNCTION(_func) \ + (PVOID)rtmp_timer_##_func + + +/* ----------------- Timer Related MARCO ---------------*/ +// In some os or chipset, we have a lot of timer functions and will read/write register, +// it's not allowed in Linux USB sub-system to do it ( because of sleep issue when +// submit to ctrl pipe). So we need a wrapper function to take care it. + +#ifdef RTMP_TIMER_TASK_SUPPORT +typedef VOID (*RTMP_TIMER_TASK_HANDLE)( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3); +#endif // RTMP_TIMER_TASK_SUPPORT // + +typedef struct _RALINK_TIMER_STRUCT { + RTMP_OS_TIMER TimerObj; // Ndis Timer object + BOOLEAN Valid; // Set to True when call RTMPInitTimer + BOOLEAN State; // True if timer cancelled + BOOLEAN PeriodicType; // True if timer is periodic timer + BOOLEAN Repeat; // True if periodic timer + ULONG TimerValue; // Timer value in milliseconds + ULONG cookie; // os specific object + void *pAd; +#ifdef RTMP_TIMER_TASK_SUPPORT + RTMP_TIMER_TASK_HANDLE handle; +#endif // RTMP_TIMER_TASK_SUPPORT // +}RALINK_TIMER_STRUCT, *PRALINK_TIMER_STRUCT; + + +#ifdef RTMP_TIMER_TASK_SUPPORT +typedef struct _RTMP_TIMER_TASK_ENTRY_ +{ + RALINK_TIMER_STRUCT *pRaTimer; + struct _RTMP_TIMER_TASK_ENTRY_ *pNext; +}RTMP_TIMER_TASK_ENTRY; + + +#define TIMER_QUEUE_SIZE_MAX 128 +typedef struct _RTMP_TIMER_TASK_QUEUE_ +{ + unsigned int status; + unsigned char *pTimerQPoll; + RTMP_TIMER_TASK_ENTRY *pQPollFreeList; + RTMP_TIMER_TASK_ENTRY *pQHead; + RTMP_TIMER_TASK_ENTRY *pQTail; +}RTMP_TIMER_TASK_QUEUE; + +#define BUILD_TIMER_FUNCTION(_func) \ +void rtmp_timer_##_func(unsigned long data) \ +{ \ + PRALINK_TIMER_STRUCT _pTimer = (PRALINK_TIMER_STRUCT)data; \ + RTMP_TIMER_TASK_ENTRY *_pQNode; \ + RTMP_ADAPTER *_pAd; \ + \ + _pTimer->handle = _func; \ + _pAd = (RTMP_ADAPTER *)_pTimer->pAd; \ + _pQNode = RtmpTimerQInsert(_pAd, _pTimer); \ + if ((_pQNode == NULL) && (_pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT)) \ + RTMP_OS_Add_Timer(&_pTimer->TimerObj, OS_HZ); \ +} +#else +#define BUILD_TIMER_FUNCTION(_func) \ +void rtmp_timer_##_func(unsigned long data) \ +{ \ + PRALINK_TIMER_STRUCT pTimer = (PRALINK_TIMER_STRUCT) data; \ + \ + _func(NULL, (PVOID) pTimer->cookie, NULL, pTimer); \ + if (pTimer->Repeat) \ + RTMP_OS_Add_Timer(&pTimer->TimerObj, pTimer->TimerValue); \ +} +#endif // RTMP_TIMER_TASK_SUPPORT // + + +DECLARE_TIMER_FUNCTION(MlmePeriodicExec); +DECLARE_TIMER_FUNCTION(MlmeRssiReportExec); +DECLARE_TIMER_FUNCTION(AsicRxAntEvalTimeout); +DECLARE_TIMER_FUNCTION(APSDPeriodicExec); +DECLARE_TIMER_FUNCTION(AsicRfTuningExec); + +#ifdef CONFIG_STA_SUPPORT +DECLARE_TIMER_FUNCTION(BeaconTimeout); +DECLARE_TIMER_FUNCTION(ScanTimeout); +DECLARE_TIMER_FUNCTION(AuthTimeout); +DECLARE_TIMER_FUNCTION(AssocTimeout); +DECLARE_TIMER_FUNCTION(ReassocTimeout); +DECLARE_TIMER_FUNCTION(DisassocTimeout); +DECLARE_TIMER_FUNCTION(LinkDownExec); +DECLARE_TIMER_FUNCTION(StaQuickResponeForRateUpExec); +DECLARE_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc); + +#ifdef RTMP_PCI_SUPPORT +DECLARE_TIMER_FUNCTION(PsPollWakeExec); +DECLARE_TIMER_FUNCTION(RadioOnExec); +#endif // RTMP_PCI_SUPPORT // +#ifdef QOS_DLS_SUPPORT +DECLARE_TIMER_FUNCTION(DlsTimeoutAction); +#endif // QOS_DLS_SUPPORT // + + + + +#endif // CONFIG_STA_SUPPORT // + + + + +#if defined(AP_LED) || defined(STA_LED) +DECLARE_TIMER_FUNCTION(LedCtrlMain); +#endif + + +#endif // __RTMP_TIMER_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_type.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_type.h new file mode 100644 index 000000000..e31931b57 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/rtmp_type.h @@ -0,0 +1,167 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_type.h + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs + Paul Lin 1-2-2004 +*/ + +#ifndef __RTMP_TYPE_H__ +#define __RTMP_TYPE_H__ + + + +#ifndef GNU_PACKED +#define GNU_PACKED __attribute__ ((packed)) +#endif // GNU_PACKED // + +#ifdef LINUX +// Put platform dependent declaration here +// For example, linux type definition +typedef unsigned char UINT8; +typedef unsigned short UINT16; +typedef unsigned int UINT32; +typedef unsigned long long UINT64; +typedef int INT32; +typedef long long INT64; + +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned int UINT; +typedef unsigned long ULONG; +#endif // LINUX // + +typedef unsigned char * PUINT8; +typedef unsigned short * PUINT16; +typedef unsigned int * PUINT32; +typedef unsigned long long * PUINT64; +typedef int * PINT32; +typedef long long * PINT64; + +// modified for fixing compile warning on Sigma 8634 platform +typedef char STRING; + +typedef signed char CHAR; + +typedef signed short SHORT; +typedef signed int INT; +typedef signed long LONG; +typedef signed long long LONGLONG; + +typedef unsigned long long ULONGLONG; + +typedef unsigned char BOOLEAN; +#ifdef LINUX +typedef void VOID; +#endif // LINUX // + +typedef char * PSTRING; +typedef VOID * PVOID; +typedef CHAR * PCHAR; +typedef UCHAR * PUCHAR; +typedef USHORT * PUSHORT; +typedef LONG * PLONG; +typedef ULONG * PULONG; +typedef UINT * PUINT; + +typedef unsigned int NDIS_MEDIA_STATE; + +typedef union _LARGE_INTEGER { + struct { +#ifdef RT_BIG_ENDIAN + INT32 HighPart; + UINT LowPart; +#else + UINT LowPart; + INT32 HighPart; +#endif + } u; + INT64 QuadPart; +} LARGE_INTEGER; + + +// +// Register set pair for initialzation register set definition +// +typedef struct _RTMP_REG_PAIR +{ + ULONG Register; + ULONG Value; +} RTMP_REG_PAIR, *PRTMP_REG_PAIR; + +typedef struct _REG_PAIR +{ + UCHAR Register; + UCHAR Value; +} REG_PAIR, *PREG_PAIR; + +// +// Register set pair for initialzation register set definition +// +typedef struct _RTMP_RF_REGS +{ + UCHAR Channel; + ULONG R1; + ULONG R2; + ULONG R3; + ULONG R4; +} RTMP_RF_REGS, *PRTMP_RF_REGS; + +typedef struct _FREQUENCY_ITEM { + UCHAR Channel; + UCHAR N; + UCHAR R; + UCHAR K; +} FREQUENCY_ITEM, *PFREQUENCY_ITEM; + + +typedef int NTSTATUS; + + +#define STATUS_SUCCESS 0x00 +#define STATUS_UNSUCCESSFUL 0x01 + +typedef struct _QUEUE_ENTRY { + struct _QUEUE_ENTRY *Next; +} QUEUE_ENTRY, *PQUEUE_ENTRY; + +// Queue structure +typedef struct _QUEUE_HEADER { + PQUEUE_ENTRY Head; + PQUEUE_ENTRY Tail; + ULONG Number; +} QUEUE_HEADER, *PQUEUE_HEADER; + + +#endif // __RTMP_TYPE_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/spectrum.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/spectrum.h new file mode 100644 index 000000000..f140aae5c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/spectrum.h @@ -0,0 +1,239 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + +#ifndef __SPECTRUM_H__ +#define __SPECTRUM_H__ + +#include "rtmp_type.h" +#include "spectrum_def.h" + + +UINT8 GetRegulatoryMaxTxPwr( + IN PRTMP_ADAPTER pAd, + IN UINT8 channel); + +CHAR RTMP_GetTxPwr( + IN PRTMP_ADAPTER pAd, + IN HTTRANSMIT_SETTING HTTxMode); + +/* + ========================================================================== + Description: + Prepare Measurement request action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + + Return : None. + ========================================================================== + */ +VOID MakeMeasurementReqFrame( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pOutBuffer, + OUT PULONG pFrameLen, + IN UINT8 TotalLen, + IN UINT8 Category, + IN UINT8 Action, + IN UINT8 MeasureToken, + IN UINT8 MeasureReqMode, + IN UINT8 MeasureReqType, + IN UINT16 NumOfRepetitions); + +/* + ========================================================================== + Description: + Prepare Measurement report action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + + Return : None. + ========================================================================== + */ +VOID EnqueueMeasurementRep( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN UINT8 DialogToken, + IN UINT8 MeasureToken, + IN UINT8 MeasureReqMode, + IN UINT8 MeasureReqType, + IN UINT8 ReportInfoLen, + IN PUINT8 pReportInfo); + +/* + ========================================================================== + Description: + Prepare TPC Request action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + + Return : None. + ========================================================================== + */ +VOID EnqueueTPCReq( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN UCHAR DialogToken); + +/* + ========================================================================== + Description: + Prepare TPC Report action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + + Return : None. + ========================================================================== + */ +VOID EnqueueTPCRep( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN UINT8 DialogToken, + IN UINT8 TxPwr, + IN UINT8 LinkMargin); + +/* + ========================================================================== + Description: + Prepare Channel Switch Announcement action frame and enqueue it into + management queue waiting for transmition. + + Parametrs: + 1. the destination mac address of the frame. + 2. Channel switch announcement mode. + 2. a New selected channel. + + Return : None. + ========================================================================== + */ +VOID EnqueueChSwAnn( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN UINT8 ChSwMode, + IN UINT8 NewCh); + +/* + ========================================================================== + Description: + Spectrun action frames Handler such as channel switch annoucement, + measurement report, measurement request actions frames. + + Parametrs: + Elme - MLME message containing the received frame + + Return : None. + ========================================================================== + */ +VOID PeerSpectrumAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem); + +/* + ========================================================================== + Description: + + Parametrs: + + Return : None. + ========================================================================== + */ +INT Set_MeasureReq_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_TpcReq_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_PwrConstraint( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + + +NDIS_STATUS MeasureReqTabInit( + IN PRTMP_ADAPTER pAd); + +VOID MeasureReqTabExit( + IN PRTMP_ADAPTER pAd); + +PMEASURE_REQ_ENTRY MeasureReqLookUp( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken); + +PMEASURE_REQ_ENTRY MeasureReqInsert( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken); + +VOID MeasureReqDelete( + IN PRTMP_ADAPTER pAd, + IN UINT8 DialogToken); + +VOID InsertChannelRepIE( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN PSTRING pCountry, + IN UINT8 RegulatoryClass); + +VOID InsertTpcReportIE( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN UINT8 TxPwr, + IN UINT8 LinkMargin); + +VOID InsertDialogToken( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN UINT8 DialogToken); + +NDIS_STATUS TpcReqTabInit( + IN PRTMP_ADAPTER pAd); + +VOID TpcReqTabExit( + IN PRTMP_ADAPTER pAd); + +VOID NotifyChSwAnnToPeerAPs( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pRA, + IN PUCHAR pTA, + IN UINT8 ChSwMode, + IN UINT8 Channel); + +VOID RguClass_BuildBcnChList( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pBuf, + OUT PULONG pBufLen); +#endif // __SPECTRUM_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/spectrum_def.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/spectrum_def.h new file mode 100644 index 000000000..59bae244d --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/spectrum_def.h @@ -0,0 +1,260 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + spectrum_def.h + + Abstract: + Handle association related requests either from WSTA or from local MLME + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + Fonchi Wu 2008 created for 802.11h + */ + +#ifndef __SPECTRUM_DEF_H__ +#define __SPECTRUM_DEF_H__ + + +#define MAX_MEASURE_REQ_TAB_SIZE 32 +/* Size of hash tab must be power of 2. */ +#define MAX_HASH_MEASURE_REQ_TAB_SIZE MAX_MEASURE_REQ_TAB_SIZE + +#define MAX_TPC_REQ_TAB_SIZE 32 +/* Size of hash tab must be power of 2. */ +#define MAX_HASH_TPC_REQ_TAB_SIZE MAX_TPC_REQ_TAB_SIZE + +#define MIN_RCV_PWR 100 /* Negative value ((dBm) */ + +#define TPC_REQ_AGE_OUT 500 /* ms */ +#define MQ_REQ_AGE_OUT 500 /* ms */ + +#define TPC_DIALOGTOKEN_HASH_INDEX(_DialogToken) ((_DialogToken) & (MAX_HASH_TPC_REQ_TAB_SIZE - 1)) +#define MQ_DIALOGTOKEN_HASH_INDEX(_DialogToken) ((_DialogToken) & (MAX_MEASURE_REQ_TAB_SIZE - 1)) + +typedef struct _MEASURE_REQ_ENTRY +{ + struct _MEASURE_REQ_ENTRY *pNext; + ULONG lastTime; + BOOLEAN Valid; + UINT8 DialogToken; + UINT8 MeasureDialogToken[3]; // 0:basic measure, 1: CCA measure, 2: RPI_Histogram measure. +} MEASURE_REQ_ENTRY, *PMEASURE_REQ_ENTRY; + +typedef struct _MEASURE_REQ_TAB +{ + UCHAR Size; + PMEASURE_REQ_ENTRY Hash[MAX_HASH_MEASURE_REQ_TAB_SIZE]; + MEASURE_REQ_ENTRY Content[MAX_MEASURE_REQ_TAB_SIZE]; +} MEASURE_REQ_TAB, *PMEASURE_REQ_TAB; + +typedef struct _TPC_REQ_ENTRY +{ + struct _TPC_REQ_ENTRY *pNext; + ULONG lastTime; + BOOLEAN Valid; + UINT8 DialogToken; +} TPC_REQ_ENTRY, *PTPC_REQ_ENTRY; + +typedef struct _TPC_REQ_TAB +{ + UCHAR Size; + PTPC_REQ_ENTRY Hash[MAX_HASH_TPC_REQ_TAB_SIZE]; + TPC_REQ_ENTRY Content[MAX_TPC_REQ_TAB_SIZE]; +} TPC_REQ_TAB, *PTPC_REQ_TAB; + + +/* The regulatory information */ +typedef struct _DOT11_CHANNEL_SET +{ + UCHAR NumberOfChannels; + UINT8 MaxTxPwr; + UCHAR ChannelList[16]; +} DOT11_CHANNEL_SET, *PDOT11_CHANNEL_SET; + +typedef struct _DOT11_REGULATORY_INFORMATION +{ + UCHAR RegulatoryClass; + DOT11_CHANNEL_SET ChannelSet; +} DOT11_REGULATORY_INFORMATION, *PDOT11_REGULATORY_INFORMATION; + + + +#define RM_TPC_REQ 0 +#define RM_MEASURE_REQ 1 + +#define RM_BASIC 0 +#define RM_CCA 1 +#define RM_RPI_HISTOGRAM 2 +#define RM_CH_LOAD 3 +#define RM_NOISE_HISTOGRAM 4 + + +typedef struct GNU_PACKED _TPC_REPORT_INFO +{ + UINT8 TxPwr; + UINT8 LinkMargin; +} TPC_REPORT_INFO, *PTPC_REPORT_INFO; + +typedef struct GNU_PACKED _CH_SW_ANN_INFO +{ + UINT8 ChSwMode; + UINT8 Channel; + UINT8 ChSwCnt; +} CH_SW_ANN_INFO, *PCH_SW_ANN_INFO; + +typedef union GNU_PACKED _MEASURE_REQ_MODE +{ +#ifdef RT_BIG_ENDIAN + struct GNU_PACKED + { + + UINT8 :3; + UINT8 DurationMandatory:1; + UINT8 Report:1; + UINT8 Request:1; + UINT8 Enable:1; + UINT8 Parallel:1; + } field; +#else + struct GNU_PACKED + { + UINT8 Parallel:1; + UINT8 Enable:1; + UINT8 Request:1; + UINT8 Report:1; + UINT8 DurationMandatory:1; + UINT8 :3; + } field; +#endif // RT_BIG_ENDIAN // + UINT8 word; +} MEASURE_REQ_MODE, *PMEASURE_REQ_MODE; + +typedef struct GNU_PACKED _MEASURE_REQ +{ + UINT8 ChNum; + UINT64 MeasureStartTime; + UINT16 MeasureDuration; +} MEASURE_REQ, *PMEASURE_REQ; + +typedef struct GNU_PACKED _MEASURE_REQ_INFO +{ + UINT8 Token; + MEASURE_REQ_MODE ReqMode; + UINT8 ReqType; + UINT8 Oct[0]; +} MEASURE_REQ_INFO, *PMEASURE_REQ_INFO; + +typedef union GNU_PACKED _MEASURE_BASIC_REPORT_MAP +{ +#ifdef RT_BIG_ENDIAN + struct GNU_PACKED + { + UINT8 Rev:3; + + UINT8 Unmeasure:1; + UINT8 Radar:1; + UINT8 UnidentifiedSignal:1; + UINT8 OfdmPreamble:1; + UINT8 BSS:1; + } field; +#else + struct GNU_PACKED + { + UINT8 BSS:1; + + UINT8 OfdmPreamble:1; + UINT8 UnidentifiedSignal:1; + UINT8 Radar:1; + UINT8 Unmeasure:1; + UINT8 Rev:3; + } field; +#endif // RT_BIG_ENDIAN // + UINT8 word; +} MEASURE_BASIC_REPORT_MAP, *PMEASURE_BASIC_REPORT_MAP; + +typedef struct GNU_PACKED _MEASURE_BASIC_REPORT +{ + UINT8 ChNum; + UINT64 MeasureStartTime; + UINT16 MeasureDuration; + MEASURE_BASIC_REPORT_MAP Map; +} MEASURE_BASIC_REPORT, *PMEASURE_BASIC_REPORT; + +typedef struct GNU_PACKED _MEASURE_CCA_REPORT +{ + UINT8 ChNum; + UINT64 MeasureStartTime; + UINT16 MeasureDuration; + UINT8 CCA_Busy_Fraction; +} MEASURE_CCA_REPORT, *PMEASURE_CCA_REPORT; + +typedef struct GNU_PACKED _MEASURE_RPI_REPORT +{ + UINT8 ChNum; + UINT64 MeasureStartTime; + UINT16 MeasureDuration; + UINT8 RPI_Density[8]; +} MEASURE_RPI_REPORT, *PMEASURE_RPI_REPORT; + +typedef union GNU_PACKED _MEASURE_REPORT_MODE +{ + struct GNU_PACKED + { +#ifdef RT_BIG_ENDIAN + UINT8 Rev:5; + UINT8 Refused:1; + UINT8 Incapable:1; + UINT8 Late:1; +#else + UINT8 Late:1; + UINT8 Incapable:1; + UINT8 Refused:1; + UINT8 Rev:5; +#endif // RT_BIG_ENDIAN // + } field; + UINT8 word; +} MEASURE_REPORT_MODE, *PMEASURE_REPORT_MODE; + +typedef struct GNU_PACKED _MEASURE_REPORT_INFO +{ + UINT8 Token; + UINT8 ReportMode; + UINT8 ReportType; + UINT8 Octect[0]; +} MEASURE_REPORT_INFO, *PMEASURE_REPORT_INFO; + +typedef struct GNU_PACKED _QUIET_INFO +{ + UINT8 QuietCnt; + UINT8 QuietPeriod; + UINT16 QuietDuration; + UINT16 QuietOffset; +} QUIET_INFO, *PQUIET_INFO; + +#endif // __SPECTRUM_DEF_H__ // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/vr_ikans.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/vr_ikans.h new file mode 100644 index 000000000..fa9351a30 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/vr_ikans.h @@ -0,0 +1,72 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + vr_ikans.h + + Abstract: + Only for IKANOS Vx160 or Vx180 platform. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Sample Lin 01-28-2008 Created + + */ + +#ifndef __VR_IKANS_H__ +#define __VR_IKANS_H__ + +#ifndef MODULE_IKANOS +#define IKANOS_EXTERN extern +#else +#define IKANOS_EXTERN +#endif // MODULE_IKANOS // + +#ifdef IKANOS_VX_1X0 + typedef void (*IkanosWlanTxCbFuncP)(void *, void *); + + struct IKANOS_TX_INFO + { + struct net_device *netdev; + IkanosWlanTxCbFuncP *fp; + }; +#endif // IKANOS_VX_1X0 // + + +IKANOS_EXTERN void VR_IKANOS_FP_Init(UINT8 BssNum, UINT8 *pApMac); + +IKANOS_EXTERN INT32 IKANOS_DataFramesTx(struct sk_buff *pSkb, + struct net_device *pNetDev); + +IKANOS_EXTERN void IKANOS_DataFrameRx(PRTMP_ADAPTER pAd, + void *pRxParam, + struct sk_buff *pSkb, + UINT32 Length); + +#endif // __VR_IKANS_H__ // + +/* End of vr_ikans.h */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/wpa.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/wpa.h new file mode 100644 index 000000000..ca7041539 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/wpa.h @@ -0,0 +1,497 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + wpa.h + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs +*/ + +#ifndef __WPA_H__ +#define __WPA_H__ + +#ifndef ROUND_UP +#define ROUND_UP(__x, __y) \ + (((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1))) +#endif + +#define SET_UINT16_TO_ARRARY(_V, _LEN) \ +{ \ + _V[0] = ((UINT16)_LEN) >> 8; \ + _V[1] = ((UINT16)_LEN & 0xFF); \ +} + +#define INC_UINT16_TO_ARRARY(_V, _LEN) \ +{ \ + UINT16 var_len; \ + \ + var_len = (_V[0]<<8) | (_V[1]); \ + var_len += _LEN; \ + \ + _V[0] = (var_len & 0xFF00) >> 8; \ + _V[1] = (var_len & 0xFF); \ +} + +#define CONV_ARRARY_TO_UINT16(_V) ((_V[0]<<8) | (_V[1])) + +#define ADD_ONE_To_64BIT_VAR(_V) \ +{ \ + UCHAR cnt = LEN_KEY_DESC_REPLAY; \ + do \ + { \ + cnt--; \ + _V[cnt]++; \ + if (cnt == 0) \ + break; \ + }while (_V[cnt] == 0); \ +} + +#define INC_TX_TSC(_tsc, _cnt) \ +{ \ + INT i=0; \ + while (++_tsc[i] == 0x0) \ + { \ + i++; \ + if (i == (_cnt)) \ + break; \ + } \ +} + +#define IS_WPA_CAPABILITY(a) (((a) >= Ndis802_11AuthModeWPA) && ((a) <= Ndis802_11AuthModeWPA1PSKWPA2PSK)) + +/* + WFA recommend to restrict the encryption type in 11n-HT mode. + So, the WEP and TKIP shall not be allowed to use HT rate. + */ +#define IS_INVALID_HT_SECURITY(_mode) \ + (((_mode) == Ndis802_11Encryption1Enabled) || \ + ((_mode) == Ndis802_11Encryption2Enabled) || \ + ((_mode) == Ndis802_11Encryption4Enabled)) + +#define MIX_CIPHER_WPA_TKIP_ON(x) (((x) & 0x08) != 0) +#define MIX_CIPHER_WPA_AES_ON(x) (((x) & 0x04) != 0) +#define MIX_CIPHER_WPA2_TKIP_ON(x) (((x) & 0x02) != 0) +#define MIX_CIPHER_WPA2_AES_ON(x) (((x) & 0x01) != 0) + +/* Some definition are different between Keneral mode and Daemon mode */ +#ifdef WPA_DAEMON_MODE +/* The definition for Daemon mode */ +#define WPA_GET_BSS_NUM(_pAd) (_pAd)->mbss_num + +#define WPA_GET_PMK(_pAd, _pEntry, _pmk) \ +{ \ + _pmk = _pAd->MBSS[_pEntry->apidx].PMK; \ +} + +#define WPA_GET_GTK(_pAd, _pEntry, _gtk) \ +{ \ + _gtk = _pAd->MBSS[_pEntry->apidx].GTK; \ +} + +#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \ +{ \ + _cipher = (_pAd)->MBSS[_pEntry->apidx].GroupEncrypType; \ +} + +#define WPA_GET_DEFAULT_KEY_ID(_pAd, _pEntry, _idx) \ +{ \ + _idx = (_pAd)->MBSS[_pEntry->apidx].DefaultKeyId; \ +} + +#define WPA_GET_BMCST_TSC(_pAd, _pEntry, _tsc) \ +{ \ + _tsc = 1; \ +} + +#define WPA_BSSID(_pAd, _apidx) (_pAd)->MBSS[_apidx].wlan_addr + +#define WPA_OS_MALLOC(_p, _s) \ +{ \ + _p = os_malloc(_s); \ +} + +#define WPA_OS_FREE(_p) \ +{ \ + os_free(_p); \ +} + +#define WPA_GET_CURRENT_TIME(_time) \ +{ \ + struct timeval tv; \ + gettimeofday(&tv, NULL); \ + *(_time) = tv.tv_sec; \ +} + +#else +/* The definition for Driver mode */ + +#if defined(CONFIG_AP_SUPPORT) && defined(CONFIG_STA_SUPPORT) +#define WPA_GET_BSS_NUM(_pAd) (((_pAd)->OpMode == OPMODE_AP) ? (_pAd)->ApCfg.BssidNum : 1) +#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \ + { \ + _cipher = Ndis802_11WEPDisabled; \ + if ((_pAd)->OpMode == OPMODE_AP) \ + { \ + if (IS_ENTRY_APCLI(_pEntry) && \ + ((_pEntry)->MatchAPCLITabIdx < MAX_APCLI_NUM)) \ + _cipher = (_pAd)->ApCfg.ApCliTab[(_pEntry)->MatchAPCLITabIdx].GroupCipher; \ + else if ((_pEntry)->apidx < (_pAd)->ApCfg.BssidNum) \ + _cipher = (_pAd)->ApCfg.MBSSID[_pEntry->apidx].GroupKeyWepStatus;\ + } \ + else \ + _cipher = (_pAd)->StaCfg.GroupCipher; \ + } + +#define WPA_BSSID(_pAd, _apidx) (((_pAd)->OpMode == OPMODE_AP) ?\ + (_pAd)->ApCfg.MBSSID[_apidx].Bssid :\ + (_pAd)->CommonCfg.Bssid) +#elif defined(CONFIG_AP_SUPPORT) +#define WPA_GET_BSS_NUM(_pAd) (_pAd)->ApCfg.BssidNum +#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \ + { \ + _cipher = Ndis802_11WEPDisabled; \ + if (IS_ENTRY_APCLI(_pEntry) && \ + ((_pEntry)->MatchAPCLITabIdx < MAX_APCLI_NUM)) \ + _cipher = (_pAd)->ApCfg.ApCliTab[(_pEntry)->MatchAPCLITabIdx].GroupCipher; \ + else if ((_pEntry)->apidx < (_pAd)->ApCfg.BssidNum) \ + _cipher = (_pAd)->ApCfg.MBSSID[_pEntry->apidx].GroupKeyWepStatus;\ + } + +#define WPA_BSSID(_pAd, _apidx) (_pAd)->ApCfg.MBSSID[_apidx].Bssid + +#elif defined(CONFIG_STA_SUPPORT) +#define WPA_GET_BSS_NUM(_pAd) 1 +#define WPA_GET_GROUP_CIPHER(_pAd, _pEntry, _cipher) \ + { \ + _cipher = (_pAd)->StaCfg.GroupCipher; \ + } +#define WPA_BSSID(_pAd, _apidx) (_pAd)->CommonCfg.Bssid +#endif // defined(CONFIG_STA_SUPPORT) // + + +#define WPA_OS_MALLOC(_p, _s) \ +{ \ + os_alloc_mem(NULL, (PUCHAR *)&_p, _s); \ +} + +#define WPA_OS_FREE(_p) \ +{ \ + os_free_mem(NULL, _p); \ +} + +#define WPA_GET_CURRENT_TIME(_time) NdisGetSystemUpTime(_time); + +#endif // End of Driver Mode // + + +/*======================================== + The prototype is defined in cmm_wpa.c + ========================================*/ +void inc_iv_byte( + UCHAR *iv, + UINT len, + UINT cnt); + +BOOLEAN WpaMsgTypeSubst( + IN UCHAR EAPType, + OUT INT *MsgType); + +VOID PRF( + IN UCHAR *key, + IN INT key_len, + IN UCHAR *prefix, + IN INT prefix_len, + IN UCHAR *data, + IN INT data_len, + OUT UCHAR *output, + IN INT len); + +int RtmpPasswordHash( + char *password, + unsigned char *ssid, + int ssidlength, + unsigned char *output); + +VOID KDF( + IN PUINT8 key, + IN INT key_len, + IN PUINT8 label, + IN INT label_len, + IN PUINT8 data, + IN INT data_len, + OUT PUINT8 output, + IN USHORT len); + +PUINT8 WPA_ExtractSuiteFromRSNIE( + IN PUINT8 rsnie, + IN UINT rsnie_len, + IN UINT8 type, + OUT UINT8 *count); + +VOID WpaShowAllsuite( + IN PUINT8 rsnie, + IN UINT rsnie_len); + +VOID RTMPInsertRSNIE( + IN PUCHAR pFrameBuf, + OUT PULONG pFrameLen, + IN PUINT8 rsnie_ptr, + IN UINT8 rsnie_len, + IN PUINT8 pmkid_ptr, + IN UINT8 pmkid_len); + +/* + ===================================== + function prototype in cmm_wpa.c + ===================================== +*/ +VOID RTMPToWirelessSta( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PUCHAR pHeader802_3, + IN UINT HdrLen, + IN PUCHAR pData, + IN UINT DataLen, + IN BOOLEAN bClearFrame); + +VOID WpaDerivePTK( + IN PRTMP_ADAPTER pAd, + IN UCHAR *PMK, + IN UCHAR *ANonce, + IN UCHAR *AA, + IN UCHAR *SNonce, + IN UCHAR *SA, + OUT UCHAR *output, + IN UINT len); + +VOID WpaDeriveGTK( + IN UCHAR *PMK, + IN UCHAR *GNonce, + IN UCHAR *AA, + OUT UCHAR *output, + IN UINT len); + +VOID GenRandom( + IN PRTMP_ADAPTER pAd, + IN UCHAR *macAddr, + OUT UCHAR *random); + +BOOLEAN RTMPCheckWPAframe( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN PUCHAR pData, + IN ULONG DataByteCount, + IN UCHAR FromWhichBSSID); + +BOOLEAN RTMPParseEapolKeyData( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pKeyData, + IN UCHAR KeyDataLen, + IN UCHAR GroupKeyIndex, + IN UCHAR MsgType, + IN BOOLEAN bWPA2, + IN MAC_TABLE_ENTRY *pEntry); + +VOID WPA_ConstructKdeHdr( + IN UINT8 data_type, + IN UINT8 data_len, + OUT PUCHAR pBuf); + +VOID ConstructEapolMsg( + IN PMAC_TABLE_ENTRY pEntry, + IN UCHAR GroupKeyWepStatus, + IN UCHAR MsgType, + IN UCHAR DefaultKeyIdx, + IN UCHAR *KeyNonce, + IN UCHAR *TxRSC, + IN UCHAR *GTK, + IN UCHAR *RSNIE, + IN UCHAR RSNIE_Len, + OUT PEAPOL_PACKET pMsg); + +PCIPHER_KEY RTMPSwCipherKeySelection( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pIV, + IN RX_BLK *pRxBlk, + IN PMAC_TABLE_ENTRY pEntry); + +NDIS_STATUS RTMPSoftDecryptionAction( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHdr, + IN UCHAR UserPriority, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + INOUT UINT16 *DataByteCnt); + +VOID RTMPSoftConstructIVHdr( + IN UCHAR CipherAlg, + IN UCHAR key_id, + IN PUCHAR pTxIv, + OUT PUCHAR pHdrIv, + OUT UINT8 *hdr_iv_len); + +VOID RTMPSoftEncryptionAction( + IN PRTMP_ADAPTER pAd, + IN UCHAR CipherAlg, + IN PUCHAR pHdr, + IN PUCHAR pSrcBufData, + IN UINT32 SrcBufLen, + IN UCHAR KeyIdx, + IN PCIPHER_KEY pKey, + OUT UINT8 *ext_len); + +VOID RTMPMakeRSNIE( + IN PRTMP_ADAPTER pAd, + IN UINT AuthMode, + IN UINT WepStatus, + IN UCHAR apidx); + +VOID WPAInstallPairwiseKey( + PRTMP_ADAPTER pAd, + UINT8 BssIdx, + PMAC_TABLE_ENTRY pEntry, + BOOLEAN bAE); + +VOID WPAInstallSharedKey( + PRTMP_ADAPTER pAd, + UINT8 GroupCipher, + UINT8 BssIdx, + UINT8 KeyIdx, + UINT8 Wcid, + BOOLEAN bAE, + PUINT8 pGtk); + +VOID RTMPSetWcidSecurityInfo( + PRTMP_ADAPTER pAd, + UINT8 BssIdx, + UINT8 KeyIdx, + UINT8 CipherAlg, + UINT8 Wcid, + UINT8 KeyTabFlag); + +VOID CalculateMIC( + IN UCHAR KeyDescVer, + IN UCHAR *PTK, + OUT PEAPOL_PACKET pMsg); + +PSTRING GetEapolMsgType(CHAR msg); +/* + ===================================== + function prototype in cmm_wep.c + ===================================== +*/ +UINT RTMP_CALC_FCS32( + IN UINT Fcs, + IN PUCHAR Cp, + IN INT Len); + +VOID RTMPConstructWEPIVHdr( + IN UINT8 key_idx, + IN UCHAR *pn, + OUT UCHAR *iv_hdr); + +BOOLEAN RTMPSoftEncryptWEP( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pIvHdr, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + IN ULONG DataByteCnt); + +BOOLEAN RTMPSoftDecryptWEP( + IN PRTMP_ADAPTER pAd, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + INOUT UINT16 *DataByteCnt); + +/* + ===================================== + function prototype in cmm_tkip.c + ===================================== +*/ +BOOLEAN RTMPSoftDecryptTKIP( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHdr, + IN UCHAR UserPriority, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + IN UINT16 *DataByteCnt); + +VOID TKIP_GTK_KEY_WRAP( + IN UCHAR *key, + IN UCHAR *iv, + IN UCHAR *input_text, + IN UINT32 input_len, + OUT UCHAR *output_text); + +VOID TKIP_GTK_KEY_UNWRAP( + IN UCHAR *key, + IN UCHAR *iv, + IN UCHAR *input_text, + IN UINT32 input_len, + OUT UCHAR *output_text); + +/* + ===================================== + function prototype in cmm_aes.c + ===================================== +*/ +BOOLEAN RTMPSoftDecryptAES( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pData, + IN ULONG DataByteCnt, + IN PCIPHER_KEY pWpaKey); + +VOID RTMPConstructCCMPHdr( + IN UINT8 key_idx, + IN UCHAR *pn, + OUT UCHAR *ccmp_hdr); + +BOOLEAN RTMPSoftEncryptCCMP( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHdr, + IN PUCHAR pIV, + IN PUCHAR pKey, + INOUT PUCHAR pData, + IN UINT32 DataLen); + +BOOLEAN RTMPSoftDecryptCCMP( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHdr, + IN PCIPHER_KEY pKey, + INOUT PUCHAR pData, + INOUT UINT16 *DataLen); + +VOID CCMP_test_vector( + IN PRTMP_ADAPTER pAd, + IN INT input); + +#endif + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/wpa_cmm.h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/wpa_cmm.h new file mode 100644 index 000000000..82ad78a1b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/include/wpa_cmm.h @@ -0,0 +1,244 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + +#ifndef WPA_CMM_H +#define WPA_CMM_H + +#include "rtmp_type.h" +#include "dot11i_wpa.h" + +#define CACHE_NOT_FOUND -1 + +#define TX_EAPOL_BUFFER 1500 + +// Retry timer counter initial value +#define PEER_MSG1_RETRY_TIMER_CTR 0 +#define PEER_MSG3_RETRY_TIMER_CTR 10 +#define GROUP_MSG1_RETRY_TIMER_CTR 20 + +// WPA mechanism retry timer interval +#define PEER_MSG1_RETRY_EXEC_INTV 1000 // 1 sec +#define PEER_MSG3_RETRY_EXEC_INTV 3000 // 3 sec +#define GROUP_KEY_UPDATE_EXEC_INTV 1000 // 1 sec +#define PEER_GROUP_KEY_UPDATE_INIV 2000 // 2 sec + +#define EAPOL_MSG_INVALID 0 +#define EAPOL_PAIR_MSG_1 1 +#define EAPOL_PAIR_MSG_2 2 +#define EAPOL_PAIR_MSG_3 3 +#define EAPOL_PAIR_MSG_4 4 +#define EAPOL_GROUP_MSG_1 5 +#define EAPOL_GROUP_MSG_2 6 + +#define ENQUEUE_EAPOL_START_TIMER 200 // 200 ms + +// group rekey interval +#define TIME_REKEY 0 +#define PKT_REKEY 1 +#define DISABLE_REKEY 2 +#define MAX_REKEY 2 + +#define MAX_REKEY_INTER 0x3ffffff + +#define EAPOL_START_DISABLE 0 +#define EAPOL_START_PSK 1 +#define EAPOL_START_1X 2 + +// +// Common WPA state machine: states, events, total function # +// +#define WPA_PTK 0 +#define MAX_WPA_PTK_STATE 1 + +#define WPA_MACHINE_BASE 0 +#define MT2_EAPPacket 0 +#define MT2_EAPOLStart 1 +#define MT2_EAPOLLogoff 2 +#define MT2_EAPOLKey 3 +#define MT2_EAPOLASFAlert 4 +#define MAX_WPA_MSG 5 + +#define WPA_FUNC_SIZE (MAX_WPA_PTK_STATE * MAX_WPA_MSG) + +typedef enum _WpaRole { + WPA_NONE, // 0 + WPA_Authenticator, // 1 + WPA_Supplicant, // 2 + WPA_BOTH, // 3: Authenticator and Supplicant +} WPA_ROLE; + +//for-wpa value domain of pMacEntry->WpaState 802.1i D3 p.114 +typedef enum _ApWpaState { + AS_NOTUSE, // 0 + AS_DISCONNECT, // 1 + AS_DISCONNECTED, // 2 + AS_INITIALIZE, // 3 + AS_AUTHENTICATION, // 4 + AS_AUTHENTICATION2, // 5 + AS_INITPMK, // 6 + AS_INITPSK, // 7 + AS_PTKSTART, // 8 + AS_PTKINIT_NEGOTIATING, // 9 + AS_PTKINITDONE, // 10 + AS_UPDATEKEYS, // 11 + AS_INTEGRITY_FAILURE, // 12 + AS_KEYUPDATE, // 13 +} AP_WPA_STATE; + +// For supplicant state machine states. 802.11i Draft 4.1, p. 97 +// We simplified it +typedef enum _WpaState +{ + SS_NOTUSE, // 0 + SS_START, // 1 + SS_WAIT_MSG_3, // 2 + SS_WAIT_GROUP, // 3 + SS_FINISH, // 4 + SS_KEYUPDATE, // 5 +} WPA_STATE; + +// for-wpa value domain of pMacEntry->WpaState 802.1i D3 p.114 +typedef enum _GTKState { + REKEY_NEGOTIATING, + REKEY_ESTABLISHED, + KEYERROR, +} GTK_STATE; + +// for-wpa value domain of pMacEntry->WpaState 802.1i D3 p.114 +typedef enum _WpaGTKState { + SETKEYS, + SETKEYS_DONE, +} WPA_GTK_STATE; + +/* WPA internal command type */ +#define WPA_SM_4WAY_HS_START 1 +#define WPA_SM_DISCONNECT 0xff + +/* WPA element IDs */ +typedef enum _WPA_VARIABLE_ELEMENT_ID +{ + WPA_ELEM_CMD = 1, + WPA_ELEM_PEER_RSNIE, + WPA_ELEM_LOCAL_RSNIE, + WPA_ELEM_PMK, + WPA_ELEM_RESV +} WPA_VARIABLE_ELEMENT_ID; + +#define GROUP_SUITE 0 +#define PAIRWISE_SUITE 1 +#define AKM_SUITE 2 +#define RSN_CAP_INFO 3 +#define PMKID_LIST 4 +#define G_MGMT_SUITE 5 + +// +// The definition of the cipher combination +// +// bit3 bit2 bit1 bit0 +// +------------+------------+ +// | WPA | WPA2 | +// +------+-----+------+-----+ +// | TKIP | AES | TKIP | AES | +// | 0 | 1 | 1 | 0 | -> 0x06 +// | 0 | 1 | 1 | 1 | -> 0x07 +// | 1 | 0 | 0 | 1 | -> 0x09 +// | 1 | 0 | 1 | 1 | -> 0x0B +// | 1 | 1 | 0 | 1 | -> 0x0D +// | 1 | 1 | 1 | 0 | -> 0x0E +// | 1 | 1 | 1 | 1 | -> 0x0F +// +------+-----+------+-----+ +// +typedef enum _WpaMixPairCipher +{ + MIX_CIPHER_NOTUSE = 0x00, + WPA_NONE_WPA2_TKIPAES = 0x03, // WPA2-TKIPAES + WPA_AES_WPA2_TKIP = 0x06, + WPA_AES_WPA2_TKIPAES = 0x07, + WPA_TKIP_WPA2_AES = 0x09, + WPA_TKIP_WPA2_TKIPAES = 0x0B, + WPA_TKIPAES_WPA2_NONE = 0x0C, // WPA-TKIPAES + WPA_TKIPAES_WPA2_AES = 0x0D, + WPA_TKIPAES_WPA2_TKIP = 0x0E, + WPA_TKIPAES_WPA2_TKIPAES = 0x0F, +} WPA_MIX_PAIR_CIPHER; + +/* The internal command list for ralink dot1x daemon using */ +typedef enum _Dot1xInternalCmd +{ + DOT1X_DISCONNECT_ENTRY, + DOT1X_RELOAD_CONFIG, +} DOT1X_INTERNAL_CMD; + +// 802.1x authentication format +typedef struct _IEEE8021X_FRAME { + UCHAR Version; // 1.0 + UCHAR Type; // 0 = EAP Packet + USHORT Length; +} IEEE8021X_FRAME, *PIEEE8021X_FRAME; + +typedef struct GNU_PACKED _RSN_IE_HEADER_STRUCT { + UCHAR Eid; + UCHAR Length; + USHORT Version; // Little endian format +} RSN_IE_HEADER_STRUCT, *PRSN_IE_HEADER_STRUCT; + +// Cipher suite selector types +typedef struct GNU_PACKED _CIPHER_SUITE_STRUCT { + UCHAR Oui[3]; + UCHAR Type; +} CIPHER_SUITE_STRUCT, *PCIPHER_SUITE_STRUCT; + +// Authentication and Key Management suite selector +typedef struct GNU_PACKED _AKM_SUITE_STRUCT { + UCHAR Oui[3]; + UCHAR Type; +} AKM_SUITE_STRUCT, *PAKM_SUITE_STRUCT; + +// RSN capability +typedef struct GNU_PACKED _RSN_CAPABILITY { + USHORT Rsv:10; + USHORT GTKSAReplayCnt:2; + USHORT PTKSAReplayCnt:2; + USHORT NoPairwise:1; + USHORT PreAuth:1; +} RSN_CAPABILITY, *PRSN_CAPABILITY; + +typedef struct _CIPHER_KEY { + UCHAR Key[16]; // 128 bits max + UCHAR TxMic[8]; + UCHAR RxMic[8]; + UCHAR TxTsc[16]; // TSC value. Change it from 48bit to 128bit + UCHAR RxTsc[16]; // TSC value. Change it from 48bit to 128bit + UCHAR CipherAlg; // 0:none, 1:WEP64, 2:WEP128, 3:TKIP, 4:AES, 5:CKIP64, 6:CKIP128 + UCHAR KeyLen; // Key length for each key, 0: entry is invalid +#ifdef CONFIG_STA_SUPPORT + UCHAR BssId[6]; +#endif // CONFIG_STA_SUPPORT // + UCHAR Type; // Indicate Pairwise/Group when reporting MIC error +} CIPHER_KEY, *PCIPHER_KEY; + +#endif // WPA_CMM_H // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/iwpriv_usage.txt b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/iwpriv_usage.txt new file mode 100644 index 000000000..158831c31 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/iwpriv_usage.txt @@ -0,0 +1,303 @@ +iwpriv +================= +This is detailed explanation of each parameters for iwpriv. +Before reading this document, make sure you already read README. + +------------------------------------------------------------------------------------------------------- +USAGE: + iwpriv ra0 set [parameters]=[val] + +NOTE: + Execute one iwpriv/set command simultaneously. + +where +[parameters] [val] + {range} +----------------- ------------------------------------------------- +CountryRegion {0~7} + ::Set country region + 0: 1 ~ 11 ch + 1: 1 ~ 13 ch + 2: 10, 11 ch + 3: 10 ~ 13 ch + 4: 14 ch + 5: 1 ~ 14 ch + 6: 3 ~ 9 ch + 7: 5 ~ 13 ch + 31: 1 ~ 14 ch (ch1-11:active scan, ch12-14 passive scan) + +CountryRegionABand {0~11} + ::Set country region for A band + 0: 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165 ch + 1: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 ch + 2: 36, 40, 44, 48, 52, 56, 60, 64 ch + 3: 52, 56, 60, 64, 149, 153, 157, 161 ch + 4: 149, 153, 157, 161, 165 ch + 5: 149, 153, 157, 161 ch + 6: 36, 40, 44, 48 ch + 7: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 ch + 8: 52, 56, 60, 64 ch + 9: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165 ch + 10: 36, 40, 44, 48, 149, 153, 157, 161, 165 ch + 11: 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161 ch + +SSID {0~z, 1~32 ascii characters} + ::Set AP SSID + +WirelessMode {0~10} + ::Set Wireless Mode + 0: legacy 11b/g mixed + 1: legacy 11B only + 2: legacy 11A only + 3: legacy 11a/b/g mixed + 4: legacy 11G only + 5: 11ABGN mixed + 6: 11N only + 7: 11GN mixed + 8: 11AN mixed + 9: 11BGN mixed + 10: 11AGN mixed + +Channel depends on CountryRegion or CountryRegionForABand + ::Set Channel + +BGProtection {0~2} + ::Set 11B/11G Protection + 0:Auto, + 1:Always on, + 2:Always off + +TxPreamble {0~2} + ::Set TxPreamble + 0:Preamble Long, + 1:Preamble Short, + 2:Auto + +RTSThreshold {1~2347} + ::Set RTS Threshold + +FragThreshold {256~2346} + ::Set Fragment Threshold + +TxBurst {0,1} + ::Set TxBurst Enable or Disable + 0:Disable, + 1:Enable + +NetworkType {Infra,Adhoc} + ::Set Network type + +AuthMode {OPEN,SHARED,WEPAUTO,WPAPSK,WPA2PSK,WPANONE} + ::Set Authentication Mode + +EncrypType {NONE,WEP,TKIP,AES} + ::Set Encryption Type + +DefaultKeyID {1~4} + ::Set Default Key ID + + +Key1 {5 ascii characters or 10 hex number or + 13 ascii characters or 26 hex numbers} + ::Set Key1 String + +Key2 {5 ascii characters or 10 hex number or + 13 ascii characters or 26 hex numbers} + ::Set Key2 String + +Key3 {5 ascii characters or 10 hex number or + 13 ascii characters or 26 hex numbers} + ::Set Key3 String + +Key4 {5 ascii characters or 10 hex number or + 13 ascii characters or 26 hex numbers} + ::Set Key4 String + +WPAPSK {8~63 ascii or 64 hex characters} + ::WPA Pre-Shared Key + +WmmCapable {0,1} + ::Set WMM Capable + 0:Disable WMM, + 1:Enable WMM + +PSMode {CAM, MAX_PSP, FAST_PSP} + ::Set Power Saving Mode + +HtBw {0,1} + ::Set BandWidth + 0: 20Hz + 1: 40Hz + +HtMcs {0 ~ 15, 33} + ::Set MCS + 33: Auto Rate + +HtGi {0,1} + ::Set Guard Interval(GI) + 0: long GI + 1: short GI + +HtOpMode {0,1} + ::Set HT Operation Mode + 0: HT mixed format + 1: HT greenfield format + +HtExtcha {0,1} + ::Set Extended Channel Switch Announcement + 0: Below + 1: Above + +HtMpduDensity {0 ~ 7} + ::Set The Minimum Time Between MPDUs within an AMPDU + +HtBaWinSize {1 ~ 64} + ::Set BA WinSize + +HtRdg {0,1} + ::Set RDG Capable + 0: Disabled + 1: Enabled + +HtAmsdu {0,1} + ::Set AMSDU Capable + 0: Disabled + 1: Enabled + +HtAutoBa {0,1} + ::Set Auto BA Capable + 0: Disabled + 1: Enabled + +HtBaDecline {0,1} + ::Reject BA request from AP + 0: Disabled + 1: Enabled + +HtProtect {0,1} + ::Set HT Protect Capable + 0: Disabled + 1: Enabled + +FixedTxMode {CCK, OFDM} + :: Set Fixed Tx Mode for fixed rate setting + Mode = CCK + MCS = 0 => 1Mbps + = 1 => 2Mbps + = 2 => 5.5 Mbps + = 3 => 11 Mbps + Mode = OFDM + MCS = 0 => 6Mbps + = 1 => 9Mbps + = 2 => 12Mbps + = 3 => 18Mbps + = 4 => 24Mbps + = 5 => 36Mbps + = 6 => 48Mbps + = 7 => 54Mbps + +LongRetry {0,255} + :: Set Tx Long Retry Limit + +ShortRetry {0,255} + :: Set Tx Short Retry Limit + +Examples +=================================================================== +------------------------------------------------------------------------------------------------------- +a> Config STA to link with AP which is OPEN/NONE(Authentication/Encryption) + 1. iwpriv ra0 set NetworkType=Infra + 2. iwpriv ra0 set AuthMode=OPEN + 3. iwpriv ra0 set EncrypType=NONE + 4. iwpriv ra0 set SSID="AP's SSID" + +b> Config STA to link with AP which is SHARED/WEP(Authentication/Encryption) + 1. iwpriv ra0 set NetworkType=Infra + 2. iwpriv ra0 set AuthMode=SHARED + 3. iwpriv ra0 set EncrypType=WEP + 4. iwpriv ra0 set DefaultKeyID=1 + 5. iwpriv ra0 set Key1="AP's wep key" + 6. iwpriv ra0 set SSID="AP's SSID" + +c> Config STA to link with AP which is WPAPSK/TKIP(Authentication/Encryption) + 1. iwpriv ra0 set NetworkType=Infra + 2. iwpriv ra0 set AuthMode=WPAPSK + 3. iwpriv ra0 set EncrypType=TKIP + 4. iwpriv ra0 set SSID="AP's SSID" + 5. iwpriv ra0 set WPAPSK="AP's wpa-preshared key" + 6. iwpriv ra0 set SSID="AP's SSID" + +d> Config STA to link with AP which is WPAPSK/AES(Authentication/Encryption) + 1. iwpriv ra0 set NetworkType=Infra + 2. iwpriv ra0 set AuthMode=WPAPSK + 3. iwpriv ra0 set EncrypType=AES + 4. iwpriv ra0 set SSID="AP's SSID" + 5. iwpriv ra0 set WPAPSK="AP's wpa-preshared key" + 6. iwpriv ra0 set SSID="AP's SSID" + +e> Config STA to link with AP which is WPA2PSK/TKIP(Authentication/Encryption) + 1. iwpriv ra0 set NetworkType=Infra + 2. iwpriv ra0 set AuthMode=WPA2PSK + 3. iwpriv ra0 set EncrypType=TKIP + 4. iwpriv ra0 set SSID="AP's SSID" + 5. iwpriv ra0 set WPAPSK=12345678 + 6. iwpriv ra0 set SSID="AP's SSID" + +f> Config STA to create/link as adhoc mode, which is OPEN/NONE(Authentication/Encryption) + 1. iwpriv ra0 set NetworkType=Adhoc + 2. iwpriv ra0 set AuthMode=OPEN + 3. iwpriv ra0 set EncrypType=NONE + 4. iwpriv ra0 set SSID="Adhoc's SSID" + +g> Config STA to create/link as adhoc mode, which is WPANONE/TKIP(Authentication/Encryption) + 1. iwpriv ra0 set NetworkType=Adhoc + 2. iwpriv ra0 set AuthMode=WPANONE + 3. iwpriv ra0 set EncrypType=TKIP + 4. iwpriv ra0 set SSID="AP's SSID" + 5. iwpriv ra0 set WPAPSK=12345678 + 6. iwpriv ra0 set SSID="AP's SSID" + +h> Get site survey + usage: iwpriv ra0 get_site_survey + +i> Get Statistics + usage: iwpriv ra0 stat ; read statistic counter + iwpriv ra0 set ResetCounter=0 ; reset statistic counter + +j> Link with an AP which is the largest strength ; set ANY SSID (ssidLen=0) + usage: iwconfig ra0 essid "" + or + usage: iwpriv ra0 set SSID="" + +=================================================================== + +iwlist +================= +This is detailed explanation of each parameters for iwlist. + +------------------------------------------------------------------------------------------------------- +iwlist ra0 scanning ; list the results after scanning(manual rescan) + + + +======================================================================================================= + +iwconfig +================= +The following are our support in standard configuration - iwconfig + +------------------------------------------------------------------------------------------------------- +iwconfig ra0 essid {NN|on|off} ; set essid +iwconfig ra0 mode {managed|ad-hoc|...} ; set wireless mode +>> rt2860sta driver support monitor mode with linux kernel > 2.4.20. +iwconfig ra0 freq N.NNNN[k|M|G]] ; set frequency +iwconfig ra0 channel N ; set channel +iwconfig ra0 ap {N|off|auto} ; set AP address +iwconfig ra0 nick N ; set nickname +iwconfig ra0 rate {N|auto|fixed} ; set rate (only support legacy rate setting) +iwconfig ra0 rts {N|auto|fixed|off} ; set RTS threshold +iwconfig ra0 frag {N|auto|fixed|off} ; set Fragment threshold +iwconfig ra0 enc {NNNN-NNNN|off} ; set encryption type +iwconfig ra0 power {period N|timeout N} ; set power management modes + +*** Wireless extension usage please refer to man page of 'iwconfig', 'iwlist' and 'iwpriv'. *** diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.pci_main_dev.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.pci_main_dev.o.cmd new file mode 100644 index 000000000..2f2552d27 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.pci_main_dev.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/pci_main_dev.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.pci_main_dev.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(pci_main_dev)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.tmp_pci_main_dev.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/pci_main_dev.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/pci_main_dev.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/pci_main_dev.c \ + $(wildcard include/config/pm.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/pci_main_dev.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/pci_main_dev.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/pci_main_dev.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.ko.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.ko.cmd new file mode 100644 index 000000000..7ac33471b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.ko.cmd @@ -0,0 +1 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.ko := ld -r -m elf_i386 -T /usr/src/linux-headers-2.6.32-29-generic-pae/scripts/module-common.lds --build-id -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.ko /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.o diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.mod.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.mod.o.cmd new file mode 100644 index 000000000..fab5db874 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.mod.o.cmd @@ -0,0 +1,442 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/.rt3562sta.mod.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt3562sta.mod)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -DMODULE -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.c \ + $(wildcard include/config/module/unload.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/vermagic.h \ + include/linux/utsrelease.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.mod.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.o.cmd new file mode 100644 index 000000000..ec69ae8ec --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt3562sta.o.cmd @@ -0,0 +1 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.o := ld -m elf_i386 -r -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/rt3562sta.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_md5.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_sha2.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_hmac.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_aes.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/crypt_arc4.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/mlme.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wep.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/action.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_tkip.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_aes.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sync.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/eeprom.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_sanity.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_info.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cfg.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_wpa.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/dfs.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/spectrum.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_timer.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_channel.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_profile.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_asic.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_cmd.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/assoc.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth_rsp.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sync.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sanity.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/rtmp_data.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/connect.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/wpa.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sta_cfg.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_init_inf.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_profile.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/sta_ioctl.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_linux.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_main_dev.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ba_action.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_mac_pci.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/cmm_data_pci.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rtmp_mcu.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_prom.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/ee_efuse.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../common/rt_rf.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt30xx.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../chips/rt35xx.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_pci_rbus.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_rbus_pci_util.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/pci_main_dev.o diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_linux.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_linux.o.cmd new file mode 100644 index 000000000..601898ccb --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_linux.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_linux.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.rt_linux.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt_linux)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.tmp_rt_linux.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_linux.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_linux.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_linux.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + $(wildcard include/config/5vt/enhance.h) \ + $(wildcard include/config/apsta/mixed/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_linux.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_linux.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_linux.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_main_dev.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_main_dev.o.cmd new file mode 100644 index 000000000..d45f03b16 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_main_dev.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_main_dev.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.rt_main_dev.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt_main_dev)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.tmp_rt_main_dev.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_main_dev.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_main_dev.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_main_dev.c \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + $(wildcard include/config/5vt/enhance.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_main_dev.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_main_dev.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_main_dev.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_pci_rbus.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_pci_rbus.o.cmd new file mode 100644 index 000000000..672f49c12 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_pci_rbus.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_pci_rbus.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.rt_pci_rbus.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt_pci_rbus)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.tmp_rt_pci_rbus.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_pci_rbus.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_pci_rbus.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_pci_rbus.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_pci_rbus.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_pci_rbus.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_pci_rbus.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_profile.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_profile.o.cmd new file mode 100644 index 000000000..0e4102551 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_profile.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_profile.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.rt_profile.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt_profile)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.tmp_rt_profile.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_profile.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_profile.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_profile.c \ + $(wildcard include/config/sta/support.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_profile.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_profile.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_profile.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_rbus_pci_util.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_rbus_pci_util.o.cmd new file mode 100644 index 000000000..a84cbdc84 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.rt_rbus_pci_util.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_rbus_pci_util.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.rt_rbus_pci_util.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rt_rbus_pci_util)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.tmp_rt_rbus_pci_util.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_rbus_pci_util.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_rbus_pci_util.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_rbus_pci_util.c \ + $(wildcard include/config/5vt/enhance.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_rbus_pci_util.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_rbus_pci_util.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/rt_rbus_pci_util.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.sta_ioctl.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.sta_ioctl.o.cmd new file mode 100644 index 000000000..44dc21a86 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/.sta_ioctl.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/sta_ioctl.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.sta_ioctl.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sta_ioctl)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/.tmp_sta_ioctl.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/sta_ioctl.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/sta_ioctl.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/sta_ioctl.c \ + $(wildcard include/config/apsta/mixed/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/sta_ioctl.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/sta_ioctl.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../os/linux/sta_ioctl.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/Makefile.4 b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/Makefile.4 new file mode 100644 index 000000000..0edbc0b2f --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/Makefile.4 @@ -0,0 +1,171 @@ +include $(RT28xx_DIR)/os/linux/config.mk + +MOD_NAME = rt$(CHIPSET)sta +DAT_PATH = /etc/Wireless/RT3060STA +DAT_FILE_NAME = RT3060STA.dat + +OBJ := $(MOD_NAME).o + + +#ifdef CONFIG_STA_SUPPORT +RT28XX_STA_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/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)/sta/assoc.o\ + $(RT28xx_DIR)/sta/auth.o\ + $(RT28xx_DIR)/sta/auth_rsp.o\ + $(RT28xx_DIR)/sta/sync.o\ + $(RT28xx_DIR)/sta/sanity.o\ + $(RT28xx_DIR)/sta/rtmp_data.o\ + $(RT28xx_DIR)/sta/connect.o\ + $(RT28xx_DIR)/sta/wpa.o\ + $(RT28xx_DIR)/sta/sta_cfg.o + +ifeq ($(OSABL),NO) +RT28XX_STA_OBJ += \ + $(RT28xx_DIR)/common/rtmp_init_inf.o\ + $(RT28xx_DIR)/os/linux/rt_profile.o\ + $(RT28xx_DIR)/os/linux/sta_ioctl.o\ + $(RT28xx_DIR)/os/linux/rt_linux.o\ + $(RT28xx_DIR)/os/linux/rt_main_dev.o +endif + +#ifdef DOT11_N_SUPPORT +ifeq ($(HAS_DOT11_N_SUPPORT),y) +RT28XX_STA_OBJ += \ + $(RT28xx_DIR)/common/ba_action.o +endif +#endif // DOT11_N_SUPPORT // + +ifeq ($(HAS_BLOCK_NET_IF),y) +RT28XX_STA_OBJ += $(RT28xx_DIR)/common/netif_block.o +endif + +ifeq ($(HAS_QOS_DLS_SUPPORT),y) +RT28XX_STA_OBJ += $(RT28xx_DIR)/sta/dls.o +endif + + +#ifdef RT2860 +ifeq ($(CHIPSET),2860) +RT28XX_STA_OBJ += \ + $(RT28xx_DIR)/common/cmm_mac_pci.o\ + $(RT28xx_DIR)/common/cmm_data_pci.o\ + $(RT28xx_DIR)/common/ee_prom.o\ + $(RT28xx_DIR)/common/rtmp_mcu.o + +ifeq ($(OSABL),NO) +RT28XX_STA_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 // RT2860 // + + + + + +#ifdef RT35xx +ifeq ($(CHIPSET),3062) +RT28XX_STA_OBJ += \ + $(RT28xx_DIR)/common/cmm_mac_pci.o\ + $(RT28xx_DIR)/common/cmm_data_pci.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 ($(OSABL),NO) +RT28XX_STA_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 + +ifeq ($(CHIPSET),3562) +RT28XX_STA_OBJ += \ + $(RT28xx_DIR)/common/cmm_mac_pci.o\ + $(RT28xx_DIR)/common/cmm_data_pci.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 ($(OSABL),NO) +RT28XX_STA_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 // RT35xx // + + + +ifeq ($(HAS_ATE),y) +RT28XX_STA_OBJ += $(RT28xx_DIR)/os/linux/rt_ate.o +endif + +#endif // CONFIG_STA_SUPPORT // + +all:$(OBJ) + +rt$(CHIPSET)sta.o: $(RT28XX_STA_OBJ) + $(LD) -r $^ -o $@ + +clean: + rm -f $(RT28xx_DIR)/common/*.o + rm -f $(RT28xx_DIR)/common/.*.{cmd,flags,d} + rm -f $(RT28xx_DIR)/os/linux/*.{o,ko,mod.{o,c}} + rm -f $(RT28xx_DIR)/os/linux/.*.{cmd,flags,d} + rm -fr $(RT28xx_DIR)/os/linux/.tmp_versions + rm -f $(RT28xx_DIR)/chips/*.o + rm -f $(RT28xx_DIR)/chips/.*.{cmd,flags,d} + rm -f $(RT28xx_DIR)/sta/*.o + rm -f $(RT28xx_DIR)/sta/.*.{cmd,flags,d} + +install: + rm -rf $(DAT_PATH) + #$(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless) + #mkdir $(DAT_PATH) + $(shell [ ! -f /etc/Wireless ] && mkdir -p /etc/Wireless) + mkdir -p $(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} diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/Makefile.6 b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/Makefile.6 new file mode 100644 index 000000000..fd9e32268 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/Makefile.6 @@ -0,0 +1,206 @@ +include $(RT28xx_DIR)/os/linux/config.mk + +MOD_NAME = rt$(CHIPSET)sta +DAT_PATH = /etc/Wireless/RT3060STA +DAT_FILE_NAME = RT3060STA.dat + +obj-m := $(MOD_NAME).o + +#ifdef CONFIG_STA_SUPPORT +rt$(CHIPSET)sta-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/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/dfs.o\ + ../../common/spectrum.o\ + ../../common/rtmp_timer.o\ + ../../common/rt_channel.o\ + ../../common/cmm_profile.o\ + ../../common/cmm_asic.o\ + ../../common/cmm_cmd.o\ + ../../sta/assoc.o\ + ../../sta/auth.o\ + ../../sta/auth_rsp.o\ + ../../sta/sync.o\ + ../../sta/sanity.o\ + ../../sta/rtmp_data.o\ + ../../sta/connect.o\ + ../../sta/wpa.o\ + ../../sta/sta_cfg.o + +ifeq ($(OSABL),NO) +rt$(CHIPSET)sta-objs += \ + ../../common/rtmp_init_inf.o\ + ../../os/linux/rt_profile.o\ + ../../os/linux/sta_ioctl.o\ + ../../os/linux/rt_linux.o\ + ../../os/linux/rt_main_dev.o +endif + +#ifdef DOT11_N_SUPPORT +ifeq ($(HAS_DOT11_N_SUPPORT),y) +rt$(CHIPSET)sta-objs += \ + ../../common/ba_action.o +endif +#endif // DOT11_N_SUPPORT // + +ifeq ($(HAS_BLOCK_NET_IF),y) +rt$(CHIPSET)sta-objs += ../../common/netif_block.o +endif + +ifeq ($(HAS_QOS_DLS_SUPPORT),y) +rt$(CHIPSET)sta-objs += ../../sta/dls.o +endif + + +#ifdef RT2860 +ifeq ($(CHIPSET),2860) +rt$(CHIPSET)sta-objs += \ + ../../common/cmm_mac_pci.o\ + ../../common/cmm_data_pci.o\ + ../../common/ee_prom.o\ + ../../common/rtmp_mcu.o + +ifeq ($(OSABL),NO) +rt$(CHIPSET)sta-objs += \ + ../../os/linux/rt_pci_rbus.o\ + ../../os/linux/rt_rbus_pci_util.o\ + ../../os/linux/pci_main_dev.o +endif +endif +#endif // RT2860 // + + + + + +#ifdef RT35xx +ifeq ($(CHIPSET),3572) +rt$(CHIPSET)sta-objs += \ + ../../common/cmm_mac_usb.o\ + ../../common/rtusb_io.o\ + ../../common/rtusb_bulk.o\ + ../../common/rtusb_data.o\ + ../../common/cmm_data_usb.o\ + ../../common/ee_prom.o\ + ../../common/ee_efuse.o\ + ../../common/rtmp_mcu.o\ + ../../chips/rt30xx.o\ + ../../common/rt_rf.o\ + ../../chips/rt35xx.o + +ifeq ($(OSABL),NO) +rt$(CHIPSET)sta-objs += \ + ../../common/rtusb_dev_id.o\ + ../../os/linux/rt_usb.o\ + ../../os/linux/rt_usb_util.o\ + ../../os/linux/usb_main_dev.o +endif +endif + +ifeq ($(CHIPSET),3062) +rt$(CHIPSET)sta-objs += \ + ../../common/cmm_mac_pci.o\ + ../../common/cmm_data_pci.o\ + ../../common/rtmp_mcu.o\ + ../../common/ee_prom.o\ + ../../common/ee_efuse.o\ + ../../common/rt_rf.o\ + ../../chips/rt30xx.o\ + ../../chips/rt35xx.o + +ifeq ($(OSABL),NO) +rt$(CHIPSET)sta-objs += \ + ../../os/linux/rt_pci_rbus.o\ + ../../os/linux/rt_rbus_pci_util.o\ + ../../os/linux/pci_main_dev.o +endif +endif + +ifeq ($(CHIPSET),3562) +rt$(CHIPSET)sta-objs += \ + ../../common/cmm_mac_pci.o\ + ../../common/cmm_data_pci.o\ + ../../common/rtmp_mcu.o\ + ../../common/ee_prom.o\ + ../../common/ee_efuse.o\ + ../../common/rt_rf.o\ + ../../chips/rt30xx.o\ + ../../chips/rt35xx.o + +ifeq ($(OSABL),NO) +rt$(CHIPSET)sta-objs += \ + ../../os/linux/rt_pci_rbus.o\ + ../../os/linux/rt_rbus_pci_util.o\ + ../../os/linux/pci_main_dev.o +endif +endif +#endif // RT35xx // + + + +ifeq ($(HAS_ATE),y) +rt$(CHIPSET)sta-objs += ../../os/linux/rt_ate.o +endif + + + + + + +#ifdef CRDA_SUPPORT +ifeq ($(OSABL),NO) +ifeq ($(HAS_CFG80211_SUPPORT),y) +rt$(CHIPSET)sta-objs += \ + ../../os/linux/cfg80211.o +endif +endif +#endif // CRDA_SUPPORT // + +#endif // CONFIG_STA_SUPPORT // + + +clean: + rm -f ../../common/*.o + rm -f ../../common/.*.{cmd,flags,d} + rm -f ../../os/linux/*.{o,ko,mod.{o,c}} + rm -f ../../os/linux/.*.{cmd,flags,d} + rm -fr ../../os/linux/.tmp_versions + rm -f ../../os/linux/Module.symvers + rm -f ../../os/linux/Module.markers + rm -f ../../os/linux/modules.order + rm -f ../../chips/*.o + rm -f ../../chips/.*.{cmd,flags,d} + rm -f ../../sta/*.o + rm -f ../../sta/.*.{cmd,flags,d} + +install: + rm -rf $(DAT_PATH) + #$(shell [ ! -f /etc/Wireless ] && mkdir /etc/Wireless) + #mkdir $(DAT_PATH) + $(shell [ ! -f /etc/Wireless ] && mkdir -p /etc/Wireless) + mkdir -p $(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} diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/cfg80211.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/cfg80211.c new file mode 100644 index 000000000..afceeb00e --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/cfg80211.c @@ -0,0 +1,2814 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + *************************************************************************/ + +/**************************************************************************** + + Abstract: + + All related CRDA (Central Regulatory Domain Agent) function body. + + History: + 1. 2009/09/17 Sample Lin + (1) Init version. + 2. 2009/10/27 Sample Lin + (1) Do not use ieee80211_register_hw() to create virtual interface. + Use wiphy_register() to register nl80211 command handlers. + (2) Support iw utility. + 3. 2009/11/03 Sample Lin + (1) Change name MAC80211 to CFG80211. + (2) Modify CFG80211_OpsSetChannel(). + (3) Move CFG80211_Register()/CFG80211_UnRegister() to open/close. + 4. 2009/12/16 Sample Lin + (1) Patch for Linux 2.6.32. + (2) Add more supported functions in CFG80211_Ops. + + Note: + The feature is supported only in "LINUX" 2.6.28 ~ 2.6.32. + +***************************************************************************/ + +#include "rt_config.h" + + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,28)) +#ifdef RT_CFG80211_SUPPORT + +#define RT_CFG80211_DEBUG /* debug use */ +#define CFG80211CB ((CFG80211_CB *)(pAd->pCfg80211_CB)) + + +#ifdef RT_CFG80211_DEBUG +#define CFG80211DBG(__Flg, __pMsg) DBGPRINT(__Flg, __pMsg) +#else +#define CFG80211DBG(__Flg, __pMsg) +#endif // RT_CFG80211_DEBUG // + +/* 1 ~ 14 */ +#define CFG80211_NUM_OF_CHAN_2GHZ 14 + +/* 36 ~ 64, 100 ~ 136, 140 ~ 161 */ +#define CFG80211_NUM_OF_CHAN_5GHZ \ + (sizeof(Cfg80211_Chan)-CFG80211_NUM_OF_CHAN_2GHZ) + +/* + Array of bitrates the hardware can operate with + in this band. Must be sorted to give a valid "supported + rates" IE, i.e. CCK rates first, then OFDM. + + For HT, assign MCS in another structure, ieee80211_sta_ht_cap. +*/ +const struct ieee80211_rate Cfg80211_SupRate[12] = { + { + .flags = IEEE80211_RATE_SHORT_PREAMBLE, + .bitrate = 10, + .hw_value = 0, + .hw_value_short = 0, + }, + { + .flags = IEEE80211_RATE_SHORT_PREAMBLE, + .bitrate = 20, + .hw_value = 1, + .hw_value_short = 1, + }, + { + .flags = IEEE80211_RATE_SHORT_PREAMBLE, + .bitrate = 55, + .hw_value = 2, + .hw_value_short = 2, + }, + { + .flags = IEEE80211_RATE_SHORT_PREAMBLE, + .bitrate = 110, + .hw_value = 3, + .hw_value_short = 3, + }, + { + .flags = 0, + .bitrate = 60, + .hw_value = 4, + .hw_value_short = 4, + }, + { + .flags = 0, + .bitrate = 90, + .hw_value = 5, + .hw_value_short = 5, + }, + { + .flags = 0, + .bitrate = 120, + .hw_value = 6, + .hw_value_short = 6, + }, + { + .flags = 0, + .bitrate = 180, + .hw_value = 7, + .hw_value_short = 7, + }, + { + .flags = 0, + .bitrate = 240, + .hw_value = 8, + .hw_value_short = 8, + }, + { + .flags = 0, + .bitrate = 360, + .hw_value = 9, + .hw_value_short = 9, + }, + { + .flags = 0, + .bitrate = 480, + .hw_value = 10, + .hw_value_short = 10, + }, + { + .flags = 0, + .bitrate = 540, + .hw_value = 11, + .hw_value_short = 11, + }, +}; + +/* all available channels */ +static const UCHAR Cfg80211_Chan[] = { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + + /* 802.11 UNI / HyperLan 2 */ + 36, 38, 40, 44, 46, 48, 52, 54, 56, 60, 62, 64, + + /* 802.11 HyperLan 2 */ + 100, 104, 108, 112, 116, 118, 120, 124, 126, 128, 132, 134, 136, + + /* 802.11 UNII */ + 140, 149, 151, 153, 157, 159, 161, 165, 167, 169, 171, 173, + + /* Japan */ + 184, 188, 192, 196, 208, 212, 216, +}; + + +static const UINT32 CipherSuites[] = { + WLAN_CIPHER_SUITE_WEP40, + WLAN_CIPHER_SUITE_WEP104, + WLAN_CIPHER_SUITE_TKIP, + WLAN_CIPHER_SUITE_CCMP, +}; + + +typedef struct __CFG80211_CB +{ + /* we can change channel/rate information on the fly so we backup them */ + struct ieee80211_supported_band Cfg80211_bands[IEEE80211_NUM_BANDS]; + struct ieee80211_channel *pCfg80211_Channels; + struct ieee80211_rate *pCfg80211_Rates; + + /* used in wiphy_unregister */ + struct wireless_dev *pCfg80211_Wdev; + + /* used in scan end */ + struct cfg80211_scan_request *pCfg80211_ScanReq; + + /* monitor filter */ + UINT32 MonFilterFlag; +} CFG80211_CB; + +/* + The driver's regulatory notification callback. +*/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) +static INT32 CFG80211_RegNotifier( + IN struct wiphy *pWiphy, + IN struct regulatory_request *pRequest); +#else +static INT32 CFG80211_RegNotifier( + IN struct wiphy *pWiphy, + IN enum reg_set_by Request); +#endif // LINUX_VERSION_CODE // + +/* + Initialize wireless channel in 2.4GHZ and 5GHZ. +*/ +static BOOLEAN CFG80211_SupBandInit( + IN PRTMP_ADAPTER pAd, + IN struct wiphy *pWiphy, + IN struct ieee80211_channel *pChannels, + IN struct ieee80211_rate *pRates); + + + + +/* =========================== Private Function ============================== */ + +/* get RALINK pAd control block in 80211 Ops */ +#define MAC80211_PAD_GET(__pAd, __pWiphy) \ + { \ + ULONG *__pPriv; \ + __pPriv = (ULONG *)(wiphy_priv(__pWiphy)); \ + __pAd = (PRTMP_ADAPTER)(*__pPriv); \ + if (__pAd == NULL) \ + { \ + DBGPRINT(RT_DEBUG_ERROR, \ + ("80211> %s but pAd = NULL!", __FUNCTION__)); \ + return -EINVAL; \ + } \ + } + +/* +======================================================================== +Routine Description: + Set channel. + +Arguments: + pWiphy - Wireless hardware description + pChan - Channel information + ChannelType - Channel type + +Return Value: + 0 - success + -x - fail + +Note: + For iw utility: set channel, set freq + + enum nl80211_channel_type { + NL80211_CHAN_NO_HT, + NL80211_CHAN_HT20, + NL80211_CHAN_HT40MINUS, + NL80211_CHAN_HT40PLUS + }; +======================================================================== +*/ +static int CFG80211_OpsSetChannel( + IN struct wiphy *pWiphy, + IN struct ieee80211_channel *pChan, + IN enum nl80211_channel_type ChannelType) +{ + PRTMP_ADAPTER pAd; + UINT32 ChanId; + STRING ChStr[5] = { 0 }; +#ifdef DOT11_N_SUPPORT + UCHAR BW_Old; + BOOLEAN FlgIsChanged; +#endif // DOT11_N_SUPPORT // + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_OpsSetChannel ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + + /* get channel number */ + ChanId = ieee80211_frequency_to_channel(pChan->center_freq); + CFG80211DBG(RT_DEBUG_ERROR, ("80211> Channel = %d\n", ChanId)); + CFG80211DBG(RT_DEBUG_ERROR, ("80211> ChannelType = %d\n", ChannelType)); + +#ifdef DOT11_N_SUPPORT + if (CFG80211CB->pCfg80211_Wdev->iftype != NL80211_IFTYPE_MONITOR) + { + /* get channel BW */ + FlgIsChanged = FALSE; + BW_Old = pAd->CommonCfg.RegTransmitSetting.field.BW; + + /* set to new channel BW */ + if (ChannelType == NL80211_CHAN_HT20) + { + pAd->CommonCfg.RegTransmitSetting.field.BW = BW_20; + FlgIsChanged = TRUE; + } + else if ((ChannelType == NL80211_CHAN_HT40MINUS) || + (ChannelType == NL80211_CHAN_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 == NL80211_CHAN_NO_HT) && + (pAd->CommonCfg.HT_Disable == 0)) || + ((ChannelType != NL80211_CHAN_NO_HT) && + (pAd->CommonCfg.HT_Disable == 1))) + { + if (ChannelType == NL80211_CHAN_NO_HT) + 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 */ + +#ifdef CONFIG_STA_SUPPORT +#ifdef DOT11_N_SUPPORT + if ((CFG80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_STATION) && + (FlgIsChanged == TRUE)) + { + /* + 1. Station mode; + 2. New BW settings is 20MHz but current BW is not 20MHz; + 3. New BW settings is 40MHz but current BW is 20MHz; + + Re-connect to the AP due to BW 20/40 or HT/non-HT change. + */ + Set_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid); + } /* End of if */ +#endif // DOT11_N_SUPPORT // + + if (CFG80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_ADHOC) + { + /* update IBSS beacon */ + MlmeUpdateTxRates(pAd, FALSE, 0); + MakeIbssBeacon(pAd); + AsicEnableIbssSync(pAd); + + Set_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid); + } /* End of if */ + + if (CFG80211CB->pCfg80211_Wdev->iftype == NL80211_IFTYPE_MONITOR) + { + /* reset monitor mode in the new channel */ + Set_NetworkType_Proc(pAd, "Monitor"); + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, CFG80211CB->MonFilterFlag); + } /* End of if */ +#endif // CONFIG_STA_SUPPORT // + + return 0; +} /* End of CFG80211_OpsSetChannel */ + + +/* +======================================================================== +Routine Description: + Change type/configuration of virtual interface. + +Arguments: + pWiphy - Wireless hardware description + IfIndex - Interface index + Type - Interface type, managed/adhoc/ap/station, etc. + pFlags - Monitor flags + pParams - Mesh parameters + +Return Value: + 0 - success + -x - fail + +Note: + For iw utility: set type, set monitor +======================================================================== +*/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)) +static int CFG80211_OpsChgVirtualInf( + IN struct wiphy *pWiphy, + IN struct net_device *pNetDevIn, + IN enum nl80211_iftype Type, + IN u32 *pFlags, + struct vif_params *pParams) +#else +static int CFG80211_OpsChgVirtualInf( + IN struct wiphy *pWiphy, + IN int IfIndex, + IN enum nl80211_iftype Type, + IN u32 *pFlags, + struct vif_params *pParams) +#endif // LINUX_VERSION_CODE // +{ + PRTMP_ADAPTER pAd; + struct net_device *pNetDev; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_OpsChgVirtualInf ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> Type = %d\n", Type)); + + /* sanity check */ +#ifdef CONFIG_STA_SUPPORT + if ((Type != NL80211_IFTYPE_ADHOC) && + (Type != NL80211_IFTYPE_STATION) && + (Type != NL80211_IFTYPE_MONITOR)) +#endif // CONFIG_STA_SUPPORT // + { + DBGPRINT(RT_DEBUG_ERROR, ("80211> Wrong interface type %d!\n", Type)); + return -EINVAL; + } /* End of if */ + + /* update interface type */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)) + pNetDev = pNetDevIn; +#else + pNetDev = __dev_get_by_index(&init_net, IfIndex); +#endif // LINUX_VERSION_CODE // + + if (pNetDev == NULL) + return -ENODEV; + /* End of if */ + + pNetDev->ieee80211_ptr->iftype = Type; + + /* change type */ +#ifdef CONFIG_STA_SUPPORT + if (Type == NL80211_IFTYPE_ADHOC) + Set_NetworkType_Proc(pAd, "Adhoc"); + else if (Type == NL80211_IFTYPE_STATION) + Set_NetworkType_Proc(pAd, "Infra"); +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,20)) + else if (Type == NL80211_IFTYPE_MONITOR) + { + /* set packet filter */ + Set_NetworkType_Proc(pAd, "Monitor"); + + if (pFlags != NULL) + { + UINT32 Filter; + + + RTMP_IO_READ32(pAd, RX_FILTR_CFG, &Filter); + + if (((*pFlags) & NL80211_MNTR_FLAG_FCSFAIL) == NL80211_MNTR_FLAG_FCSFAIL) + Filter = Filter & (~0x01); + else + Filter = Filter | 0x01; + /* End of if */ + + if (((*pFlags) & NL80211_MNTR_FLAG_FCSFAIL) == NL80211_MNTR_FLAG_PLCPFAIL) + Filter = Filter & (~0x02); + else + Filter = Filter | 0x02; + /* End of if */ + + if (((*pFlags) & NL80211_MNTR_FLAG_CONTROL) == NL80211_MNTR_FLAG_CONTROL) + Filter = Filter & (~0xFF00); + else + Filter = Filter | 0xFF00; + /* End of if */ + + if (((*pFlags) & NL80211_MNTR_FLAG_CONTROL) == NL80211_MNTR_FLAG_OTHER_BSS) + Filter = Filter & (~0x08); + else + Filter = Filter | 0x08; + /* End of if */ + + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Filter); + CFG80211CB->MonFilterFlag = Filter; + } /* End of if */ + + return 0; /* not need to set SSID */ + } /* End of if */ +#endif // LINUX_VERSION_CODE // + + pAd->StaCfg.bAutoReconnect = TRUE; + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> SSID = %s\n", pAd->CommonCfg.Ssid)); + Set_SSID_Proc(pAd, (PSTRING)pAd->CommonCfg.Ssid); +#endif // CONFIG_STA_SUPPORT // + + return 0; +} /* End of CFG80211_OpsChgVirtualInf */ + + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) +#ifdef CONFIG_STA_SUPPORT +/* +======================================================================== +Routine Description: + Request to do a scan. If returning zero, the scan request is given + the driver, and will be valid until passed to cfg80211_scan_done(). + For scan results, call cfg80211_inform_bss(); you can call this outside + the scan/scan_done bracket too. + +Arguments: + pWiphy - Wireless hardware description + pNdev - Network device interface + pRequest - Scan request + +Return Value: + 0 - success + -x - fail + +Note: + For iw utility: scan + + struct cfg80211_scan_request { + struct cfg80211_ssid *ssids; + int n_ssids; + struct ieee80211_channel **channels; + u32 n_channels; + const u8 *ie; + size_t ie_len; + + * @ssids: SSIDs to scan for (active scan only) + * @n_ssids: number of SSIDs + * @channels: channels to scan on. + * @n_channels: number of channels for each band + * @ie: optional information element(s) to add into Probe Request or %NULL + * @ie_len: length of ie in octets +======================================================================== +*/ +static int CFG80211_OpsScan( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN struct cfg80211_scan_request *pRequest) +{ + PRTMP_ADAPTER pAd; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_OpsScan ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + + /* sanity check */ + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("80211> Network is down!\n")); + return -ENETDOWN; + } /* End of if */ + + if ((pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_STATION) && + (pNdev->ieee80211_ptr->iftype != NL80211_IFTYPE_ADHOC)) + { + return -EOPNOTSUPP; + } /* End of if */ + + if (pAd->FlgCfg80211Scanning == TRUE) + return -EBUSY; /* scanning */ + /* End of if */ + + /* do scan */ + pAd->FlgCfg80211Scanning = TRUE; + CFG80211CB->pCfg80211_ScanReq = pRequest; /* used in scan end */ + + rt_ioctl_siwscan(pNdev, NULL, NULL, NULL); + return 0; +} /* End of CFG80211_OpsScan */ +#endif // CONFIG_STA_SUPPORT // +#endif // LINUX_VERSION_CODE // + + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)) +#ifdef CONFIG_STA_SUPPORT +/* +======================================================================== +Routine Description: + Join the specified IBSS (or create if necessary). Once done, call + cfg80211_ibss_joined(), also call that function when changing BSSID due + to a merge. + +Arguments: + pWiphy - Wireless hardware description + pNdev - Network device interface + pParams - IBSS parameters + +Return Value: + 0 - success + -x - fail + +Note: + For iw utility: ibss join + + No fixed-freq and fixed-bssid support. +======================================================================== +*/ +static int CFG80211_OpsJoinIbss( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN struct cfg80211_ibss_params *pParams) +{ + PRTMP_ADAPTER pAd; + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_OpsJoinIbss ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> SSID = %s\n", + pParams->ssid)); + CFG80211DBG(RT_DEBUG_ERROR, ("80211> Beacon Interval = %d\n", + pParams->beacon_interval)); + + pAd->StaCfg.bAutoReconnect = TRUE; + + pAd->CommonCfg.BeaconPeriod = pParams->beacon_interval; + Set_SSID_Proc(pAd, (PSTRING)pParams->ssid); + + return 0; +} /* End of CFG80211_OpsJoinIbss */ + + +/* +======================================================================== +Routine Description: + Leave the IBSS. + +Arguments: + pWiphy - Wireless hardware description + pNdev - Network device interface + +Return Value: + 0 - success + -x - fail + +Note: + For iw utility: ibss leave +======================================================================== +*/ +static int CFG80211_OpsLeaveIbss( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev) +{ + PRTMP_ADAPTER pAd; + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_OpsLeaveIbss ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + + pAd->StaCfg.bAutoReconnect = FALSE; + LinkDown(pAd, FALSE); + + return 0; +} /* End of CFG80211_OpsLeaveIbss */ +#endif // CONFIG_STA_SUPPORT // +#endif // LINUX_VERSION_CODE // + + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)) +/* +======================================================================== +Routine Description: + Set the transmit power according to the parameters. + +Arguments: + pWiphy - Wireless hardware description + Type - + dBm - dBm + +Return Value: + 0 - success + -x - fail + +Note: + Type - + TX_POWER_AUTOMATIC: the dbm parameter is ignored + TX_POWER_LIMITED: limit TX power by the dbm parameter + TX_POWER_FIXED: fix TX power to the dbm parameter +======================================================================== +*/ +static int CFG80211_TxPwrSet( + IN struct wiphy *pWiphy, + IN enum tx_power_setting Type, + IN int dBm) +{ + return -EOPNOTSUPP; +} /* End of CFG80211_TxPwrSet */ + + +/* +======================================================================== +Routine Description: + Store the current TX power into the dbm variable. + +Arguments: + pWiphy - Wireless hardware description + pdBm - dBm + +Return Value: + 0 - success + -x - fail + +Note: +======================================================================== +*/ +static int CFG80211_TxPwrGet( + IN struct wiphy *pWiphy, + IN int *pdBm) +{ + return -EOPNOTSUPP; +} /* End of CFG80211_TxPwrGet */ + + +/* +======================================================================== +Routine Description: + Power management. + +Arguments: + pWiphy - Wireless hardware description + pNdev - + FlgIsEnabled - + Timeout - + +Return Value: + 0 - success + -x - fail + +Note: +======================================================================== +*/ +static int CFG80211_PwrMgmt( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN bool FlgIsEnabled, + IN int Timeout) +{ + return -EOPNOTSUPP; +} /* End of CFG80211_PwrMgmt */ + + +/* +======================================================================== +Routine Description: + Get information for a specific station. + +Arguments: + pWiphy - Wireless hardware description + pNdev - + pMac - STA MAC + pSinfo - STA INFO + +Return Value: + 0 - success + -x - fail + +Note: +======================================================================== +*/ +static int CFG80211_StaGet( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN UINT8 *pMac, + IN struct station_info *pSinfo) +{ + PRTMP_ADAPTER pAd; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_StaGet ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + + memset(pSinfo, 0, sizeof(*pSinfo)); + + +#ifdef CONFIG_STA_SUPPORT +{ + HTTRANSMIT_SETTING PhyInfo; + ULONG DataRate = 0; + UINT32 RSSI; + + + /* fill tx rate */ + if ((pAd->CommonCfg.PhyMode <= PHY_11G) || + (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM)) + { + PhyInfo.word = pAd->StaCfg.HTPhyMode.word; + } + else + PhyInfo.word = pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word; + /* End of if */ + + getRate(PhyInfo, &DataRate); + + if ((PhyInfo.field.MODE == MODE_HTMIX) || + (PhyInfo.field.MODE == MODE_HTGREENFIELD)) + { + pSinfo->txrate.flags = RATE_INFO_FLAGS_MCS; + if (PhyInfo.field.BW) + pSinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH; + /* End of if */ + if (PhyInfo.field.ShortGI) + pSinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; + /* End of if */ + + pSinfo->txrate.mcs = PhyInfo.field.MCS; + } + else + { + pSinfo->txrate.legacy = DataRate*10; /* unit: 100kbps */ + } /* End of if */ + + pSinfo->filled |= STATION_INFO_TX_BITRATE; + + /* fill signal */ + RSSI = (pAd->StaCfg.RssiSample.AvgRssi0 + + pAd->StaCfg.RssiSample.AvgRssi1 + + pAd->StaCfg.RssiSample.AvgRssi2) / 3; + pSinfo->signal = le32_to_cpu(RSSI); + pSinfo->filled |= STATION_INFO_SIGNAL; +} +#endif // CONFIG_STA_SUPPORT // + + return 0; +} /* End of CFG80211_StaGet */ + + +/* +======================================================================== +Routine Description: + List all stations known, e.g. the AP on managed interfaces. + +Arguments: + pWiphy - Wireless hardware description + pNdev - + Idx - + pMac - + pSinfo - + +Return Value: + 0 - success + -x - fail + +Note: +======================================================================== +*/ +static int CFG80211_StaDump( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN int Idx, + IN UINT8 *pMac, + IN struct station_info *pSinfo) +{ + PRTMP_ADAPTER pAd; + + + if (Idx != 0) + return -ENOENT; + /* End of if */ + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_StaDump ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + +#ifdef CONFIG_STA_SUPPORT + if (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) + { + memcpy(pMac, pAd->MlmeAux.Bssid, 6); + return CFG80211_StaGet(pWiphy, pNdev, pMac, pSinfo); + } + else + return -EBUSY; + /* End of if */ +#endif // CONFIG_STA_SUPPORT // + + return -EOPNOTSUPP; +} /* End of CFG80211_StaDump */ + + +/* +======================================================================== +Routine Description: + Notify that wiphy parameters have changed. + +Arguments: + pWiphy - Wireless hardware description + Changed - + +Return Value: + 0 - success + -x - fail + +Note: +======================================================================== +*/ +static int CFG80211_WiphyParamsSet( + IN struct wiphy *pWiphy, + IN UINT32 Changed) +{ + return -EOPNOTSUPP; +} /* End of CFG80211_WiphyParamsSet */ + + +/* +======================================================================== +Routine Description: + Add a key with the given parameters. + +Arguments: + pWiphy - Wireless hardware description + pNdev - + KeyIdx - + pMacAddr - + pParams - + +Return Value: + 0 - success + -x - fail + +Note: + pMacAddr will be NULL when adding a group key. +======================================================================== +*/ +static int CFG80211_KeyAdd( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN UINT8 KeyIdx, + IN const UINT8 *pMacAddr, + IN struct key_params *pParams) +{ + PRTMP_ADAPTER pAd; + UCHAR KeyBuf[50]; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_KeyAdd ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + +#ifdef RT_CFG80211_DEBUG + hex_dump("KeyBuf=", (UINT8 *)pParams->key, pParams->key_len); +#endif // RT_CFG80211_DEBUG // + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> KeyIdx = %d\n", KeyIdx)); + + if (pParams->key_len >= sizeof(KeyBuf)) + return -EINVAL; + /* End of if */ + + memcpy(KeyBuf, pParams->key, pParams->key_len); + KeyBuf[pParams->key_len] = 0x00; + +#ifdef CONFIG_STA_SUPPORT + switch(pParams->cipher) + { + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + switch(KeyIdx+1) + { + case 1: + default: + Set_Key1_Proc(pAd, (PSTRING)KeyBuf); + break; + + case 2: + Set_Key2_Proc(pAd, (PSTRING)KeyBuf); + break; + + case 3: + Set_Key3_Proc(pAd, (PSTRING)KeyBuf); + break; + + case 4: + Set_Key4_Proc(pAd, (PSTRING)KeyBuf); + break; + } /* End of switch */ + break; + + case WLAN_CIPHER_SUITE_TKIP: + case WLAN_CIPHER_SUITE_CCMP: + Set_WPAPSK_Proc(pAd, (PSTRING)KeyBuf); + break; + + default: + return -ENOTSUPP; + } /* End of switch */ + + return 0; +#endif // CONFIG_STA_SUPPORT // + +} /* End of CFG80211_KeyAdd */ + + +/* +======================================================================== +Routine Description: + Get information about the key with the given parameters. + +Arguments: + pWiphy - Wireless hardware description + pNdev - + KeyIdx - + pMacAddr - + pCookie - + pCallback - + +Return Value: + 0 - success + -x - fail + +Note: + pMacAddr will be NULL when requesting information for a group key. + + All pointers given to the pCallback function need not be valid after + it returns. + + This function should return an error if it is not possible to + retrieve the key, -ENOENT if it doesn't exist. +======================================================================== +*/ +static int CFG80211_KeyGet( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN UINT8 KeyIdx, + IN const UINT8 *pMacAddr, + IN void *pCookie, + IN void (*pCallback)(void *cookie, + struct key_params *)) +{ + + return -ENOTSUPP; +} /* End of CFG80211_KeyGet */ + + +/* +======================================================================== +Routine Description: + Remove a key given the pMacAddr (NULL for a group key) and KeyIdx. + +Arguments: + pWiphy - Wireless hardware description + pNdev - + KeyIdx - + pMacAddr - + +Return Value: + 0 - success + -x - fail + +Note: + return -ENOENT if the key doesn't exist. +======================================================================== +*/ +static int CFG80211_KeyDel( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN UINT8 KeyIdx, + IN const UINT8 *pMacAddr) +{ + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_KeyDel ==>\n")); + return -ENOTSUPP; +} /* End of CFG80211_KeyDel */ + + +/* +======================================================================== +Routine Description: + Set the default key on an interface. + +Arguments: + pWiphy - Wireless hardware description + pNdev - + KeyIdx - + +Return Value: + 0 - success + -x - fail + +Note: +======================================================================== +*/ +static int CFG80211_KeyDefaultSet( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN UINT8 KeyIdx) +{ + PRTMP_ADAPTER pAd; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_KeyDefaultSet ==>\n")); + MAC80211_PAD_GET(pAd, pWiphy); + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> KeyIdx = %d\n", KeyIdx)); + +#ifdef CONFIG_STA_SUPPORT + pAd->StaCfg.DefaultKeyId = KeyIdx; /* base 0 */ +#endif // CONFIG_STA_SUPPORT // + return 0; +} /* End of CFG80211_KeyDefaultSet */ + + +#ifdef CONFIG_STA_SUPPORT +/* +======================================================================== +Routine Description: + Connect to the ESS with the specified parameters. When connected, + call cfg80211_connect_result() with status code %WLAN_STATUS_SUCCESS. + If the connection fails for some reason, call cfg80211_connect_result() + with the status from the AP. + +Arguments: + pWiphy - Wireless hardware description + pNdev - Network device interface + pSme - + +Return Value: + 0 - success + -x - fail + +Note: + For iw utility: connect + + You must use "iw ra0 connect xxx", then "iw ra0 disconnect"; + You can not use "iw ra0 connect xxx" twice without disconnect; + Or you will suffer "command failed: Operation already in progress (-114)". + + You must support add_key and set_default_key function; + Or kernel will crash without any error message in linux 2.6.32. +======================================================================== +*/ +static int CFG80211_Connect( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN struct cfg80211_connect_params *pSme) +{ + PRTMP_ADAPTER pAd; + struct ieee80211_channel *pChannel = pSme->channel; + UCHAR SSID[NDIS_802_11_LENGTH_SSID]; + INT32 Pairwise = 0; + INT32 Groupwise = 0; + INT32 Keymgmt = 0; + INT32 WpaVersion = NL80211_WPA_VERSION_2; + INT32 Chan = -1, Idx, SSIDLen; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_Connect ==>\n")); + + /* init */ + MAC80211_PAD_GET(pAd, pWiphy); + + if (pChannel != NULL) + Chan = ieee80211_frequency_to_channel(pChannel->center_freq); + + Groupwise = pSme->crypto.cipher_group; + for(Idx=0; Idx<pSme->crypto.n_ciphers_pairwise; Idx++) + Pairwise |= pSme->crypto.ciphers_pairwise[Idx]; + /* End of for */ + + for(Idx=0; Idx<pSme->crypto.n_akm_suites; Idx++) + Keymgmt |= pSme->crypto.akm_suites[Idx]; + /* End of for */ + + WpaVersion = pSme->crypto.wpa_versions; + + /* change to infrastructure mode if we are in ADHOC mode */ + Set_NetworkType_Proc(pAd, "Infra"); + + /* set authentication mode */ + if (WpaVersion & NL80211_WPA_VERSION_2) + { + if (Keymgmt & WLAN_AKM_SUITE_8021X) + Set_AuthMode_Proc(pAd, "WPA2"); + else + Set_AuthMode_Proc(pAd, "WPA2PSK"); + /* End of if */ + } + else if (WpaVersion & NL80211_WPA_VERSION_1) + { + if (Keymgmt & WLAN_AKM_SUITE_8021X) + Set_AuthMode_Proc(pAd, "WPA"); + else + Set_AuthMode_Proc(pAd, "WPAPSK"); + /* End of if */ + } + else if (pSme->auth_type == NL80211_AUTHTYPE_SHARED_KEY) + Set_AuthMode_Proc(pAd, "SHARED"); + else if (pSme->auth_type == NL80211_AUTHTYPE_OPEN_SYSTEM) + Set_AuthMode_Proc(pAd, "OPEN"); + else + Set_AuthMode_Proc(pAd, "OPEN"); + /* End of if */ + + CFG80211DBG(RT_DEBUG_ERROR, + ("80211> SME %x, AuthMode = %d\n", + pSme->auth_type, pAd->StaCfg.AuthMode)); + + /* set encryption mode */ + if (Pairwise & WLAN_CIPHER_SUITE_CCMP) + Set_EncrypType_Proc(pAd, "AES"); + else if (Pairwise & WLAN_CIPHER_SUITE_TKIP) + Set_EncrypType_Proc(pAd, "TKIP"); + else if ((Pairwise & WLAN_CIPHER_SUITE_WEP40) || + (Pairwise & WLAN_CIPHER_SUITE_WEP104)) + { + Set_EncrypType_Proc(pAd, "WEP"); + } + else if (Groupwise & WLAN_CIPHER_SUITE_CCMP) + Set_EncrypType_Proc(pAd, "AES"); + else if (Groupwise & WLAN_CIPHER_SUITE_TKIP) + Set_EncrypType_Proc(pAd, "TKIP"); + else + Set_EncrypType_Proc(pAd, "NONE"); + /* End of if */ + + CFG80211DBG(RT_DEBUG_ERROR, + ("80211> EncrypType = %d\n", pAd->StaCfg.WepStatus)); + + /* set channel: STATION will auto-scan */ + + /* set WEP key */ + if (pSme->key && (((Groupwise | Pairwise) & WLAN_CIPHER_SUITE_WEP40) || + ((Groupwise | Pairwise) & WLAN_CIPHER_SUITE_WEP104))) + { + UCHAR KeyBuf[50]; + + /* reset AuthMode and EncrypType */ + Set_AuthMode_Proc(pAd, "SHARED"); + Set_EncrypType_Proc(pAd, "WEP"); + + /* reset key */ +#ifdef RT_CFG80211_DEBUG + hex_dump("KeyBuf=", (UINT8 *)pSme->key, pSme->key_len); +#endif // RT_CFG80211_DEBUG // + + pAd->StaCfg.DefaultKeyId = pSme->key_idx; /* base 0 */ + if (pSme->key_len >= sizeof(KeyBuf)) + return -EINVAL; + /* End of if */ + memcpy(KeyBuf, pSme->key, pSme->key_len); + KeyBuf[pSme->key_len] = 0x00; + + CFG80211DBG(RT_DEBUG_ERROR, + ("80211> pAd->StaCfg.DefaultKeyId = %d\n", + pAd->StaCfg.DefaultKeyId)); + + switch(pSme->key_idx) + { + case 1: + default: + Set_Key1_Proc(pAd, (PSTRING)KeyBuf); + break; + + case 2: + Set_Key2_Proc(pAd, (PSTRING)KeyBuf); + break; + + case 3: + Set_Key3_Proc(pAd, (PSTRING)KeyBuf); + break; + + case 4: + Set_Key4_Proc(pAd, (PSTRING)KeyBuf); + break; + } /* End of switch */ + } /* End of if */ + + /* TODO: We need to provide a command to set BSSID to associate a AP */ + + /* re-set SSID */ + pAd->StaCfg.bAutoReconnect = TRUE; + pAd->FlgCfg80211Connecting = TRUE; + + SSIDLen = pSme->ssid_len; + if (SSIDLen > NDIS_802_11_LENGTH_SSID) + SSIDLen = NDIS_802_11_LENGTH_SSID; + /* End of if */ + + memset(&SSID, 0, sizeof(SSID)); + memcpy(SSID, pSme->ssid, SSIDLen); + Set_SSID_Proc(pAd, (PSTRING)SSID); + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> SSID = %s\n", SSID)); + return 0; +} /* End of CFG80211_Connect */ + + +/* +======================================================================== +Routine Description: + Disconnect from the BSS/ESS. + +Arguments: + pWiphy - Wireless hardware description + pNdev - Network device interface + ReasonCode - + +Return Value: + 0 - success + -x - fail + +Note: + For iw utility: connect +======================================================================== +*/ +static int CFG80211_Disconnect( + IN struct wiphy *pWiphy, + IN struct net_device *pNdev, + IN u16 ReasonCode) +{ + PRTMP_ADAPTER pAd; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_Disconnect ==>\n")); + CFG80211DBG(RT_DEBUG_ERROR, ("80211> ReasonCode = %d\n", ReasonCode)); + + MAC80211_PAD_GET(pAd, pWiphy); + + pAd->StaCfg.bAutoReconnect = FALSE; + pAd->FlgCfg80211Connecting = FALSE; + LinkDown(pAd, FALSE); + return 0; +} /* End of CFG80211_Disconnect */ +#endif // CONFIG_STA_SUPPORT // +#endif // LINUX_VERSION_CODE // + + +static struct cfg80211_ops CFG80211_Ops = { + .set_channel = CFG80211_OpsSetChannel, + .change_virtual_intf = CFG80211_OpsChgVirtualInf, + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) +#ifdef CONFIG_STA_SUPPORT + .scan = CFG80211_OpsScan, +#endif // CONFIG_STA_SUPPORT // +#endif // LINUX_VERSION_CODE // + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31)) +#ifdef CONFIG_STA_SUPPORT + .join_ibss = CFG80211_OpsJoinIbss, + .leave_ibss = CFG80211_OpsLeaveIbss, +#endif // CONFIG_STA_SUPPORT // +#endif // LINUX_VERSION_CODE // + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)) + .set_tx_power = CFG80211_TxPwrSet, + .get_tx_power = CFG80211_TxPwrGet, + .set_power_mgmt = CFG80211_PwrMgmt, + .get_station = CFG80211_StaGet, + .dump_station = CFG80211_StaDump, + .set_wiphy_params = CFG80211_WiphyParamsSet, + .add_key = CFG80211_KeyAdd, + .get_key = CFG80211_KeyGet, + .del_key = CFG80211_KeyDel, + .set_default_key = CFG80211_KeyDefaultSet, +#ifdef CONFIG_STA_SUPPORT + .connect = CFG80211_Connect, + .disconnect = CFG80211_Disconnect, +#endif // CONFIG_STA_SUPPORT // +#endif // LINUX_VERSION_CODE // +}; + + +/* +======================================================================== +Routine Description: + Allocate a wireless device. + +Arguments: + pAd - WLAN control block pointer + pDev - Generic device interface + +Return Value: + wireless device + +Note: +======================================================================== +*/ +static struct wireless_dev *CFG80211_WdevAlloc( + IN PRTMP_ADAPTER pAd, + struct device *pDev) +{ + struct wireless_dev *pWdev; + ULONG *pPriv; + + + /* + * We're trying to have the following memory layout: + * + * +------------------------+ + * | struct wiphy | + * +------------------------+ + * | pAd pointer | + * +------------------------+ + */ + + pWdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL); + if (pWdev == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("80211> Wireless device allocation fail!\n")); + return NULL; + } /* End of if */ + + pWdev->wiphy = wiphy_new(&CFG80211_Ops, sizeof(ULONG *)); + if (pWdev->wiphy == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("80211> Wiphy device allocation fail!\n")); + goto LabelErrWiphyNew; + } /* End of if */ + + /* keep pAd pointer */ + pPriv = (ULONG *)(wiphy_priv(pWdev->wiphy)); + *pPriv = (ULONG)pAd; + + set_wiphy_dev(pWdev->wiphy, pDev); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) + pWdev->wiphy->max_scan_ssids = MAX_LEN_OF_BSS_TABLE; +#endif // KERNEL_VERSION // + + +#ifdef CONFIG_STA_SUPPORT + pWdev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | + BIT(NL80211_IFTYPE_ADHOC) | + BIT(NL80211_IFTYPE_MONITOR); +#endif // CONFIG_STA_SUPPORT // + pWdev->wiphy->reg_notifier = CFG80211_RegNotifier; + + /* init channel information */ + CFG80211_SupBandInit(pAd, pWdev->wiphy, NULL, NULL); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) + /* CFG80211_SIGNAL_TYPE_MBM: signal strength in mBm (100*dBm) */ + pWdev->wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM; +#endif // KERNEL_VERSION // + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)) + pWdev->wiphy->cipher_suites = CipherSuites; + pWdev->wiphy->n_cipher_suites = ARRAY_SIZE(CipherSuites); +#endif // LINUX_VERSION_CODE // + + if (wiphy_register(pWdev->wiphy) < 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("80211> Register wiphy device fail!\n")); + goto LabelErrReg; + } /* End of if */ + + return pWdev; + + LabelErrReg: + wiphy_free(pWdev->wiphy); + + LabelErrWiphyNew: + os_free_mem(NULL, pWdev); + + return NULL; +} /* End of CFG80211_WdevAlloc */ + + + + +/* =========================== Global Function ============================== */ + +/* +======================================================================== +Routine Description: + Register MAC80211 Module. + +Arguments: + pAdCB - WLAN control block pointer + pDev - Generic device interface + pNetDev - Network device + +Return Value: + NONE + +Note: + pDev != pNetDev + #define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev)) + + Can not use pNetDev to replace pDev; Or kernel panic. +======================================================================== +*/ +VOID CFG80211_Register( + IN VOID *pAdCB, + IN struct device *pDev, + IN struct net_device *pNetDev) +{ + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; + + + /* allocate MAC80211 structure */ + if (pAd->pCfg80211_CB != NULL) + return; + /* End of if */ + + os_alloc_mem(pAd, (UCHAR **)&pAd->pCfg80211_CB, sizeof(CFG80211_CB)); + if (pAd->pCfg80211_CB == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("80211> Allocate MAC80211 CB fail!\n")); + return; + } /* End of if */ + + /* allocate wireless device */ + CFG80211CB->pCfg80211_Wdev = CFG80211_WdevAlloc(pAd, pDev); + if (CFG80211CB->pCfg80211_Wdev == NULL) + { + os_free_mem(NULL, pAd->pCfg80211_CB); + pAd->pCfg80211_CB = NULL; + return; + } /* End of if */ + + /* bind wireless device with net device */ + +#ifdef CONFIG_STA_SUPPORT + /* default we are station mode */ + CFG80211CB->pCfg80211_Wdev->iftype = NL80211_IFTYPE_STATION; +#endif // CONFIG_STA_SUPPORT // + + pNetDev->ieee80211_ptr = CFG80211CB->pCfg80211_Wdev; + SET_NETDEV_DEV(pNetDev, wiphy_dev(CFG80211CB->pCfg80211_Wdev->wiphy)); + CFG80211CB->pCfg80211_Wdev->netdev = pNetDev; + + /* init API function pointers */ + RT_CFG80211_API_INIT(pAd); + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_Register\n")); +} /* End of CFG80211_Register */ + + +/* +======================================================================== +Routine Description: + UnRegister MAC80211 Module. + +Arguments: + pAd - WLAN control block pointer + pNetDev - Network device + +Return Value: + NONE + +Note: +======================================================================== +*/ +VOID CFG80211_UnRegister( + IN PRTMP_ADAPTER pAd, + IN struct net_device *pNetDev) +{ +#ifdef CONFIG_STA_SUPPORT + UINT32 BssId; + + /* free channel information for scan table */ + for(BssId=0; BssId<MAX_LEN_OF_BSS_TABLE; BssId++) + { + if (pAd->ScanTab.BssEntry[BssId].pCfg80211_Chan != NULL) + os_free_mem(NULL, pAd->ScanTab.BssEntry[BssId].pCfg80211_Chan); + /* End of if */ + + pAd->ScanTab.BssEntry[BssId].pCfg80211_Chan = NULL; + } /* End of for */ +#endif // CONFIG_STA_SUPPORT // + + /* sanity check */ + if (pAd->pCfg80211_CB == NULL) + return; + /* End of if */ + + /* unregister */ + if (CFG80211CB->pCfg80211_Wdev != NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("80211> unregister/free wireless device\n")); + + /* + Must unregister, or you will suffer problem when you change + regulatory domain by using iw. + */ + wiphy_unregister(CFG80211CB->pCfg80211_Wdev->wiphy); + wiphy_free(CFG80211CB->pCfg80211_Wdev->wiphy); + os_free_mem(NULL, CFG80211CB->pCfg80211_Wdev); + + if (CFG80211CB->pCfg80211_Channels != NULL) + os_free_mem(NULL, CFG80211CB->pCfg80211_Channels); + /* End of if */ + + if (CFG80211CB->pCfg80211_Rates != NULL) + os_free_mem(NULL, CFG80211CB->pCfg80211_Rates); + /* End of if */ + + CFG80211CB->pCfg80211_Wdev = NULL; + CFG80211CB->pCfg80211_Channels = NULL; + CFG80211CB->pCfg80211_Rates = NULL; + + /* must reset to NULL; or kernel will panic in unregister_netdev */ + pNetDev->ieee80211_ptr = NULL; + SET_NETDEV_DEV(pNetDev, NULL); + } /* End of if */ + + os_free_mem(NULL, pAd->pCfg80211_CB); + pAd->pCfg80211_CB = NULL; + pAd->CommonCfg.HT_Disable = 0; +} /* End of CFG80211_UnRegister */ + + +/* +======================================================================== +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; + + + CFG80211DBG(RT_DEBUG_ERROR, + ("crda> regulatory domain hint: %c%c\n", + pCountryIe[0], pCountryIe[1])); + + if ((CFG80211CB->pCfg80211_Wdev == NULL) || (pCountryIe == NULL)) + { + CFG80211DBG(RT_DEBUG_ERROR, ("crda> regulatory domain hint not support!\n")); + return; + } /* End of if */ + + /* hints a country IE as a regulatory domain "without" channel/power info. */ +// regulatory_hint(CFG80211CB->pMac80211_Hw->wiphy, pCountryIe); + regulatory_hint(CFG80211CB->pCfg80211_Wdev->wiphy, (const char *)pCountryIe); +} /* 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 */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; + + + if ((CFG80211CB->pCfg80211_Wdev == NULL) || (pCountryIe == NULL)) + { + CFG80211DBG(RT_DEBUG_ERROR, ("crda> regulatory domain hint not support!\n")); + return; + } /* End of if */ + + CFG80211DBG(RT_DEBUG_ERROR, + ("crda> regulatory domain hint: %c%c\n", + pCountryIe[0], pCountryIe[1])); + + /* + hints a country IE as a regulatory domain "with" channel/power info. + but if you use regulatory_hint(), it only hint "regulatory domain". + */ +// regulatory_hint_11d(CFG80211CB->pMac80211_Hw->wiphy, pCountryIe, CountryIeLen); + regulatory_hint_11d(CFG80211CB->pCfg80211_Wdev->wiphy, pCountryIe, CountryIeLen); +#endif // LINUX_VERSION_CODE // +} /* 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 struct wiphy *pWiphy, + IN UCHAR *pAlpha2) +{ + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; + enum ieee80211_band IdBand; + struct ieee80211_supported_band *pSband; + struct ieee80211_channel *pChan; + RADAR_DETECT_STRUCT *pRadarDetect; + UINT32 IdChan, IdPwr; + UINT32 ChanId, RecId, DfsType; + ULONG IrqFlags; + + + CFG80211DBG(RT_DEBUG_ERROR, ("crda> CFG80211_RegRuleApply ==>\n")); + + /* sanity check */ + if (pWiphy == NULL) + { + if ((CFG80211CB != NULL) && (CFG80211CB->pCfg80211_Wdev != NULL)) + pWiphy = CFG80211CB->pCfg80211_Wdev->wiphy; + /* End of if */ + } /* End of if */ + + if ((pWiphy == NULL) || (pAlpha2 == 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; + pRadarDetect = &pAd->CommonCfg.RadarDetect; + + /* find the DfsType */ + DfsType = CE; + +#ifdef AUTO_CH_SELECT_ENHANCE +#ifdef EXT_BUILD_CHANNEL_LIST + if ((pAlpha2[0] != '0') && (pAlpha2[1] != '0')) + { + UINT32 IdReg; + + if (pWiphy->bands[IEEE80211_BAND_5GHZ] != 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])) + { + 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<IEEE80211_NUM_BANDS; IdBand++) + { + if (!pWiphy->bands[IdBand]) + continue; + /* End of if */ + + if (IdBand == IEEE80211_BAND_2GHZ) + { + 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 */ + + pSband = pWiphy->bands[IdBand]; + + for(IdChan=0; IdChan<pSband->n_channels; IdChan++) + { + pChan = &pSband->channels[IdChan]; + ChanId = ieee80211_frequency_to_channel(pChan->center_freq); + + 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 */ + + if (pChan->flags & IEEE80211_CHAN_DISABLED) + { + /* the channel is not allowed in the regulatory domain */ + CFG80211DBG(RT_DEBUG_ERROR, + ("Chan %03d (frq %d):\tnot allowed!\n", + ChanId, pChan->center_freq)); + + /* get next channel information */ + continue; + } /* 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 = pChan->max_power; + + /* keep DFS flag */ + if (pChan->flags & IEEE80211_CHAN_RADAR) + 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. */ + pRadarDetect->RDDurRegion = DfsType; + + if (DfsType == JAP_W53) + pRadarDetect->DfsSessionTime = 15; + else if (DfsType == JAP_W56) + pRadarDetect->DfsSessionTime = 13; + else if (DfsType == JAP) + pRadarDetect->DfsSessionTime = 5; + else if (DfsType == FCC) + { + pRadarDetect->DfsSessionTime = 5; + } + else if (DfsType == CE) + pRadarDetect->DfsSessionTime = 13; + else + pRadarDetect->DfsSessionTime = 13; + /* End of if */ + + CFG80211DBG(RT_DEBUG_ERROR, + ("Chan %03d (frq %d):\tpower %d dBm, " + "DFS %d, DFS Type %d\n", + ChanId, pChan->center_freq, pChan->max_power, + ((pChan->flags & IEEE80211_CHAN_RADAR)?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, + IN INT32 MemFlag) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) +#ifdef CONFIG_STA_SUPPORT + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; + struct ieee80211_channel *pChan; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_Scaning ==>\n")); + + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("80211> Network is down!\n")); + return; + } /* End of if */ + + /* + In connect function, we also need to report BSS information to cfg80211; + Not only scan function. + */ + if ((pAd->FlgCfg80211Scanning == FALSE) && + (pAd->FlgCfg80211Connecting == FALSE)) + { + return; /* no scan is running */ + } /* End of if */ + + /* init */ + /* Note: Can not use local variable to do pChan */ + if (pAd->ScanTab.BssEntry[BssIdx].pCfg80211_Chan == NULL) + { + os_alloc_mem(pAd, + (UCHAR **)&pAd->ScanTab.BssEntry[BssIdx].pCfg80211_Chan, + sizeof(struct ieee80211_channel)); + if (pAd->ScanTab.BssEntry[BssIdx].pCfg80211_Chan == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("80211> Allocate chan fail!\n")); + return; + } /* End of if */ + } /* End of if */ + + pChan = pAd->ScanTab.BssEntry[BssIdx].pCfg80211_Chan; + memset(pChan, 0, sizeof(*pChan)); + + if (ChanId > 14) + pChan->band = IEEE80211_BAND_5GHZ; + else + pChan->band = IEEE80211_BAND_2GHZ; + /* End of if */ + + pChan->center_freq = ieee80211_channel_to_frequency(ChanId); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)) + if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) + { + if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20) + pChan->max_bandwidth = 20; /* 20MHz */ + else + pChan->max_bandwidth = 40; /* 40MHz */ + /* End of if */ + } + else + pChan->max_bandwidth = 5; /* 5MHz for non-HT device */ + /* End of if */ +#endif // LINUX_VERSION_CODE // + + /* no use currently in 2.6.30 */ +// if (ieee80211_is_beacon(((struct ieee80211_mgmt *)pFrame)->frame_control)) +// pChan->beacon_found = 1; + /* End of if */ + + /* inform 80211 a scan is got */ + /* we can use cfg80211_inform_bss in 2.6.31, it is easy more than the one */ + /* in cfg80211_inform_bss_frame(), it will memcpy pFrame but pChan */ + cfg80211_inform_bss_frame(CFG80211CB->pCfg80211_Wdev->wiphy, + pAd->ScanTab.BssEntry[BssIdx].pCfg80211_Chan, + (struct ieee80211_mgmt *)pFrame, + FrameLen, + RSSI, + MemFlag); + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> cfg80211_inform_bss_frame\n")); +#endif // CONFIG_STA_SUPPORT // +#endif // LINUX_VERSION_CODE // +} /* 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) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) +#ifdef CONFIG_STA_SUPPORT + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; + + + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("80211> Network is down!\n")); + return; + } /* End of if */ + + if (pAd->FlgCfg80211Scanning == FALSE) + return; /* no scan is running */ + /* End of if */ + + if (FlgIsAborted == TRUE) + FlgIsAborted = 1; + else + FlgIsAborted = 0; + /* End of if */ + + cfg80211_scan_done(CFG80211CB->pCfg80211_ScanReq, FlgIsAborted); + + pAd->FlgCfg80211Scanning = FALSE; +#endif // CONFIG_STA_SUPPORT // +#endif // LINUX_VERSION_CODE // +} /* End of CFG80211_ScanEnd */ + + +/* +======================================================================== +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; + struct wiphy *pWiphy; + + + /* sanity check */ + if (CFG80211CB->pCfg80211_Wdev == NULL) + return FALSE; + /* End of if */ + + pWiphy = CFG80211CB->pCfg80211_Wdev->wiphy; + + if (pWiphy != NULL) + { + CFG80211DBG(RT_DEBUG_ERROR, ("80211> re-init bands...\n")); + + /* re-init bands */ + CFG80211_SupBandInit(pAd, pWiphy, + CFG80211CB->pCfg80211_Channels, + CFG80211CB->pCfg80211_Rates); + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)) + { + UINT32 Value = 0; + + /* re-init PHY */ + pWiphy->rts_threshold = pAd->CommonCfg.RtsThreshold; + pWiphy->frag_threshold = pAd->CommonCfg.FragmentThreshold; + + RTMP_IO_READ32(pAd, TX_RTY_CFG, &Value); + pWiphy->retry_short = Value & 0xff; + pWiphy->retry_long = (Value & 0xff00)>>8; + } +#endif // LINUX_VERSION_CODE // + + return TRUE; + } /* End of if */ + + return FALSE; +} /* End of CFG80211_SupBandReInit */ + + +/* +======================================================================== +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) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,32)) + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdCB; + + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CFG80211_ConnectResultInform ==>\n")); + + if ((CFG80211CB->pCfg80211_Wdev->netdev == NULL) || (pBSSID == NULL)) + return; + /* End of if */ + + if (FlgIsSuccess) + { + cfg80211_connect_result(CFG80211CB->pCfg80211_Wdev->netdev, + pBSSID, + pReqIe, + ReqIeLen, + pRspIe, + RspIeLen, + WLAN_STATUS_SUCCESS, + GFP_KERNEL); + } + else + { + cfg80211_connect_result(CFG80211CB->pCfg80211_Wdev->netdev, + pBSSID, + NULL, 0, NULL, 0, + WLAN_STATUS_UNSPECIFIED_FAILURE, + GFP_KERNEL); + } /* End of if */ + + pAd->FlgCfg80211Connecting = FALSE; +#endif // LINUX_VERSION_CODE // +} /* End of CFG80211_ConnectResultInform */ + + + + +/* =========================== Local Function =============================== */ + +/* +======================================================================== +Routine Description: + The driver's regulatory notification callback. + +Arguments: + pWiphy - Wireless hardware description + pRequest - Regulatory request + +Return Value: + 0 + +Note: +======================================================================== +*/ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30)) +static INT32 CFG80211_RegNotifier( + IN struct wiphy *pWiphy, + IN struct regulatory_request *pRequest) +{ + PRTMP_ADAPTER pAd; + ULONG *pPriv; + + + /* sanity check */ + pPriv = (ULONG *)(wiphy_priv(pWiphy)); + pAd = (PRTMP_ADAPTER)(*pPriv); + + if (pAd == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("crda> reg notify but pAd = NULL!")); + return 0; + } /* End of if */ + + /* + Change the band settings (PASS scan, IBSS allow, or DFS) in mac80211 + based on EEPROM. + + IEEE80211_CHAN_DISABLED: This channel is disabled. + IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted + on this channel. + IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel. + IEEE80211_CHAN_RADAR: Radar detection is required on this channel. + IEEE80211_CHAN_NO_FAT_ABOVE: extension channel above this channel + is not permitted. + IEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channel + is not permitted. + */ +#ifdef RELEASE_EXCLUDE + if (pWiphy->bands[IEEE80211_BAND_5GHZ]) + { + struct ieee80211_supported_band *pBand; + struct ieee80211_channel *pChannel; + UINT32 IdChan; + + + /* RALINK follows DFS rule from upper layer */ + + /* + Atheros Communications Inc. driver/net/wireless/ath9k/regd.c + + Always apply Radar/DFS rules on freq range 5260 MHz - 5700 MHz + + We always enable radar detection/DFS on this frequency range. + Additionally we also apply on this frequency range: + + - If STA mode does not yet have DFS supports disable active scanning + - If adhoc mode does not support DFS yet then disable adhoc in the + frequency. + - If AP mode does not yet support radar detection/DFS do not allow + AP mode. + + Step1: Loop all channels of 5GHZ and check if the channel needs DFS + based on settings in EEPROM. + Step2: If yes and the channel is not disabled, + pChannel->flags |= IEEE80211_CHAN_RADAR | + IEEE80211_CHAN_NO_IBSS | + IEEE80211_CHAN_PASSIVE_SCAN; + */ + pBand = pWiphy->bands[IEEE80211_BAND_5GHZ]; + + for(IdChan=0; IdChan<pBand->n_channels; IdChan++) + { + pChannel = &pBand->channels[IdChan]; + + // TODO: add DFS + } + } /* End of if */ +#endif // RELEASE_EXCLUDE // + + /* + Change regulatory rule here. + + struct ieee80211_channel { + enum ieee80211_band band; + u16 center_freq; + u8 max_bandwidth; + u16 hw_value; + u32 flags; + int max_antenna_gain; + int max_power; + bool beacon_found; + u32 orig_flags; + int orig_mag, orig_mpwr; + }; + + In mac80211 layer, it will change flags, max_antenna_gain, + max_bandwidth, max_power. + */ + + switch(pRequest->initiator) + { + case NL80211_REGDOM_SET_BY_CORE: + /* + Core queried CRDA for a dynamic world regulatory domain. + */ + CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by core: ")); + break; + + case NL80211_REGDOM_SET_BY_USER: + /* + User asked the wireless core to set the regulatory domain. + (when iw, network manager, wpa supplicant, etc.) + */ + CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by user: ")); + break; + + case NL80211_REGDOM_SET_BY_DRIVER: + /* + A wireless drivers has hinted to the wireless core it thinks + its knows the regulatory domain we should be in. + (when driver initialization, calling regulatory_hint) + */ + CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by driver: ")); + break; + + case NL80211_REGDOM_SET_BY_COUNTRY_IE: + /* + The wireless core has received an 802.11 country information + element with regulatory information it thinks we should consider. + (when beacon receive, calling regulatory_hint_11d) + */ + CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by country IE: ")); + break; + } /* End of switch */ + + CFG80211DBG(RT_DEBUG_ERROR, + ("%c%c\n", pRequest->alpha2[0], pRequest->alpha2[1])); + + /* only follow rules from user */ + if (pRequest->initiator == NL80211_REGDOM_SET_BY_USER) + { + /* keep Alpha2 and we can re-call the function when interface is up */ + pAd->Cfg80211_Alpha2[0] = pRequest->alpha2[0]; + pAd->Cfg80211_Alpha2[1] = pRequest->alpha2[1]; + + /* apply the new regulatory rule */ + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) + { + /* interface is up */ + CFG80211_RegRuleApply(pAd, pWiphy, (UCHAR *)pRequest->alpha2); + } + else + { + CFG80211DBG(RT_DEBUG_ERROR, ("crda> interface is down!\n")); + } /* End of if */ + } /* End of if */ + + return 0; +} /* End of CFG80211_RegNotifier */ +#else + +static INT32 CFG80211_RegNotifier( + IN struct wiphy *pWiphy, + IN enum reg_set_by Request) +{ + struct device *pDev = pWiphy->dev.parent; + struct net_device *pNetDev = dev_get_drvdata(pDev); + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)RTMP_OS_NETDEV_GET_PRIV(pNetDev); + UINT32 ReqType = Request; + + + /* sanity check */ + if (pAd == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("crda> reg notify but pAd = NULL!")); + return 0; + } /* End of if */ + + /* + Change the band settings (PASS scan, IBSS allow, or DFS) in mac80211 + based on EEPROM. + + IEEE80211_CHAN_DISABLED: This channel is disabled. + IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted + on this channel. + IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel. + IEEE80211_CHAN_RADAR: Radar detection is required on this channel. + IEEE80211_CHAN_NO_FAT_ABOVE: extension channel above this channel + is not permitted. + IEEE80211_CHAN_NO_FAT_BELOW: extension channel below this channel + is not permitted. + */ +#ifdef RELEASE_EXCLUDE + if (pWiphy->bands[IEEE80211_BAND_5GHZ]) + { + struct ieee80211_supported_band *pBand; + struct ieee80211_channel *pChannel; + UINT32 IdChan; + + + /* RALINK follows DFS rule from upper layer */ + + /* + Atheros Communications Inc. driver/net/wireless/ath9k/regd.c + + Always apply Radar/DFS rules on freq range 5260 MHz - 5700 MHz + + We always enable radar detection/DFS on this frequency range. + Additionally we also apply on this frequency range: + + - If STA mode does not yet have DFS supports disable active scanning + - If adhoc mode does not support DFS yet then disable adhoc in the + frequency. + - If AP mode does not yet support radar detection/DFS do not allow + AP mode. + + Step1: Loop all channels of 5GHZ and check if the channel needs DFS + based on settings in EEPROM. + Step2: If yes and the channel is not disabled, + pChannel->flags |= IEEE80211_CHAN_RADAR | + IEEE80211_CHAN_NO_IBSS | + IEEE80211_CHAN_PASSIVE_SCAN; + */ + pBand = pWiphy->bands[IEEE80211_BAND_5GHZ]; + + for(IdChan=0; IdChan<pBand->n_channels; IdChan++) + { + pChannel = &pBand->channels[IdChan]; + + // TODO: add DFS + } + } /* End of if */ +#endif // RELEASE_EXCLUDE // + + /* + Change regulatory rule here. + + struct ieee80211_channel { + enum ieee80211_band band; + u16 center_freq; + u8 max_bandwidth; + u16 hw_value; + u32 flags; + int max_antenna_gain; + int max_power; + bool beacon_found; + u32 orig_flags; + int orig_mag, orig_mpwr; + }; + + In mac80211 layer, it will change flags, max_antenna_gain, + max_bandwidth, max_power. + */ + + switch(ReqType) + { + case REGDOM_SET_BY_CORE: + /* + Core queried CRDA for a dynamic world regulatory domain. + */ + CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by core: ")); + break; + + case REGDOM_SET_BY_USER: + /* + User asked the wireless core to set the regulatory domain. + (when iw, network manager, wpa supplicant, etc.) + */ + CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by user: ")); + break; + + case REGDOM_SET_BY_DRIVER: + /* + A wireless drivers has hinted to the wireless core it thinks + its knows the regulatory domain we should be in. + (when driver initialization, calling regulatory_hint) + */ + CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by driver: ")); + break; + + case REGDOM_SET_BY_COUNTRY_IE: + /* + The wireless core has received an 802.11 country information + element with regulatory information it thinks we should consider. + (when beacon receive, calling regulatory_hint_11d) + */ + CFG80211DBG(RT_DEBUG_ERROR, ("crda> requlation requestion by country IE: ")); + break; + } /* End of switch */ + + DBGPRINT(RT_DEBUG_ERROR, ("00\n")); + + /* only follow rules from user */ + if (ReqType == REGDOM_SET_BY_USER) + { + /* keep Alpha2 and we can re-call the function when interface is up */ + pAd->Cfg80211_Alpha2[0] = '0'; + pAd->Cfg80211_Alpha2[1] = '0'; + + /* apply the new regulatory rule */ + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) + { + /* interface is up */ + CFG80211_RegRuleApply(pAd, pWiphy, pAd->Cfg80211_Alpha2); + } + else + { + CFG80211DBG(RT_DEBUG_ERROR, ("crda> interface is down!\n")); + } /* End of if */ + } /* End of if */ + + return 0; +} /* End of CFG80211_RegNotifier */ +#endif // LINUX_VERSION_CODE // + + +/* +======================================================================== +Routine Description: + Initialize wireless channel in 2.4GHZ and 5GHZ. + +Arguments: + pAd - WLAN control block pointer + pWiphy - WLAN PHY interface + pChannels - Current channel info + pRates - Current rate info + +Return Value: + TRUE - init successfully + FALSE - init fail + +Note: + TX Power related: + + 1. Suppose we can send power to 15dBm in the board. + 2. A value 0x0 ~ 0x1F for a channel. We will adjust it based on 15dBm/ + 54Mbps. So if value == 0x07, the TX power of 54Mbps is 15dBm and + the value is 0x07 in the EEPROM. + 3. Based on TX power value of 54Mbps/channel, adjust another value + 0x0 ~ 0xF for other data rate. (-6dBm ~ +6dBm) + + Other related factors: + 1. TX power percentage from UI/users; + 2. Maximum TX power limitation in the regulatory domain. +======================================================================== +*/ +static BOOLEAN CFG80211_SupBandInit( + IN PRTMP_ADAPTER pAd, + IN struct wiphy *pWiphy, + IN struct ieee80211_channel *pChannels, + IN struct ieee80211_rate *pRates) +{ + struct ieee80211_supported_band *pBand; + UINT32 NumOfChan, NumOfRate; + UINT32 IdLoop; + UINT32 CurTxPower; + + + /* sanity check */ + if (pAd->RFICType == 0) + pAd->RFICType = RFIC_24GHZ | RFIC_5GHZ; + /* End of if */ + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> RFICType = %d\n", pAd->RFICType)); + + /* init */ + if (pAd->RFICType & RFIC_5GHZ) + NumOfChan = CFG80211_NUM_OF_CHAN_2GHZ + CFG80211_NUM_OF_CHAN_5GHZ; + else + NumOfChan = CFG80211_NUM_OF_CHAN_2GHZ; + /* End of if */ + + if (pAd->CommonCfg.PhyMode == PHY_11B) + NumOfRate = 4; + else + NumOfRate = 4 + 8; + /* End of if */ + + if (pChannels == NULL) + { + pChannels = kzalloc(sizeof(*pChannels) * NumOfChan, GFP_KERNEL); + if (!pChannels) + { + DBGPRINT(RT_DEBUG_ERROR, ("80211> ieee80211_channel allocation fail!\n")); + return FALSE; + } /* End of if */ + } /* End of if */ + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> Number of channel = %d\n", + CFG80211_NUM_OF_CHAN_5GHZ)); + + if (pRates == NULL) + { + pRates = kzalloc(sizeof(*pRates) * NumOfRate, GFP_KERNEL); + if (!pRates) + { + os_free_mem(NULL, pChannels); + DBGPRINT(RT_DEBUG_ERROR, ("80211> ieee80211_rate allocation fail!\n")); + return FALSE; + } /* End of if */ + } /* End of if */ + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> Number of rate = %d\n", NumOfRate)); + + /* get TX power */ +#ifdef SINGLE_SKU + CurTxPower = pAd->CommonCfg.DefineMaxTxPwr; /* dBm */ +#else + CurTxPower = 0; /* unknown */ +#endif // SINGLE_SKU // + + CFG80211DBG(RT_DEBUG_ERROR, ("80211> CurTxPower = %d dBm\n", CurTxPower)); + + /* init channel */ + for(IdLoop=0; IdLoop<NumOfChan; IdLoop++) + { + pChannels[IdLoop].center_freq = \ + ieee80211_channel_to_frequency(Cfg80211_Chan[IdLoop]); + pChannels[IdLoop].hw_value = IdLoop; + + if (IdLoop < CFG80211_NUM_OF_CHAN_2GHZ) + pChannels[IdLoop].max_power = CurTxPower; + else + pChannels[IdLoop].max_power = CurTxPower; + /* End of if */ + + pChannels[IdLoop].max_antenna_gain = 0xff; + } /* End of if */ + + /* init rate */ + for(IdLoop=0; IdLoop<NumOfRate; IdLoop++) + memcpy(&pRates[IdLoop], &Cfg80211_SupRate[IdLoop], sizeof(*pRates)); + /* End of for */ + + pBand = &CFG80211CB->Cfg80211_bands[IEEE80211_BAND_2GHZ]; + if (pAd->RFICType & RFIC_24GHZ) + { + pBand->n_channels = CFG80211_NUM_OF_CHAN_2GHZ; + pBand->n_bitrates = NumOfRate; + pBand->channels = pChannels; + pBand->bitrates = pRates; + +#ifdef DOT11_N_SUPPORT + /* for HT, assign pBand->ht_cap */ + pBand->ht_cap.ht_supported = true; + pBand->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | + IEEE80211_HT_CAP_DSSSCCK40; + pBand->ht_cap.ampdu_factor = 3; /* 2 ^ 16 */ + pBand->ht_cap.ampdu_density = \ + pAd->CommonCfg.BACapability.field.MpduDensity; + + memset(&pBand->ht_cap.mcs, 0, sizeof(pBand->ht_cap.mcs)); + CFG80211DBG(RT_DEBUG_ERROR, + ("80211> TxStream = %d\n", pAd->CommonCfg.TxStream)); + + switch(pAd->CommonCfg.TxStream) + { + case 1: + default: + pBand->ht_cap.mcs.rx_mask[0] = 0xff; + break; + + case 2: + pBand->ht_cap.mcs.rx_mask[0] = 0xff; + pBand->ht_cap.mcs.rx_mask[1] = 0xff; + break; + + case 3: + pBand->ht_cap.mcs.rx_mask[0] = 0xff; + pBand->ht_cap.mcs.rx_mask[1] = 0xff; + pBand->ht_cap.mcs.rx_mask[2] = 0xff; + break; + } /* End of switch */ + + pBand->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; +#endif // DOT11_N_SUPPORT // + + pWiphy->bands[IEEE80211_BAND_2GHZ] = pBand; + } + else + { + pBand->channels = NULL; + pBand->bitrates = NULL; + } /* End of if */ + + pBand = &CFG80211CB->Cfg80211_bands[IEEE80211_BAND_5GHZ]; + if (pAd->RFICType & RFIC_5GHZ) + { + pBand->n_channels = CFG80211_NUM_OF_CHAN_5GHZ; + pBand->n_bitrates = NumOfRate - 4; + pBand->channels = &pChannels[CFG80211_NUM_OF_CHAN_2GHZ]; + pBand->bitrates = &pRates[4]; + + /* for HT, assign pBand->ht_cap */ +#ifdef DOT11_N_SUPPORT + /* for HT, assign pBand->ht_cap */ + pBand->ht_cap.ht_supported = true; + pBand->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | + IEEE80211_HT_CAP_SM_PS | + IEEE80211_HT_CAP_SGI_40 | + IEEE80211_HT_CAP_DSSSCCK40; + pBand->ht_cap.ampdu_factor = 3; /* 2 ^ 16 */ + pBand->ht_cap.ampdu_density = \ + pAd->CommonCfg.BACapability.field.MpduDensity; + + memset(&pBand->ht_cap.mcs, 0, sizeof(pBand->ht_cap.mcs)); + switch(pAd->CommonCfg.RxStream) + { + case 1: + default: + pBand->ht_cap.mcs.rx_mask[0] = 0xff; + break; + + case 2: + pBand->ht_cap.mcs.rx_mask[0] = 0xff; + pBand->ht_cap.mcs.rx_mask[1] = 0xff; + break; + + case 3: + pBand->ht_cap.mcs.rx_mask[0] = 0xff; + pBand->ht_cap.mcs.rx_mask[1] = 0xff; + pBand->ht_cap.mcs.rx_mask[2] = 0xff; + break; + } /* End of switch */ + + pBand->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; +#endif // DOT11_N_SUPPORT // + + pWiphy->bands[IEEE80211_BAND_5GHZ] = pBand; + } + else + { + pBand->channels = NULL; + pBand->bitrates = NULL; + } /* End of if */ + + CFG80211CB->pCfg80211_Channels = pChannels; + CFG80211CB->pCfg80211_Rates = pRates; + + return TRUE; +} /* End of CFG80211_SupBandInit */ + + +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX_VERSION_CODE // + +/* End of crda.c */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/config.mk b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/config.mk new file mode 100644 index 000000000..f11b58352 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/config.mk @@ -0,0 +1,386 @@ +# Support ATE function +HAS_ATE=n + +# Support QA ATE function +HAS_QA_SUPPORT=n + +# Support XLINK mode +HAS_XLINK=n + +# Support Wpa_Supplicant +HAS_WPA_SUPPLICANT=y + +# Support Native WpaSupplicant for Network Maganger +HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y + +#Support Net interface block while Tx-Sw queue full +HAS_BLOCK_NET_IF=n + +#Support DFS function +HAS_DFS_SUPPORT=n + +#Support Carrier-Sense function +HAS_CS_SUPPORT=n + +# Support for Multiple Cards +HAS_MC_SUPPORT=n + +#Support for PCI-MSI +HAS_MSI_SUPPORT=n + +#Support for IEEE802.11e DLS +HAS_QOS_DLS_SUPPORT=n + +#Support for EXT_CHANNEL +HAS_EXT_BUILD_CHANNEL_LIST=n + +#Support for Net-SNMP +HAS_SNMP_SUPPORT=n + +#Support features of 802.11n Draft3 +HAS_DOT11N_DRAFT3_SUPPORT=y + +#Support features of Single SKU. +HAS_SINGLE_SKU_SUPPORT=n + +#Support features of 802.11n +HAS_DOT11_N_SUPPORT=y + +ifeq ($(TARGET), LINUX) +ifneq (,$(findstring 2.4,$(LINUX_SRC))) +HAS_KTHREAD_SUPPORT=n +else +HAS_KTHREAD_SUPPORT=y +endif +endif + +#Support statistics count +HAS_STATS_COUNT=y + +#Client support WDS function +HAS_CLIENT_WDS_SUPPORT=n + +#Support for Bridge Fast Path & Bridge Fast Path function open to other module +HAS_BGFP_SUPPORT=n +HAS_BGFP_OPEN_SUPPORT=n + +#Support MAC80211 LINUX-only function +HAS_CFG80211_SUPPORT=n + +################################################# + +CC := $(CROSS_COMPILE)gcc +LD := $(CROSS_COMPILE)ld + +WFLAGS := -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs +WFLAGS += -DSYSTEM_LOG_SUPPORT + + + + +ifeq ($(HAS_KTHREAD_SUPPORT),y) +WFLAGS += -DKTHREAD_SUPPORT +endif + + +################################################# + +# config for STA mode + +ifeq ($(RT28xx_MODE),STA) +WFLAGS += -DCONFIG_STA_SUPPORT -DDBG + +ifeq ($(HAS_XLINK),y) +WFLAGS += -DXLINK_SUPPORT +endif + +ifeq ($(HAS_WPA_SUPPLICANT),y) +WFLAGS += -DWPA_SUPPLICANT_SUPPORT +ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y) +WFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT +endif +endif + +ifeq ($(HAS_ATE),y) +WFLAGS += -DRALINK_ATE +ifeq ($(HAS_QA_SUPPORT),y) +WFLAGS += -DRALINK_28xx_QA +endif +endif + + +ifeq ($(HAS_SNMP_SUPPORT),y) +WFLAGS += -DSNMP_SUPPORT +endif + +ifeq ($(HAS_QOS_DLS_SUPPORT),y) +WFLAGS += -DQOS_DLS_SUPPORT +endif + +ifeq ($(HAS_DOT11_N_SUPPORT),y) +WFLAGS += -DDOT11_N_SUPPORT +ifeq ($(HAS_DOT11N_DRAFT3_SUPPORT),y) +WFLAGS += -DDOT11N_DRAFT3 +endif +endif + + +ifeq ($(HAS_CS_SUPPORT),y) +WFLAGS += -DCARRIER_DETECTION_SUPPORT +endif + +ifeq ($(HAS_STATS_COUNT),y) +WFLAGS += -DSTATS_COUNT_SUPPORT +endif + +ifeq ($(HAS_CFG80211_SUPPORT),y) +WFLAGS += -DRT_CFG80211_SUPPORT +endif + +ifeq ($(OSABL),YES) +WFLAGS += -DOS_ABL_SUPPORT +endif + + +endif +# endif of ifeq ($(RT28xx_MODE),STA) + +################################################# + +################################################# + +# +# Common compiler flag +# + + + + + + +ifeq ($(HAS_EXT_BUILD_CHANNEL_LIST),y) +WFLAGS += -DEXT_BUILD_CHANNEL_LIST +endif + + +ifeq ($(OSABL),YES) +WFLAGS += -DEXPORT_SYMTAB +endif + +ifeq ($(HAS_CLIENT_WDS_SUPPORT),y) +WFLAGS += -DCLIENT_WDS +endif + +ifeq ($(HAS_BGFP_SUPPORT),y) +WFLAGS += -DBG_FT_SUPPORT +endif + +ifeq ($(HAS_BGFP_OPEN_SUPPORT),y) +WFLAGS += -DBG_FT_OPEN_SUPPORT +endif + + +################################################# +# ChipSet specific definitions. +# +ifeq ($(CHIPSET),2860) +WFLAGS +=-DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT2860 -DRT28xx +endif + +ifeq ($(CHIPSET),3062) +WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT +endif + +ifeq ($(CHIPSET),3562) +WFLAGS +=-DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT +endif +################################################# + + +ifeq ($(PLATFORM),5VT) +#WFLAGS += -DCONFIG_5VT_ENHANCE +endif + +ifeq ($(HAS_BLOCK_NET_IF),y) +WFLAGS += -DBLOCK_NET_IF +endif + +ifeq ($(HAS_DFS_SUPPORT),y) +WFLAGS += -DDFS_SUPPORT +endif + +ifeq ($(HAS_MC_SUPPORT),y) +WFLAGS += -DMULTIPLE_CARD_SUPPORT +endif + +ifeq ($(PLATFORM),IXP) +WFLAGS += -DRT_BIG_ENDIAN +endif + +ifeq ($(PLATFORM),IKANOS_V160) +WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0 +endif + +ifeq ($(PLATFORM),IKANOS_V180) +WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0 +endif + +ifeq ($(PLATFORM),INF_TWINPASS) +WFLAGS += -DRT_BIG_ENDIAN -DINF_TWINPASS +endif + +ifeq ($(PLATFORM),INF_DANUBE) +ifneq (,$(findstring 2.4,$(LINUX_SRC))) +# Linux 2.4 +WFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN +else +# Linux 2.6 +WFLAGS += -DRT_BIG_ENDIAN +endif +endif + +ifeq ($(PLATFORM),INF_AR9) +WFLAGS += -DRT_BIG_ENDIAN -DINF_AR9 +# support MAPI function for AR9. +#WFLAGS += -DAR9_MAPI_SUPPORT +endif + +ifeq ($(PLATFORM),CAVM_OCTEON) +WFLAGS += -DRT_BIG_ENDIAN +endif + +ifeq ($(PLATFORM),BRCM_6358) +WFLAGS += -DRT_BIG_ENDIAN +endif + +ifeq ($(PLATFORM),INF_AMAZON_SE) +WFLAGS += -DRT_BIG_ENDIAN -DINF_AMAZON_SE +endif + +ifeq ($(PLATFORM),RALINK_3052) +WFLAGS += -DINF_AMAZON_SE -DPLATFORM_RALINK_3052 +endif + +ifeq ($(PLATFORM),FREESCALE8377) +#EXTRA_CFLAGS := -v -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include $(WFLAGS)-O2 -Wall -Wstrict-prototypes -Wno-trigraphs +#export EXTRA_CFLAGS +WFLAGS += -DRT_BIG_ENDIAN +EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include +endif + +ifeq ($(PLATFORM),ST) +#WFLAGS += -DST +WFLAGS += -DST +endif + +#kernel build options for 2.4 +# move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star + +ifeq ($(PLATFORM),RALINK_3052) +CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM), RALINK_2880) +CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -march=mips2 -mabi=32 -Wa,--trap -DLINUX -nostdinc -iwithprefix include $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM),STAR) +CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mshort-load-bytes -msoft-float -Uarm -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) + +export CFLAGS +endif + +ifeq ($(PLATFORM),SIGMA) +CFLAGS := -D__KERNEL__ -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS) -DSIGMA863X_PLATFORM + +export CFLAGS +endif + +ifeq ($(PLATFORM),SIGMA_8622) +CFLAGS := -D__KERNEL__ -I$(CROSS_COMPILE_INCLUDE)/include -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM),5VT) +CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS) + +export CFLAGS +endif + +ifeq ($(PLATFORM),IKANOS_V160) +CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT28xx_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -march=lx4189 -Wa, -DMODULE $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM),IKANOS_V180) +CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT28xx_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mips32r2 -Wa, -DMODULE $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM),INF_TWINPASS) +CFLAGS := -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -G 0 -mno-abicalls -fno-pic -march=4kc -mips32 -Wa,--trap -pipe -mlong-calls $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM),INF_DANUBE) + ifneq (,$(findstring 2.4,$(LINUX_SRC))) + CFLAGS := -I$(RT28xx_DIR)/include $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic + else + CFLAGS := -I$(RT28xx_DIR)/include $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic + endif +export CFLAGS +endif + +ifeq ($(PLATFORM),INF_AR9) +CFLAGS := -I$(RT28xx_DIR)/include $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -fno-pic -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -mlong-calls -march=mips32r2 -mtune=34kc -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic +export CFLAGS +endif + +ifeq ($(PLATFORM),BRCM_6358) +CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include -nostdinc -iwithprefix include -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -I $(LINUX_SRC)/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-bcm963xx -I$(LINUX_SRC)/include/asm-mips/mach-generic -Os -fomit-frame-pointer -Wdeclaration-after-statement -DMODULE -mlong-calls +export CFLAGS +endif + +ifeq ($(PLATFORM),INF_AMAZON_SE) +CFLAGS := -D__KERNEL__ -DMODULE=1 -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -DCONFIG_IFX_ALG_QOS -DCONFIG_WAN_VLAN_SUPPORT -fomit-frame-pointer -DIFX_PPPOE_FRAME -G 0 -fno-pic -mno-abicalls -mlong-calls -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -nostdinc -iwithprefix include $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM),ST) +CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -O2 -Wundef -Wstrict-prototypes -Wno-trigraphs -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-aliasing -fno-common -fomit-frame-pointer -ffreestanding -o $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM),PC) + ifneq (,$(findstring 2.4,$(LINUX_SRC))) + # Linux 2.4 + CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS) + export CFLAGS + else + # Linux 2.6 + EXTRA_CFLAGS := $(WFLAGS) -DMODVERSIONS -I$(RT28xx_DIR)/include + endif +endif + +ifeq ($(PLATFORM),IXP) + CFLAGS := -v -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -mbig-endian -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=5 -mcpu=xscale -mtune=xscale -malignment-traps -msoft-float $(WFLAGS) + EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include -mbig-endian + export CFLAGS +endif + +ifeq ($(PLATFORM),SMDK) + EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include +endif + +ifeq ($(PLATFORM),CAVM_OCTEON) + EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include \ + -mabi=64 $(WFLAGS) +export CFLAGS +endif + +ifeq ($(PLATFORM),DM6446) + CFLAGS := -nostdinc -iwithprefix include -D__KERNEL__ -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Os -fno-omit-frame-pointer -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittle-endian -mabi=apcs-gnu -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm9tdmi -msoft-float -Uarm -Wdeclaration-after-statement -c -o $(WFLAGS) +export CFLAGS +endif diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/pci_main_dev.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/pci_main_dev.c new file mode 100644 index 000000000..ba58dfd7d --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/pci_main_dev.c @@ -0,0 +1,1212 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + pci_main_dev.c + + Abstract: + Create and register network interface for PCI based chipsets in Linux platform. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#include "rt_config.h" +#include <linux/pci.h> + +// +// Function declarations +// +extern int rt28xx_close(IN struct net_device *net_dev); +extern int rt28xx_open(struct net_device *net_dev); + +static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev); +static INT __devinit rt2860_probe(struct pci_dev *pci_dev, const struct pci_device_id *ent); +static void __exit rt2860_cleanup_module(void); +static int __init rt2860_init_module(void); + + static VOID RTMPInitPCIeDevice( + IN struct pci_dev *pci_dev, + IN PRTMP_ADAPTER pAd); + +#ifdef CONFIG_PM +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,10) +#define pm_message_t u32 +#endif + +static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state); +static int rt2860_resume(struct pci_dev *pci_dev); +#endif +#endif // CONFIG_PM // + +// +// Ralink PCI device table, include all supported chipsets +// +static struct pci_device_id rt2860_pci_tbl[] __devinitdata = +{ +#ifdef RT2860 + {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCI_DEVICE_ID)}, //RT28602.4G + {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCIe_DEVICE_ID)}, + {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2760_PCI_DEVICE_ID)}, + {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2790_PCIe_DEVICE_ID)}, +/* {PCI_DEVICE(VEN_AWT_PCI_VENDOR_ID, VEN_AWT_PCIe_DEVICE_ID)}, */ +/* {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7708)},*/ +/* {PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7728)},*/ + /*{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7758)},*/ + /*{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7727)},*/ + /*{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7738)},*/ + /*{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7748)},*/ + /*{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7768)},*/ +#endif // RT2860 // +#ifdef RT35xx + {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3062_PCI_DEVICE_ID)}, + {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3562_PCI_DEVICE_ID)}, + {PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC3060_PCI_DEVICE_ID)}, +#endif // RT35xx // + {0,} // terminate list +}; + +MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl); +#ifdef CONFIG_STA_SUPPORT +MODULE_LICENSE("GPL"); +#ifdef MODULE_VERSION +MODULE_VERSION(STA_DRIVER_VERSION); +#endif +#endif // CONFIG_STA_SUPPORT // + + +// +// Our PCI driver structure +// +static struct pci_driver rt2860_driver = +{ + name: "rt3060", + id_table: rt2860_pci_tbl, + probe: rt2860_probe, +#if LINUX_VERSION_CODE >= 0x20412 + remove: __devexit_p(rt2860_remove_one), +#else + remove: __devexit(rt2860_remove_one), +#endif + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +#ifdef CONFIG_PM + suspend: rt2860_suspend, + resume: rt2860_resume, +#endif +#endif +}; + + +/*************************************************************************** + * + * PCI device initialization related procedures. + * + ***************************************************************************/ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) +#ifdef CONFIG_PM + +VOID RT2860RejectPendingPackets( + IN PRTMP_ADAPTER pAd) +{ + // clear PS packets + // clear TxSw packets +} + +static int rt2860_suspend( + struct pci_dev *pci_dev, + pm_message_t state) +{ + struct net_device *net_dev = pci_get_drvdata(pci_dev); + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; + INT32 retval = 0; + + + DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_suspend()\n")); + + if (net_dev == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); + } + else + { + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + /* we can not use IFF_UP because ra0 down but ra1 up */ + /* and 1 suspend/resume function for 1 module, not for each interface */ + /* so Linux will call suspend/resume function once */ + if (VIRTUAL_IF_NUM(pAd) > 0) + { + // avoid users do suspend after interface is down + + // stop interface + netif_carrier_off(net_dev); + netif_stop_queue(net_dev); + + // mark device as removed from system and therefore no longer available + netif_device_detach(net_dev); + + // mark halt flag + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); + + // take down the device + rt28xx_close((PNET_DEV)net_dev); + + RT_MOD_DEC_USE_COUNT(); + } + } + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10) + // reference to http://vovo2000.com/type-lab/linux/kernel-api/linux-kernel-api.html + // enable device to generate PME# when suspended + // pci_choose_state(): Choose the power state of a PCI device to be suspended + retval = pci_enable_wake(pci_dev, pci_choose_state(pci_dev, state), 1); + // save the PCI configuration space of a device before suspending + pci_save_state(pci_dev); + // disable PCI device after use + pci_disable_device(pci_dev); + + retval = pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state)); +#endif + + DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_suspend()\n")); + return retval; +} + +static int rt2860_resume( + struct pci_dev *pci_dev) +{ + struct net_device *net_dev = pci_get_drvdata(pci_dev); + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; + +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10) + INT32 retval; + + + // set the power state of a PCI device + // PCI has 4 power states, DO (normal) ~ D3(less power) + // in include/linux/pci.h, you can find that + // #define PCI_D0 ((pci_power_t __force) 0) + // #define PCI_D1 ((pci_power_t __force) 1) + // #define PCI_D2 ((pci_power_t __force) 2) + // #define PCI_D3hot ((pci_power_t __force) 3) + // #define PCI_D3cold ((pci_power_t __force) 4) + // #define PCI_UNKNOWN ((pci_power_t __force) 5) + // #define PCI_POWER_ERROR ((pci_power_t __force) -1) + retval = pci_set_power_state(pci_dev, PCI_D0); + + // restore the saved state of a PCI device + pci_restore_state(pci_dev); + + // initialize device before it's used by a driver + if (pci_enable_device(pci_dev)) + { + printk("pci enable fail!\n"); + return 0; + } +#endif + + DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n")); + + if (net_dev == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n")); + } + else + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + if (pAd != NULL) + { + /* we can not use IFF_UP because ra0 down but ra1 up */ + /* and 1 suspend/resume function for 1 module, not for each interface */ + /* so Linux will call suspend/resume function once */ + if (VIRTUAL_IF_NUM(pAd) > 0) + { + // mark device as attached from system and restart if needed + netif_device_attach(net_dev); + + if (rt28xx_open((PNET_DEV)net_dev) != 0) + { + // open fail + DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); + return 0; + } + + // increase MODULE use count + RT_MOD_INC_USE_COUNT(); + + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF); + + netif_start_queue(net_dev); + netif_carrier_on(net_dev); + netif_wake_queue(net_dev); + } + } + + DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n")); + return 0; +} +#endif // CONFIG_PM // +#endif + + +static INT __init rt2860_init_module(VOID) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + return pci_register_driver(&rt2860_driver); +#else + return pci_module_init(&rt2860_driver); +#endif +} + + +// +// Driver module unload function +// +static VOID __exit rt2860_cleanup_module(VOID) +{ + pci_unregister_driver(&rt2860_driver); +} + +module_init(rt2860_init_module); +module_exit(rt2860_cleanup_module); + + +// +// PCI device probe & initialization function +// +static INT __devinit rt2860_probe( + IN struct pci_dev *pci_dev, + IN const struct pci_device_id *pci_id) +{ + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL; + struct net_device *net_dev; + PVOID handle; + PSTRING print_name; + ULONG csr_addr; + INT rv = 0; + RTMP_OS_NETDEV_OP_HOOK netDevHook; + + DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_probe\n")); + +//PCIDevInit============================================== + // wake up and enable device + if ((rv = pci_enable_device(pci_dev))!= 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("Enable PCI device failed, errno=%d!\n", rv)); + return rv; + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + print_name = pci_dev ? pci_name(pci_dev) : "rt3060"; +#else + print_name = pci_dev ? pci_dev->slot_name : "rt3060"; +#endif // LINUX_VERSION_CODE // + + if ((rv = pci_request_regions(pci_dev, print_name)) != 0) + { + DBGPRINT(RT_DEBUG_ERROR, ("Request PCI resource failed, errno=%d!\n", rv)); + goto err_out; + } + + // map physical address to virtual address for accessing register + csr_addr = (unsigned long) ioremap(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); + if (!csr_addr) + { + DBGPRINT(RT_DEBUG_ERROR, ("ioremap failed for device %s, region 0x%lX @ 0x%lX\n", + print_name, (ULONG)pci_resource_len(pci_dev, 0), (ULONG)pci_resource_start(pci_dev, 0))); + goto err_out_free_res; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("%s: at 0x%lx, VA 0x%lx, IRQ %d. \n", print_name, + (ULONG)pci_resource_start(pci_dev, 0), (ULONG)csr_addr, pci_dev->irq)); + } + + // Set DMA master + pci_set_master(pci_dev); + + +//RtmpDevInit============================================== + // Allocate RTMP_ADAPTER adapter structure + handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL); + if (handle == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s(): Allocate memory for os handle failed!\n", __FUNCTION__)); + goto err_out_iounmap; + } + + ((POS_COOKIE)handle)->pci_dev = pci_dev; + + rv = RTMPAllocAdapterBlock(handle, &pAd); //shiang: we may need the pci_dev for allocate structure of "RTMP_ADAPTER" + if (rv != NDIS_STATUS_SUCCESS) + goto err_out_iounmap; + // Here are the RTMP_ADAPTER structure with pci-bus specific parameters. + pAd->CSRBaseAddress = (PUCHAR)csr_addr; + DBGPRINT(RT_DEBUG_ERROR, ("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n", (ULONG)pAd->CSRBaseAddress, csr_addr)); + + RTMPInitPCIeDevice(pci_dev, pAd); + +//NetDevInit============================================== + net_dev = RtmpPhyNetDevInit(pAd, &netDevHook); + if (net_dev == NULL) + goto err_out_free_radev; + + // Here are the net_device structure with pci-bus specific parameters. + net_dev->irq = pci_dev->irq; // Interrupt IRQ number + net_dev->base_addr = csr_addr; // Save CSR virtual address and irq to device structure + pci_set_drvdata(pci_dev, net_dev); // Set driver data + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT +/* for supporting Network Manager */ + /* Set the sysfs physical device reference for the network logical device + * if set prior to registration will cause a symlink during initialization. + */ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) + SET_NETDEV_DEV(net_dev, &(pci_dev->dev)); +#endif +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + + +//All done, it's time to register the net device to linux kernel. + // Register this device +#ifdef RT_CFG80211_SUPPORT + pAd->pCfgDev = &(pci_dev->dev); + pAd->CFG80211_Register = CFG80211_Register; +#endif // RT_CFG80211_SUPPORT // + + rv = RtmpOSNetDevAttach(net_dev, &netDevHook); + if (rv) + goto err_out_free_netdev; + +#ifdef CONFIG_STA_SUPPORT + pAd->StaCfg.OriDevType = net_dev->type; +#endif // CONFIG_STA_SUPPORT // + +#ifdef KTHREAD_SUPPORT + init_waitqueue_head(&pAd->cmdQTask.kthread_q); +#endif // KTHREAD_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_probe\n")); + + return 0; // probe ok + + + /* --------------------------- ERROR HANDLE --------------------------- */ +err_out_free_netdev: + RtmpOSNetDevFree(net_dev); + +err_out_free_radev: + /* free RTMP_ADAPTER strcuture and os_cookie*/ + RTMPFreeAdapter(pAd); + +err_out_iounmap: + iounmap((void *)(csr_addr)); + release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); + +err_out_free_res: + pci_release_regions(pci_dev); + +err_out: + pci_disable_device(pci_dev); + + DBGPRINT(RT_DEBUG_ERROR, ("<=== rt2860_probe failed with rv = %d!\n", rv)); + + return -ENODEV; /* probe fail */ +} + + +static VOID __devexit rt2860_remove_one( + IN struct pci_dev *pci_dev) +{ + PNET_DEV net_dev = pci_get_drvdata(pci_dev); + RTMP_ADAPTER *pAd = NULL; + ULONG csr_addr = net_dev->base_addr; // pAd->CSRBaseAddress; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n")); + + if (pAd != NULL) + { + // Unregister/Free all allocated net_device. + RtmpPhyNetDevExit(pAd, net_dev); + + // Unmap CSR base address + iounmap((char *)(csr_addr)); + + // release memory region + release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); + +#ifdef RT_CFG80211_SUPPORT + CFG80211_UnRegister(pAd, net_dev); +#endif // RT_CFG80211_SUPPORT // + + // Free RTMP_ADAPTER related structures. + RtmpRaDevCtrlExit(pAd); + + } + else + { + // Unregister network device + RtmpOSNetDevDetach(net_dev); + + // Unmap CSR base address + iounmap((char *)(net_dev->base_addr)); + + // release memory region + release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0)); + } + + // Free the root net_device + RtmpOSNetDevFree(net_dev); + +} + + +/* +======================================================================== +Routine Description: + Check the chipset vendor/product ID. + +Arguments: + _dev_p Point to the PCI or USB device + +Return Value: + TRUE Check ok + FALSE Check fail + +Note: +======================================================================== +*/ +BOOLEAN RT28XXChipsetCheck( + IN void *_dev_p) +{ + /* always TRUE */ + return TRUE; +} + + + +/*************************************************************************** + * + * PCIe device initialization related procedures. + * + ***************************************************************************/ + static VOID RTMPInitPCIeDevice( + IN struct pci_dev *pci_dev, + IN PRTMP_ADAPTER pAd) +{ + USHORT device_id; + POS_COOKIE pObj; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id); + device_id = le2cpu16(device_id); + pObj->DeviceID = device_id; + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE); + if ( +#ifdef RT2860 + (device_id == NIC2860_PCIe_DEVICE_ID) || + (device_id == NIC2790_PCIe_DEVICE_ID) || + (device_id == VEN_AWT_PCIe_DEVICE_ID) || +#endif // RT2860 // + + 0) + { + UINT32 MacCsr0 = 0, Index= 0; + do + { + RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); + + if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF)) + break; + + RTMPusecDelay(10); + } while (Index++ < 100); + + // Support advanced power save after 2892/2790. + // MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO). + if ((MacCsr0&0xffff0000) != 0x28600000) + { +#ifdef PCIE_PS_SUPPORT + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE); +#endif // PCIE_PS_SUPPORT // + RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCIE); + return; + } + + + } + RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI); + +} + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT +VOID RTMPInitPCIeLinkCtrlValue( + IN PRTMP_ADAPTER pAd) +{ + INT pos; + USHORT reg16, data2, PCIePowerSaveLevel, Configuration; + UINT32 MacValue; + BOOLEAN bFindIntel = FALSE; + POS_COOKIE pObj; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + return; + + DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __FUNCTION__)); + // Init EEPROM, and save settings + if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd))) + { + RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel); + pAd->PCIePowerSaveLevel = PCIePowerSaveLevel & 0xff; + pAd->LnkCtrlBitMask = 0; + if ((PCIePowerSaveLevel&0xff) == 0xff) + { + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE); + DBGPRINT(RT_DEBUG_TRACE, ("====> PCIePowerSaveLevel = 0x%x.\n", PCIePowerSaveLevel)); + return; + } + else + { + PCIePowerSaveLevel &= 0x3; + RT28xx_EEPROM_READ16(pAd, 0x24, data2); + + if( !(((data2&0xff00) == 0x9200) && ((data2&0x80) !=0)) ) + { + if (PCIePowerSaveLevel > 1 ) + PCIePowerSaveLevel = 1; + } + + DBGPRINT(RT_DEBUG_TRACE, ("====> Write 0x83 = 0x%x.\n", PCIePowerSaveLevel)); + AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); + RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel); + PCIePowerSaveLevel &= 0xff; + PCIePowerSaveLevel = PCIePowerSaveLevel >> 6; + switch(PCIePowerSaveLevel) + { + case 0: // Only support L0 + pAd->LnkCtrlBitMask = 0; + break; + case 1: // Only enable L0s + pAd->LnkCtrlBitMask = 1; + break; + case 2: // enable L1, L0s + pAd->LnkCtrlBitMask = 3; + break; + case 3: // sync with host clk and enable L1, L0s + pAd->LnkCtrlBitMask = 0x103; + break; + } + RT28xx_EEPROM_READ16(pAd, 0x24, data2); + if ((PCIePowerSaveLevel&0xff) != 0xff) + { + PCIePowerSaveLevel &= 0x3; + + if( !(((data2&0xff00) == 0x9200) && ((data2&0x80) !=0)) ) + { + if (PCIePowerSaveLevel > 1 ) + PCIePowerSaveLevel = 1; + } + + DBGPRINT(RT_DEBUG_TRACE, ("====> rt28xx Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); + printk("\n\n\n%s:%d\n",__FUNCTION__,__LINE__); + + AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); + } + DBGPRINT(RT_DEBUG_TRACE, ("====> LnkCtrlBitMask = 0x%x.\n", pAd->LnkCtrlBitMask)); + } + } + else if (IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)) + { + UCHAR LinkCtrlSetting = 0; + + // Check 3090E special setting chip. + RT28xx_EEPROM_READ16(pAd, 0x24, data2); + if ((data2 == 0x9280) && ((pAd->MACVersion&0xffff) == 0x0211)) + { + pAd->b3090ESpecialChip = TRUE; + DBGPRINT_RAW(RT_DEBUG_ERROR,("Special 3090E chip \n")); + } + + RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue); + //enable WAKE_PCIE function, which forces to enable PCIE clock when mpu interrupt asserting. + //Force PCIE 125MHz CLK to toggle + MacValue |= 0x402; + RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue); + DBGPRINT_RAW(RT_DEBUG_ERROR,(" AUX_CTRL = 0x%32x\n", MacValue)); + + + + // for RT30xx F and after, PCIe infterface, and for power solution 3 + if ((IS_VERSION_AFTER_F(pAd)) + && (pAd->StaCfg.PSControl.field.rt30xxPowerMode >= 2) + && (pAd->StaCfg.PSControl.field.rt30xxPowerMode <= 3)) + { + RTMP_IO_READ32(pAd, AUX_CTRL, &MacValue); + DBGPRINT_RAW(RT_DEBUG_ERROR,(" Read AUX_CTRL = 0x%x\n", MacValue)); + // turn on bit 12. + //enable 32KHz clock mode for power saving + MacValue |= 0x1000; + if (MacValue != 0xffffffff) + { + RTMP_IO_WRITE32(pAd, AUX_CTRL, MacValue); + DBGPRINT_RAW(RT_DEBUG_ERROR,(" Write AUX_CTRL = 0x%x\n", MacValue)); + // 1. if use PCIePowerSetting is 2 or 3, need to program OSC_CTRL to 0x3ff11. + MacValue = 0x3ff11; + RTMP_IO_WRITE32(pAd, OSC_CTRL, MacValue); + DBGPRINT_RAW(RT_DEBUG_ERROR,(" OSC_CTRL = 0x%x\n", MacValue)); + // 2. Write PCI register Clk ref bit + RTMPrt3xSetPCIePowerLinkCtrl(pAd); + } + else + { + // Error read Aux_Ctrl value. Force to use solution 1 + DBGPRINT(RT_DEBUG_ERROR,(" Error Value in AUX_CTRL = 0x%x\n", MacValue)); + pAd->StaCfg.PSControl.field.rt30xxPowerMode = 1; + DBGPRINT(RT_DEBUG_ERROR,(" Force to use power solution1 \n")); + } + } + // 1. read setting from inf file. + + PCIePowerSaveLevel = (USHORT)pAd->StaCfg.PSControl.field.rt30xxPowerMode; + DBGPRINT(RT_DEBUG_ERROR, ("====> rt30xx Read PowerLevelMode = 0x%x.\n", PCIePowerSaveLevel)); + // 2. Check EnableNewPS. + if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) + PCIePowerSaveLevel = 1; + + if (IS_VERSION_BEFORE_F(pAd) && (pAd->b3090ESpecialChip == FALSE)) + { + // Chip Version E only allow 1, So force set 1. + PCIePowerSaveLevel &= 0x1; + pAd->PCIePowerSaveLevel = (USHORT)PCIePowerSaveLevel; + DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xx E Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); + + AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00); + } + else + { + // Chip Version F and after only allow 1 or 2 or 3. This might be modified after new chip version come out. + if (!((PCIePowerSaveLevel == 1) || (PCIePowerSaveLevel == 3))) + PCIePowerSaveLevel = 1; + DBGPRINT(RT_DEBUG_ERROR, ("====> rt30xx F Write 0x83 Command = 0x%x.\n", PCIePowerSaveLevel)); + pAd->PCIePowerSaveLevel = (USHORT)PCIePowerSaveLevel; + // for 3090F , we need to add high-byte arg for 0x83 command to indicate the link control setting in + // PCI Configuration Space. Because firmware can't read PCI Configuration Space + if ((pAd->Rt3xxRalinkLinkCtrl & 0x2) && (pAd->Rt3xxHostLinkCtrl & 0x2)) + { + LinkCtrlSetting = 1; + } + DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xxF LinkCtrlSetting = 0x%x.\n", LinkCtrlSetting)); + AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, LinkCtrlSetting); + } + + } + + // Find Ralink PCIe Device's Express Capability Offset + pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP); + + if (pos != 0) + { + // Ralink PCIe Device's Link Control Register Offset + pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL; + pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, ®16); + Configuration = le2cpu16(reg16); + DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", + pAd->RLnkCtrlOffset, Configuration)); + pAd->RLnkCtrlConfiguration = (Configuration & 0x103); + Configuration &= 0xfefc; + Configuration |= (0x0); +#ifdef RT2860 + if ((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) + ||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)) + { + reg16 = cpu2le16(Configuration); + pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); + DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", + pos + PCI_EXP_LNKCTL, Configuration)); + } +#endif // RT2860 // + + RTMPFindHostPCIDev(pAd); + if (pObj->parent_pci_dev) + { + USHORT vendor_id; + + pci_read_config_word(pObj->parent_pci_dev, PCI_VENDOR_ID, &vendor_id); + vendor_id = le2cpu16(vendor_id); + if (vendor_id == PCIBUS_INTEL_VENDOR) + { + bFindIntel = TRUE; + RTMP_SET_PSFLAG(pAd, fRTMP_PS_TOGGLE_L1); + } + /* + else if ((vendor_id == PCIBUS_AMD_VENDOR1) + && (DeviceID == 0x96000000)) + { + //Verified 2792 Aspire 8530 AMD NB (S3/S4/CBoot/WBoot/Chariot) by customer and ourselves. + // So use L1 Toggle method in this NB. + bFindIntel = TRUE; + RTMP_SET_PSFLAG(pAd, fRTMP_PS_TOGGLE_L1); + DBGPRINT(RT_DEBUG_TRACE, ("PSM : Aspire 8530 AMD NB. Use L1 Toggle. \n")); + } + */ + // Find PCI-to-PCI Bridge Express Capability Offset + pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP); + + if (pos != 0) + { + BOOLEAN bChange = FALSE; + // PCI-to-PCI Bridge Link Control Register Offset + pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL; + pci_read_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, ®16); + Configuration = le2cpu16(reg16); + DBGPRINT(RT_DEBUG_TRACE, ("Read (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n", + pAd->HostLnkCtrlOffset, Configuration)); + pAd->HostLnkCtrlConfiguration = (Configuration & 0x103); + Configuration &= 0xfefc; + Configuration |= (0x0); + + switch (pObj->DeviceID) + { +#ifdef RT2860 + case NIC2860_PCIe_DEVICE_ID: + case NIC2790_PCIe_DEVICE_ID: + bChange = TRUE; + break; +#endif // RT2860 // + default: + break; + } + + if (bChange) + { + reg16 = cpu2le16(Configuration); + pci_write_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, reg16); + DBGPRINT(RT_DEBUG_TRACE, ("Write (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n", + pAd->HostLnkCtrlOffset, Configuration)); + } + } + else + { + pAd->HostLnkCtrlOffset = 0; + DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find PCI-to-PCI Bridge PCI Express Capability!\n", __FUNCTION__)); + } + } + } + else + { + pAd->RLnkCtrlOffset = 0; + pAd->HostLnkCtrlOffset = 0; + DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find Ralink PCIe Device's PCI Express Capability!\n", __FUNCTION__)); + } + + if (bFindIntel == FALSE) + { + DBGPRINT(RT_DEBUG_TRACE, ("Doesn't find Intel PCI host controller. \n")); + // Doesn't switch L0, L1, So set PCIePowerSaveLevel to 0xff + pAd->PCIePowerSaveLevel = 0xff; + if ((pAd->RLnkCtrlOffset != 0) + ) + { + pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, ®16); + Configuration = le2cpu16(reg16); + DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink 30xx PCIe Link Control Register) offset 0x%x = 0x%x\n", + pAd->RLnkCtrlOffset, Configuration)); + pAd->RLnkCtrlConfiguration = (Configuration & 0x103); + Configuration &= 0xfefc; + Configuration |= (0x0); + reg16 = cpu2le16(Configuration); + pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); + DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", + pos + PCI_EXP_LNKCTL, Configuration)); + } + } +} + +VOID RTMPFindHostPCIDev( + IN PRTMP_ADAPTER pAd) +{ + USHORT reg16; + UCHAR reg8; + UINT DevFn; + PPCI_DEV pPci_dev; + POS_COOKIE pObj; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + return; + + DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __FUNCTION__)); + + pObj->parent_pci_dev = NULL; + if (pObj->pci_dev->bus->parent) + { + for (DevFn = 0; DevFn < 255; DevFn++) + { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0) + pPci_dev = pci_get_slot(pObj->pci_dev->bus->parent, DevFn); +#else + pPci_dev = pci_find_slot(pObj->pci_dev->bus->parent->number, DevFn); +#endif + if (pPci_dev) + { + pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, ®16); + reg16 = le2cpu16(reg16); + pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS, ®8); + if ((reg16 == PCI_CLASS_BRIDGE_PCI) && + (reg8 == pObj->pci_dev->bus->number)) + { + pObj->parent_pci_dev = pPci_dev; + } + } + } + } +} + +/* + ======================================================================== + + Routine Description: + + Arguments: + Level = RESTORE_HALT : Restore PCI host and Ralink PCIe Link Control field to its default value. + Level = Other Value : Restore from dot11 power save or radio off status. And force PCI host Link Control fields to 0x1 + + ======================================================================== +*/ +VOID RTMPPCIeLinkCtrlValueRestore( + IN PRTMP_ADAPTER pAd, + IN UCHAR Level) +{ + USHORT PCIePowerSaveLevel, reg16; + USHORT Configuration; + POS_COOKIE pObj; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + return; + + // Check PSControl Configuration + if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) + return TRUE; + + //3090 will not execute the following codes. + // Check interface : If not PCIe interface, return. +#ifdef RT2860 + if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) + ||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID))) + return; +#endif // RT2860 // + + + +#ifdef RT3590 + if ((pObj->DeviceID == NIC3590_PCIe_DEVICE_ID) + ||(pObj->DeviceID == NIC3591_PCIe_DEVICE_ID) + ||(pObj->DeviceID == NIC3592_PCIe_DEVICE_ID)) + return; +#endif // RT3390 // + + DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __FUNCTION__)); + PCIePowerSaveLevel = pAd->PCIePowerSaveLevel; + if ((PCIePowerSaveLevel&0xff) == 0xff) + { + DBGPRINT(RT_DEBUG_TRACE,("return \n")); + return; + } + + if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) + { + PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); + if ((Configuration != 0) && + (Configuration != 0xFFFF)) + { + Configuration &= 0xfefc; + // If call from interface down, restore to orginial setting. + if (Level == RESTORE_CLOSE) + { + Configuration |= pAd->HostLnkCtrlConfiguration; + } + else + Configuration |= 0x0; + PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); + DBGPRINT(RT_DEBUG_TRACE, ("Restore PCI host : offset 0x%x = 0x%x\n", pAd->HostLnkCtrlOffset, Configuration)); + } + else + DBGPRINT(RT_DEBUG_ERROR, ("Restore PCI host : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration)); + } + + if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) + { + PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); + if ((Configuration != 0) && + (Configuration != 0xFFFF)) + { + Configuration &= 0xfefc; + // If call from interface down, restore to orginial setting. + if (Level == RESTORE_CLOSE) + Configuration |= pAd->RLnkCtrlConfiguration; + else + Configuration |= 0x0; + PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); + DBGPRINT(RT_DEBUG_TRACE, ("Restore Ralink : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration)); + } + else + DBGPRINT(RT_DEBUG_ERROR, ("Restore Ralink : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration)); + } + + DBGPRINT(RT_DEBUG_TRACE,("%s <===\n", __FUNCTION__)); +} + +/* + ======================================================================== + + Routine Description: + + Arguments: + Max : limit Host PCI and Ralink PCIe device's LINK CONTROL field's value. + Because now frequently set our device to mode 1 or mode 3 will cause problem. + + ======================================================================== +*/ +VOID RTMPPCIeLinkCtrlSetting( + IN PRTMP_ADAPTER pAd, + IN USHORT Max) +{ + USHORT PCIePowerSaveLevel, reg16; + USHORT Configuration; + POS_COOKIE pObj; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + return; + + // Check PSControl Configuration + if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) + return TRUE; + + // Check interface : If not PCIe interface, return. + //Block 3090 to enter the following function + +#ifdef RT2860 + if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID) + ||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID))) + return; +#endif // RT2860 // + + if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP)) + { + DBGPRINT(RT_DEBUG_INFO, ("RTMPPCIePowerLinkCtrl return on fRTMP_PS_CAN_GO_SLEEP flag\n")); + return; + } + DBGPRINT(RT_DEBUG_TRACE,("%s===>\n", __FUNCTION__)); + PCIePowerSaveLevel = pAd->PCIePowerSaveLevel; + if ((PCIePowerSaveLevel&0xff) == 0xff) + { + DBGPRINT(RT_DEBUG_TRACE,("return \n")); + return; + } + PCIePowerSaveLevel = PCIePowerSaveLevel>>6; + + // Skip non-exist deice right away + if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0)) + { + PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); + switch (PCIePowerSaveLevel) + { + case 0: + // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 00 + Configuration &= 0xfefc; + break; + case 1: + // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 01 + Configuration &= 0xfefc; + Configuration |= 0x1; + break; + case 2: + // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 + Configuration &= 0xfefc; + Configuration |= 0x3; + break; + case 3: + // Set b0 and b1 of LinkControl (both 2892 and PCIe bridge) to 11 and bit 8 of LinkControl of 2892 to 1 + Configuration &= 0xfefc; + Configuration |= 0x103; + break; + } + PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration); + DBGPRINT(RT_DEBUG_TRACE, ("Write PCI host offset 0x%x = 0x%x\n", pAd->HostLnkCtrlOffset, Configuration)); + } + + if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0)) + { + // first 2892 chip not allow to frequently set mode 3. will cause hang problem. + if (PCIePowerSaveLevel > Max) + PCIePowerSaveLevel = Max; + + PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); + Configuration |= 0x100; + PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration); + DBGPRINT(RT_DEBUG_TRACE, ("Write Ralink device : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration)); + } + + DBGPRINT(RT_DEBUG_TRACE,("RTMPPCIePowerLinkCtrl <==============\n")); +} +/* + ======================================================================== + + Routine Description: + 1. Write a PCI register for rt30xx power solution 3 + + ======================================================================== +*/ +VOID RTMPrt3xSetPCIePowerLinkCtrl( + IN PRTMP_ADAPTER pAd) +{ + + ULONG HostConfiguration; + ULONG Configuration; + ULONG Vendor; + ULONG offset; + POS_COOKIE pObj; + INT pos; + USHORT reg16; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + DBGPRINT(RT_DEBUG_INFO, ("RTMPrt3xSetPCIePowerLinkCtrl.===> %x\n", pAd->StaCfg.PSControl.word)); + + // Check PSControl Configuration + if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) + return; + RTMPFindHostPCIDev(pAd); + if (pObj->parent_pci_dev) + { + USHORT vendor_id; + // Find PCI-to-PCI Bridge Express Capability Offset + pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP); + + if (pos != 0) + { + pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL; + } + // If configurared to turn on L1. + HostConfiguration = 0; + if (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1) + { + DBGPRINT(RT_DEBUG_TRACE, ("Enter,PSM : Force ASPM \n")); + + // Skip non-exist deice right away + if ((pAd->HostLnkCtrlOffset != 0)) + { + PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); + // Prepare Configuration to write to Host +#ifdef RELEASE_EXCLUDE +/* + The 9th bit of Host Control is read-only bit and we skit it. + Therefore, the original methods of rt2790 will not casue any effect. +*/ +#endif // RELEASE_EXCLUDE // + HostConfiguration |= 0x3; + PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); + pAd->Rt3xxHostLinkCtrl = HostConfiguration; + // Because in rt30xxForceASPMTest Mode, Force turn on L0s, L1. + // Fix HostConfiguration bit0:1 = 0x3 for later use. + HostConfiguration = 0x3; + DBGPRINT(RT_DEBUG_TRACE, ("PSM : Force ASPM : Host device L1/L0s Value = 0x%x\n", HostConfiguration)); + } + } + else if (pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1) + { + + // Skip non-exist deice right away + if ((pAd->HostLnkCtrlOffset != 0)) + { + PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, HostConfiguration); + pAd->Rt3xxHostLinkCtrl = HostConfiguration; + HostConfiguration &= 0x3; + DBGPRINT(RT_DEBUG_TRACE, ("PSM : Follow Host ASPM : Host device L1/L0s Value = 0x%x\n", HostConfiguration)); + } + } + } + // Prepare to write Ralink setting. + // Find Ralink PCIe Device's Express Capability Offset + pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP); + + if (pos != 0) + { + // Ralink PCIe Device's Link Control Register Offset + pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL; + pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, ®16); + Configuration = le2cpu16(reg16); + DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n", + pAd->RLnkCtrlOffset, Configuration)); + Configuration |= 0x100; + if ((pAd->StaCfg.PSControl.field.rt30xxFollowHostASPM == 1) + || (pAd->StaCfg.PSControl.field.rt30xxForceASPMTest == 1)) + { + switch(HostConfiguration) + { + case 0: + Configuration &= 0xffffffc; + break; + case 1: + Configuration &= 0xffffffc; + Configuration |= 0x1; + break; + case 2: + Configuration &= 0xffffffc; + Configuration |= 0x2; + break; + case 3: + Configuration |= 0x3; + break; + } + } + reg16 = cpu2le16(Configuration); + pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16); + pAd->Rt3xxRalinkLinkCtrl = Configuration; + DBGPRINT(RT_DEBUG_TRACE, ("PSM :Write Ralink device L1/L0s Value = 0x%x\n", Configuration)); + } + DBGPRINT(RT_DEBUG_INFO,("PSM :RTMPrt3xSetPCIePowerLinkCtrl <==============\n")); + +} +#endif // PCIE_PS_SUPPORT // +#endif // CONFIG_STA_SUPPORT // + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/pci_main_dev.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/pci_main_dev.o new file mode 100644 index 0000000000000000000000000000000000000000..22f4f689114c74078b6fca6a92a38756fd808ca1 GIT binary patch literal 8392 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 literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.ko b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.ko new file mode 100644 index 0000000000000000000000000000000000000000..bcd2b9fac0d987fe0a0be263fe00568b963acc22 GIT binary patch literal 1008207 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	myT8y2 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%0Ax3vU* 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®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/X!lt9|i^wKL&=gAneb;uqA+jK_QTVp&^8U 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 zic�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 YFo1^3Ky#DOg*TuB%;4EO9lH1)0B1<X1^@s6 literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.mod.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.mod.c new file mode 100644 index 000000000..e785d92dc --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.mod.c @@ -0,0 +1,149 @@ +#include <linux/module.h> +#include <linux/vermagic.h> +#include <linux/compiler.h> + +MODULE_INFO(vermagic, VERMAGIC_STRING); + +struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = KBUILD_MODNAME, + .init = init_module, +#ifdef CONFIG_MODULE_UNLOAD + .exit = cleanup_module, +#endif + .arch = MODULE_ARCH_INIT, +}; + +static const struct modversion_info ____versions[] +__used +__attribute__((section("__versions"))) = { + { 0x24853d63, "module_layout" }, + { 0xfba2b770, "register_netdevice" }, + { 0x9a1dfd65, "strpbrk" }, + { 0x84b8edbb, "per_cpu__current_task" }, + { 0x9b4cebe0, "kmalloc_caches" }, + { 0x12da5bb2, "__kmalloc" }, + { 0xe640527d, "mem_map" }, + { 0xd6ee688f, "vmalloc" }, + { 0x349cba85, "strchr" }, + { 0x69a358a6, "iomem_resource" }, + { 0xd0d8621b, "strlen" }, + { 0xc7ec6c27, "strspn" }, + { 0x606bae0b, "dev_set_drvdata" }, + { 0xc8b57c27, "autoremove_wake_function" }, + { 0x7f9d99a2, "pci_disable_device" }, + { 0x267fc65b, "__tasklet_hi_schedule" }, + { 0xa03497ef, "netif_carrier_on" }, + { 0x5203432e, "skb_clone" }, + { 0xb98e4e4f, "dev_get_by_name" }, + { 0x105e2727, "__tracepoint_kmalloc" }, + { 0x7f84ea44, "netif_carrier_off" }, + { 0xb0a43979, "filp_close" }, + { 0x93bb0e20, "x86_dma_fallback_dev" }, + { 0xeae3dfd6, "__const_udelay" }, + { 0x83c2f3, "pci_release_regions" }, + { 0x6a9f26c9, "init_timer_key" }, + { 0x85df9b6c, "strsep" }, + { 0xd4d4f05e, "pci_enable_wake" }, + { 0x999e8297, "vfree" }, + { 0x712aa29b, "_spin_lock_irqsave" }, + { 0x3c2c5af5, "sprintf" }, + { 0x7d11c268, "jiffies" }, + { 0xacf48c14, "skb_trim" }, + { 0xe2d5255a, "strcmp" }, + { 0xf6e5f8d6, "netif_rx" }, + { 0xffc7c184, "__init_waitqueue_head" }, + { 0x9629486a, "per_cpu__cpu_number" }, + { 0x41344088, "param_get_charp" }, + { 0xc6b9275b, "pci_set_master" }, + { 0xe83fea1, "del_timer_sync" }, + { 0x16bfa528, "alloc_etherdev_mq" }, + { 0x1e7e5e85, "dev_alloc_skb" }, + { 0xb2c33749, "pci_restore_state" }, + { 0x8d3894f2, "_ctype" }, + { 0xb72397d5, "printk" }, + { 0x42224298, "sscanf" }, + { 0x212009a9, "kthread_stop" }, + { 0xacdeb154, "__tracepoint_module_get" }, + { 0xc5df3675, "free_netdev" }, + { 0x2f287f0d, "copy_to_user" }, + { 0xb6ed1e53, "strncpy" }, + { 0x1ee14c4d, "register_netdev" }, + { 0xb4390f9a, "mcount" }, + { 0x8724a99b, "wireless_send_event" }, + { 0x6c2e3320, "strncmp" }, + { 0xeb2642ef, "skb_push" }, + { 0x5c013870, "dev_close" }, + { 0x4b07e779, "_spin_unlock_irqrestore" }, + { 0xa5808bbf, "tasklet_init" }, + { 0x45450063, "mod_timer" }, + { 0x46085e4f, "add_timer" }, + { 0x55b3133e, "dma_release_from_coherent" }, + { 0xfda85a7d, "request_threaded_irq" }, + { 0x29f4f787, "skb_pull" }, + { 0xb1c547d1, "dev_kfree_skb_any" }, + { 0xe84c74a3, "dma_alloc_from_coherent" }, + { 0xe523ad75, "synchronize_irq" }, + { 0x61651be, "strcat" }, + { 0x79ad224b, "tasklet_kill" }, + { 0x80421f3d, "module_put" }, + { 0x4be972ca, "skb_copy_expand" }, + { 0xdb39cf3b, "netif_device_attach" }, + { 0xe5662700, "kmem_cache_alloc" }, + { 0xc37a7cb0, "netif_device_detach" }, + { 0x94ea6ee9, "__alloc_skb" }, + { 0x42c8de35, "ioremap_nocache" }, + { 0x566ef017, "pci_bus_read_config_word" }, + { 0xf0fdf6cb, "__stack_chk_fail" }, + { 0xd62c833f, "schedule_timeout" }, + { 0x4292364c, "schedule" }, + { 0x88c00f42, "eth_type_trans" }, + { 0xd7e2b6f6, "wake_up_process" }, + { 0xf413d6d4, "pskb_expand_head" }, + { 0x7c61340c, "__release_region" }, + { 0x6e6194e1, "pci_unregister_driver" }, + { 0x7ecb001b, "__per_cpu_offset" }, + { 0x6ad065f4, "param_set_charp" }, + { 0x642e54ac, "__wake_up" }, + { 0x16de041, "pci_set_power_state" }, + { 0xd2965f6f, "kthread_should_stop" }, + { 0x3aa1dbcf, "_spin_unlock_bh" }, + { 0x37a0cba, "kfree" }, + { 0xa130898e, "kthread_create" }, + { 0x82b1281f, "pci_request_regions" }, + { 0x33d92f9a, "prepare_to_wait" }, + { 0xedc03953, "iounmap" }, + { 0x3fc7e898, "__pci_register_driver" }, + { 0x9ccb2622, "finish_wait" }, + { 0x1a30b93a, "unregister_netdev" }, + { 0xb742fd7, "simple_strtol" }, + { 0xc8f471fe, "pci_choose_state" }, + { 0xce83c28a, "__netif_schedule" }, + { 0x8235805b, "memmove" }, + { 0x93cbd1ec, "_spin_lock_bh" }, + { 0x28aa89e3, "skb_put" }, + { 0xe971befc, "pci_enable_device" }, + { 0xd6c963c, "copy_from_user" }, + { 0x5967ba4a, "dev_get_drvdata" }, + { 0x9e7d6bd0, "__udelay" }, + { 0x3ace37c9, "dma_ops" }, + { 0xf20dabd8, "free_irq" }, + { 0x320bf8eb, "pci_save_state" }, + { 0xe914e41e, "strcpy" }, + { 0x99ad0582, "filp_open" }, +}; + +static const char __module_depends[] +__used +__attribute__((section(".modinfo"))) = +"depends="; + +MODULE_ALIAS("pci:v00001814d00000601sv*sd*bc*sc*i*"); +MODULE_ALIAS("pci:v00001814d00000681sv*sd*bc*sc*i*"); +MODULE_ALIAS("pci:v00001814d00000701sv*sd*bc*sc*i*"); +MODULE_ALIAS("pci:v00001814d00000781sv*sd*bc*sc*i*"); +MODULE_ALIAS("pci:v00001814d00003062sv*sd*bc*sc*i*"); +MODULE_ALIAS("pci:v00001814d00003562sv*sd*bc*sc*i*"); +MODULE_ALIAS("pci:v00001814d00003060sv*sd*bc*sc*i*"); + +MODULE_INFO(srcversion, "1B235C939C281EE842C6509"); diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.mod.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.mod.o new file mode 100644 index 0000000000000000000000000000000000000000..cdc0e6b3dea873c4b0de1e7aa5af876caed89731 GIT binary patch literal 9660 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 literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt3562sta.o new file mode 100644 index 0000000000000000000000000000000000000000..74daaf854227910795fb4804767e91fcaa8f1ba1 GIT binary patch literal 999220 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�^M4*D<gF$FbI#pvr;2MTi{~ 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�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 literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_ate.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_ate.c new file mode 100644 index 000000000..c0b54cca8 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_ate.c @@ -0,0 +1,6992 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + +#include "rt_config.h" + +#ifdef RALINK_ATE + +#if defined(RT30xx) || defined(RT2883) +#define ATE_BBP_REG_NUM 168 +UCHAR restore_BBP[ATE_BBP_REG_NUM]={0}; +#endif // RT30xx // + +// 802.11 MAC Header, Type:Data, Length:24bytes +UCHAR TemplateFrame[24] = {0x08,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x00,0xAA,0xBB,0x12,0x34,0x56,0x00,0x11,0x22,0xAA,0xBB,0xCC,0x00,0x00}; + +extern RTMP_RF_REGS RF2850RegTable[]; +extern UCHAR NUM_OF_2850_CHNL; + +extern FREQUENCY_ITEM FreqItems3020[]; +extern UCHAR NUM_OF_3020_CHNL; + +#ifdef RT35xx +extern FREQUENCY_ITEM FreqItems3572[]; +extern UCHAR NUM_OF_3572_CHNL; +#endif // RT35xx // + + + +static CHAR CCKRateTable[] = {0, 1, 2, 3, 8, 9, 10, 11, -1}; /* CCK Mode. */ +static CHAR OFDMRateTable[] = {0, 1, 2, 3, 4, 5, 6, 7, -1}; /* OFDM Mode. */ +static CHAR HTMIXRateTable[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1}; /* HT Mix Mode. */ + + +static INT TxDmaBusy( + IN PRTMP_ADAPTER pAd); + +static INT RxDmaBusy( + IN PRTMP_ADAPTER pAd); + +static VOID RtmpDmaEnable( + IN PRTMP_ADAPTER pAd, + IN INT Enable); + +static VOID BbpSoftReset( + IN PRTMP_ADAPTER pAd); + +static VOID RtmpRfIoWrite( + IN PRTMP_ADAPTER pAd); + +static INT ATESetUpFrame( + IN PRTMP_ADAPTER pAd, + IN UINT32 TxIdx); + +static INT ATETxPwrHandler( + IN PRTMP_ADAPTER pAd, + IN char index); + +static NDIS_STATUS ATESTART( + IN PRTMP_ADAPTER pAd); + +static NDIS_STATUS ATESTOP( + IN PRTMP_ADAPTER pAd); + +static NDIS_STATUS TXCARR( + IN PRTMP_ADAPTER pAd); + +static NDIS_STATUS TXCONT( + IN PRTMP_ADAPTER pAd); + +static NDIS_STATUS TXFRAME( + IN PRTMP_ADAPTER pAd); + +static NDIS_STATUS RXFRAME( + IN PRTMP_ADAPTER pAd); + +#ifdef RALINK_28xx_QA +static NDIS_STATUS TXSTOP( + IN PRTMP_ADAPTER pAd); + +static NDIS_STATUS RXSTOP( + IN PRTMP_ADAPTER pAd); +#endif // RALINK_28xx_QA // + +static NDIS_STATUS ATECmdHandler( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +#ifndef RT30xx +static int CheckMCSValid( + IN UCHAR Mode, + IN UCHAR Mcs); +#endif // RT30xx // + +#ifdef RT30xx +static int CheckMCSValid( + IN UCHAR Mode, + IN UCHAR Mcs, + IN BOOLEAN bRT2070); +#endif // RT30xx // + +#ifdef RTMP_MAC_PCI +static VOID ATEWriteTxWI( + IN PRTMP_ADAPTER pAd, + IN PTXWI_STRUC pOutTxWI, + IN BOOLEAN FRAG, + IN BOOLEAN CFACK, + IN BOOLEAN InsTimestamp, + IN BOOLEAN AMPDU, + IN BOOLEAN Ack, + IN BOOLEAN NSeq, // HW new a sequence. + IN UCHAR BASize, + IN UCHAR WCID, + IN ULONG Length, + IN UCHAR PID, + IN UCHAR TID, + IN UCHAR TxRate, + IN UCHAR Txopmode, + IN BOOLEAN CfAck, + IN HTTRANSMIT_SETTING *pTransmit); +#endif // RTMP_MAC_PCI // + + +static VOID SetJapanFilter( + IN PRTMP_ADAPTER pAd); + + +#ifdef RALINK_28xx_QA +/* command id with Cmd Type == 0x0008(for 28xx)/0x0005(for iNIC) */ +#define RACFG_CMD_RF_WRITE_ALL 0x0000 +#define RACFG_CMD_E2PROM_READ16 0x0001 +#define RACFG_CMD_E2PROM_WRITE16 0x0002 +#define RACFG_CMD_E2PROM_READ_ALL 0x0003 +#define RACFG_CMD_E2PROM_WRITE_ALL 0x0004 +#define RACFG_CMD_IO_READ 0x0005 +#define RACFG_CMD_IO_WRITE 0x0006 +#define RACFG_CMD_IO_READ_BULK 0x0007 +#define RACFG_CMD_BBP_READ8 0x0008 +#define RACFG_CMD_BBP_WRITE8 0x0009 +#define RACFG_CMD_BBP_READ_ALL 0x000a +#define RACFG_CMD_GET_COUNTER 0x000b +#define RACFG_CMD_CLEAR_COUNTER 0x000c + +#define RACFG_CMD_RSV1 0x000d +#define RACFG_CMD_RSV2 0x000e +#define RACFG_CMD_RSV3 0x000f + +#define RACFG_CMD_TX_START 0x0010 +#define RACFG_CMD_GET_TX_STATUS 0x0011 +#define RACFG_CMD_TX_STOP 0x0012 +#define RACFG_CMD_RX_START 0x0013 +#define RACFG_CMD_RX_STOP 0x0014 +#define RACFG_CMD_GET_NOISE_LEVEL 0x0015 + +#define RACFG_CMD_ATE_START 0x0080 +#define RACFG_CMD_ATE_STOP 0x0081 + +#define RACFG_CMD_ATE_START_TX_CARRIER 0x0100 +#define RACFG_CMD_ATE_START_TX_CONT 0x0101 +#define RACFG_CMD_ATE_START_TX_FRAME 0x0102 +#define RACFG_CMD_ATE_SET_BW 0x0103 +#define RACFG_CMD_ATE_SET_TX_POWER0 0x0104 +#define RACFG_CMD_ATE_SET_TX_POWER1 0x0105 +#define RACFG_CMD_ATE_SET_FREQ_OFFSET 0x0106 +#define RACFG_CMD_ATE_GET_STATISTICS 0x0107 +#define RACFG_CMD_ATE_RESET_COUNTER 0x0108 +#define RACFG_CMD_ATE_SEL_TX_ANTENNA 0x0109 +#define RACFG_CMD_ATE_SEL_RX_ANTENNA 0x010a +#define RACFG_CMD_ATE_SET_PREAMBLE 0x010b +#define RACFG_CMD_ATE_SET_CHANNEL 0x010c +#define RACFG_CMD_ATE_SET_ADDR1 0x010d +#define RACFG_CMD_ATE_SET_ADDR2 0x010e +#define RACFG_CMD_ATE_SET_ADDR3 0x010f +#define RACFG_CMD_ATE_SET_RATE 0x0110 +#define RACFG_CMD_ATE_SET_TX_FRAME_LEN 0x0111 +#define RACFG_CMD_ATE_SET_TX_FRAME_COUNT 0x0112 +#define RACFG_CMD_ATE_START_RX_FRAME 0x0113 +#define RACFG_CMD_ATE_E2PROM_READ_BULK 0x0114 +#define RACFG_CMD_ATE_E2PROM_WRITE_BULK 0x0115 +#define RACFG_CMD_ATE_IO_WRITE_BULK 0x0116 +#define RACFG_CMD_ATE_BBP_READ_BULK 0x0117 +#define RACFG_CMD_ATE_BBP_WRITE_BULK 0x0118 +#define RACFG_CMD_ATE_RF_READ_BULK 0x0119 +#define RACFG_CMD_ATE_RF_WRITE_BULK 0x011a + +static VOID memcpy_exl(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len); +static VOID memcpy_exs(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len); +static VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, UINT32 len); + +#define LEN_OF_ARG 16 + +static inline INT ResponseToGUI( + IN struct ate_racfghdr *pRaCfg, + IN struct iwreq *pwrq, + IN INT Length, + IN INT Status) +{ + (pRaCfg)->length = htons((Length)); + (pRaCfg)->status = htons((Status)); + (pwrq)->u.data.length = sizeof((pRaCfg)->magic_no) + sizeof((pRaCfg)->command_type) + + sizeof((pRaCfg)->command_id) + sizeof((pRaCfg)->length) + + sizeof((pRaCfg)->sequence) + ntohs((pRaCfg)->length); + ATEDBGPRINT(RT_DEBUG_TRACE, ("wrq->u.data.length = %d\n", (pwrq)->u.data.length)); + if (copy_to_user((pwrq)->u.data.pointer, (UCHAR *)(pRaCfg), (pwrq)->u.data.length)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("copy_to_user() fail in %s\n", __FUNCTION__)); + return (-EFAULT); + + } + else + { + ATEDBGPRINT(RT_DEBUG_TRACE, ("%s is done !\n", __FUNCTION__)); + } + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_START( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_START\n")); + + /* Prepare feedback as soon as we can to avoid QA timeout. */ + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + Set_ATE_Proc(pAdapter, "ATESTART"); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_STOP( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + INT32 ret; + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_STOP\n")); + + /* + Distinguish this command came from QA(via ate agent) + or ate agent according to the existence of pid in payload. + + No need to prepare feedback if this cmd came directly from ate agent, + not from QA. + */ + pRaCfg->length = ntohs(pRaCfg->length); + + if (pRaCfg->length == sizeof(pAdapter->ate.AtePid)) + { + /* + This command came from QA. + Get the pid of ATE agent. + */ + memcpy((UCHAR *)&pAdapter->ate.AtePid, + (&pRaCfg->data[0]) - 2/* == sizeof(pRaCfg->status) */, + sizeof(pAdapter->ate.AtePid)); + + /* Prepare feedback as soon as we can to avoid QA timeout. */ + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + /* + Kill ATE agent when leaving ATE mode. + + We must kill ATE agent first before setting ATESTOP, + or Microsoft will report sth. wrong. + */ +#ifdef LINUX + ret = KILL_THREAD_PID(pAdapter->ate.AtePid, SIGTERM, 1); + + if (ret) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("%s: unable to kill ate thread\n", pAdapter->net_dev->name)); + } +#endif // LINUX // + } + + + /* AP/STA might have in ATE_STOP mode due to cmd from QA. */ + if (ATE_ON(pAdapter)) + { + /* Someone has killed ate agent while QA GUI is still open. */ + Set_ATE_Proc(pAdapter, "ATESTOP"); + ATEDBGPRINT(RT_DEBUG_TRACE, ("RACFG_CMD_AP_START is done !\n")); + } + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_RF_WRITE_ALL( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + UINT32 R1, R2, R3, R4; + USHORT channel; + + memcpy(&R1, pRaCfg->data-2, 4); + memcpy(&R2, pRaCfg->data+2, 4); + memcpy(&R3, pRaCfg->data+6, 4); + memcpy(&R4, pRaCfg->data+10, 4); + memcpy(&channel, pRaCfg->data+14, 2); + + pAdapter->LatchRfRegs.R1 = ntohl(R1); + pAdapter->LatchRfRegs.R2 = ntohl(R2); + pAdapter->LatchRfRegs.R3 = ntohl(R3); + pAdapter->LatchRfRegs.R4 = ntohl(R4); + pAdapter->LatchRfRegs.Channel = ntohs(channel); + + RTMP_RF_IO_WRITE32(pAdapter, pAdapter->LatchRfRegs.R1); + RTMP_RF_IO_WRITE32(pAdapter, pAdapter->LatchRfRegs.R2); + RTMP_RF_IO_WRITE32(pAdapter, pAdapter->LatchRfRegs.R3); + RTMP_RF_IO_WRITE32(pAdapter, pAdapter->LatchRfRegs.R4); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_E2PROM_READ16( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + UINT16 offset=0, value=0; + USHORT tmp=0; + + offset = ntohs(pRaCfg->status); + + /* "tmp" is especially for some compilers... */ + RT28xx_EEPROM_READ16(pAdapter, offset, tmp); + value = tmp; + value = htons(value); + + ATEDBGPRINT(RT_DEBUG_TRACE,("EEPROM Read offset = 0x%04x, value = 0x%04x\n", offset, value)); + memcpy(pRaCfg->data, &value, 2); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+2, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_E2PROM_WRITE16( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset, value; + + offset = ntohs(pRaCfg->status); + memcpy(&value, pRaCfg->data, 2); + value = ntohs(value); + RT28xx_EEPROM_WRITE16(pAdapter, offset, value); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_E2PROM_READ_ALL( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT buffer[EEPROM_SIZE/2]; + + rt_ee_read_all(pAdapter,(USHORT *)buffer); + memcpy_exs(pAdapter, pRaCfg->data, (UCHAR *)buffer, EEPROM_SIZE); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+EEPROM_SIZE, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_E2PROM_WRITE_ALL( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT buffer[EEPROM_SIZE/2]; + + NdisZeroMemory((UCHAR *)buffer, EEPROM_SIZE); + memcpy_exs(pAdapter, (UCHAR *)buffer, (UCHAR *)&pRaCfg->status, EEPROM_SIZE); + rt_ee_write_all(pAdapter,(USHORT *)buffer); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_IO_READ( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + UINT32 offset; + UINT32 value; + + memcpy(&offset, &pRaCfg->status, 4); + offset = ntohl(offset); + + /* + We do not need the base address. + So just extract the offset out. + */ + offset &= 0x0000FFFF; + RTMP_IO_READ32(pAdapter, offset, &value); + value = htonl(value); + memcpy(pRaCfg->data, &value, 4); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+4, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_IO_WRITE( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + UINT32 offset, value; + + memcpy(&offset, pRaCfg->data-2, 4); + memcpy(&value, pRaCfg->data+2, 4); + + offset = ntohl(offset); + + /* + We do not need the base address. + So just extract the offset out. + */ + offset &= 0x0000FFFF; + value = ntohl(value); + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_IO_WRITE: offset = %x, value = %x\n", offset, value)); + RTMP_IO_WRITE32(pAdapter, offset, value); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_IO_READ_BULK( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + UINT32 offset; + USHORT len; + + memcpy(&offset, &pRaCfg->status, 4); + offset = ntohl(offset); + + /* + We do not need the base address. + So just extract the offset out. + */ + offset &= 0x0000FFFF; + memcpy(&len, pRaCfg->data+2, 2); + len = ntohs(len); + + if (len > 371) + { + ATEDBGPRINT(RT_DEBUG_TRACE,("length requested is too large, make it smaller\n")); + pRaCfg->length = htons(2); + pRaCfg->status = htons(1); + return -EFAULT; + } + + RTMP_IO_READ_BULK(pAdapter, pRaCfg->data, (UCHAR *)offset, len*4);// unit in four bytes + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+(len*4), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_BBP_READ8( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset; + UCHAR value; + + value = 0; + offset = ntohs(pRaCfg->status); + + if (ATE_ON(pAdapter)) + { + ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, offset, &value); + } + else + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, offset, &value); + } + + pRaCfg->data[0] = value; + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+1, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_BBP_WRITE8( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset; + UCHAR value; + + offset = ntohs(pRaCfg->status); + memcpy(&value, pRaCfg->data, 1); + + if (ATE_ON(pAdapter)) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, offset, value); + } + else + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, offset, value); + } + + if ((offset == BBP_R1) || (offset == BBP_R3)) + { + SyncTxRxConfig(pAdapter, offset, value); + } + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_BBP_READ_ALL( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT bbp_reg_index; + + for (bbp_reg_index = 0; bbp_reg_index < MAX_BBP_ID+1; bbp_reg_index++) + { + pRaCfg->data[bbp_reg_index] = 0; + + if (ATE_ON(pAdapter)) + { + ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbp_reg_index, &pRaCfg->data[bbp_reg_index]); + } + else + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, bbp_reg_index, &pRaCfg->data[bbp_reg_index]); + } + } + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+MAX_BBP_ID+1, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_GET_NOISE_LEVEL( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + UCHAR channel; + INT32 buffer[3][10];/* 3 : RxPath ; 10 : no. of per rssi samples */ + + channel = (ntohs(pRaCfg->status) & 0x00FF); + CalNoiseLevel(pAdapter, channel, buffer); + memcpy_exl(pAdapter, (UCHAR *)pRaCfg->data, (UCHAR *)&(buffer[0][0]), (sizeof(INT32)*3*10)); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+(sizeof(INT32)*3*10), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_GET_COUNTER( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + memcpy_exl(pAdapter, &pRaCfg->data[0], (UCHAR *)&pAdapter->ate.U2M, 4); + memcpy_exl(pAdapter, &pRaCfg->data[4], (UCHAR *)&pAdapter->ate.OtherData, 4); + memcpy_exl(pAdapter, &pRaCfg->data[8], (UCHAR *)&pAdapter->ate.Beacon, 4); + memcpy_exl(pAdapter, &pRaCfg->data[12], (UCHAR *)&pAdapter->ate.OtherCount, 4); + memcpy_exl(pAdapter, &pRaCfg->data[16], (UCHAR *)&pAdapter->ate.TxAc0, 4); + memcpy_exl(pAdapter, &pRaCfg->data[20], (UCHAR *)&pAdapter->ate.TxAc1, 4); + memcpy_exl(pAdapter, &pRaCfg->data[24], (UCHAR *)&pAdapter->ate.TxAc2, 4); + memcpy_exl(pAdapter, &pRaCfg->data[28], (UCHAR *)&pAdapter->ate.TxAc3, 4); + memcpy_exl(pAdapter, &pRaCfg->data[32], (UCHAR *)&pAdapter->ate.TxHCCA, 4); + memcpy_exl(pAdapter, &pRaCfg->data[36], (UCHAR *)&pAdapter->ate.TxMgmt, 4); + memcpy_exl(pAdapter, &pRaCfg->data[40], (UCHAR *)&pAdapter->ate.RSSI0, 4); + memcpy_exl(pAdapter, &pRaCfg->data[44], (UCHAR *)&pAdapter->ate.RSSI1, 4); + memcpy_exl(pAdapter, &pRaCfg->data[48], (UCHAR *)&pAdapter->ate.RSSI2, 4); + memcpy_exl(pAdapter, &pRaCfg->data[52], (UCHAR *)&pAdapter->ate.SNR0, 4); + memcpy_exl(pAdapter, &pRaCfg->data[56], (UCHAR *)&pAdapter->ate.SNR1, 4); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+60, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_CLEAR_COUNTER( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + pAdapter->ate.U2M = 0; + pAdapter->ate.OtherData = 0; + pAdapter->ate.Beacon = 0; + pAdapter->ate.OtherCount = 0; + pAdapter->ate.TxAc0 = 0; + pAdapter->ate.TxAc1 = 0; + pAdapter->ate.TxAc2 = 0; + pAdapter->ate.TxAc3 = 0; + pAdapter->ate.TxHCCA = 0; + pAdapter->ate.TxMgmt = 0; + pAdapter->ate.TxDoneCount = 0; + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_TX_START( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT *p; + USHORT err = 1; + UCHAR Bbp22Value = 0, Bbp24Value = 0; + + if ((pAdapter->ate.TxStatus != 0) && (pAdapter->ate.Mode & ATE_TXFRAME)) + { + ATEDBGPRINT(RT_DEBUG_TRACE,("Ate Tx is already running, to run next Tx, you must stop it first\n")); + err = 2; + goto TX_START_ERROR; + } + else if ((pAdapter->ate.TxStatus != 0) && !(pAdapter->ate.Mode & ATE_TXFRAME)) + { + int i = 0; + + while ((i++ < 10) && (pAdapter->ate.TxStatus != 0)) + { + RTMPusecDelay(5000); + } + + /* force it to stop */ + pAdapter->ate.TxStatus = 0; + pAdapter->ate.TxDoneCount = 0; + pAdapter->ate.bQATxStart = FALSE; + } + + /* + If pRaCfg->length == 0, this "RACFG_CMD_TX_START" + is for Carrier test or Carrier Suppression. + */ + if (ntohs(pRaCfg->length) != 0) + { + /* get frame info */ + + NdisMoveMemory(&pAdapter->ate.TxWI, pRaCfg->data + 2, 16); +#ifdef RT_BIG_ENDIAN + RTMPWIEndianChange((PUCHAR)&pAdapter->ate.TxWI, TYPE_TXWI); +#endif // RT_BIG_ENDIAN // + + NdisMoveMemory(&pAdapter->ate.TxCount, pRaCfg->data + 18, 4); + pAdapter->ate.TxCount = ntohl(pAdapter->ate.TxCount); + + p = (USHORT *)(&pRaCfg->data[22]); + + /* always use QID_AC_BE */ + pAdapter->ate.QID = 0; + + p = (USHORT *)(&pRaCfg->data[24]); + pAdapter->ate.HLen = ntohs(*p); + + if (pAdapter->ate.HLen > 32) + { + ATEDBGPRINT(RT_DEBUG_ERROR,("pAdapter->ate.HLen > 32\n")); + err = 3; + goto TX_START_ERROR; + } + + NdisMoveMemory(&pAdapter->ate.Header, pRaCfg->data + 26, pAdapter->ate.HLen); + + pAdapter->ate.PLen = ntohs(pRaCfg->length) - (pAdapter->ate.HLen + 28); + + if (pAdapter->ate.PLen > 32) + { + ATEDBGPRINT(RT_DEBUG_ERROR,("pAdapter->ate.PLen > 32\n")); + err = 4; + goto TX_START_ERROR; + } + + NdisMoveMemory(&pAdapter->ate.Pattern, pRaCfg->data + 26 + pAdapter->ate.HLen, pAdapter->ate.PLen); + pAdapter->ate.DLen = pAdapter->ate.TxWI.MPDUtotalByteCount - pAdapter->ate.HLen; + + + } + + ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R22, &Bbp22Value); + + switch (Bbp22Value) + { + case BBP22_TXFRAME: + { + if (pAdapter->ate.TxCount == 0) + { +#ifdef RTMP_MAC_PCI + pAdapter->ate.TxCount = 0xFFFFFFFF; +#endif // RTMP_MAC_PCI // + } + ATEDBGPRINT(RT_DEBUG_TRACE,("START TXFRAME\n")); + pAdapter->ate.bQATxStart = TRUE; + Set_ATE_Proc(pAdapter, "TXFRAME"); + } + break; + + case BBP22_TXCONT_OR_CARRSUPP: + { + ATEDBGPRINT(RT_DEBUG_TRACE,("BBP22_TXCONT_OR_CARRSUPP\n")); + ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, BBP_R24, &Bbp24Value); + + switch (Bbp24Value) + { + case BBP24_TXCONT: + { + ATEDBGPRINT(RT_DEBUG_TRACE,("START TXCONT\n")); + pAdapter->ate.bQATxStart = TRUE; + Set_ATE_Proc(pAdapter, "TXCONT"); + } + break; + + case BBP24_CARRSUPP: + { + ATEDBGPRINT(RT_DEBUG_TRACE,("START TXCARRSUPP\n")); + pAdapter->ate.bQATxStart = TRUE; + pAdapter->ate.Mode |= ATE_TXCARRSUPP; + } + break; + + default: + { + ATEDBGPRINT(RT_DEBUG_ERROR,("Unknown TX subtype !")); + } + break; + } + } + break; + + case BBP22_TXCARR: + { + ATEDBGPRINT(RT_DEBUG_TRACE,("START TXCARR\n")); + pAdapter->ate.bQATxStart = TRUE; + Set_ATE_Proc(pAdapter, "TXCARR"); + } + break; + + default: + { + ATEDBGPRINT(RT_DEBUG_ERROR,("Unknown Start TX subtype !")); + } + break; + } + + if (pAdapter->ate.bQATxStart == TRUE) + { + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + return NDIS_STATUS_SUCCESS; + } + +TX_START_ERROR: + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), err); + + return err; +} + + +static inline INT DO_RACFG_CMD_GET_TX_STATUS( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + UINT32 count=0; + + count = htonl(pAdapter->ate.TxDoneCount); + NdisMoveMemory(pRaCfg->data, &count, 4); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+4, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_TX_STOP( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_TX_STOP\n")); + + Set_ATE_Proc(pAdapter, "TXSTOP"); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_RX_START( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_RX_START\n")); + + pAdapter->ate.bQARxStart = TRUE; + Set_ATE_Proc(pAdapter, "RXFRAME"); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_RX_STOP( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_RX_STOP\n")); + + Set_ATE_Proc(pAdapter, "RXSTOP"); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_START_TX_CARRIER( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_START_TX_CARRIER\n")); + + Set_ATE_Proc(pAdapter, "TXCARR"); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_START_TX_CONT( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_START_TX_CONT\n")); + + Set_ATE_Proc(pAdapter, "TXCONT"); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_START_TX_FRAME( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_START_TX_FRAME\n")); + + Set_ATE_Proc(pAdapter, "TXFRAME"); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_BW( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_BW\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + + Set_ATE_TX_BW_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_TX_POWER0( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_TX_POWER0\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_TX_POWER0_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_TX_POWER1( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_TX_POWER1\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_TX_POWER1_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_FREQ_OFFSET( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_FREQ_OFFSET\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_TX_FREQOFFSET_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_GET_STATISTICS( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_GET_STATISTICS\n")); + + memcpy_exl(pAdapter, &pRaCfg->data[0], (UCHAR *)&pAdapter->ate.TxDoneCount, 4); + memcpy_exl(pAdapter, &pRaCfg->data[4], (UCHAR *)&pAdapter->WlanCounters.RetryCount.u.LowPart, 4); + memcpy_exl(pAdapter, &pRaCfg->data[8], (UCHAR *)&pAdapter->WlanCounters.FailedCount.u.LowPart, 4); + memcpy_exl(pAdapter, &pRaCfg->data[12], (UCHAR *)&pAdapter->WlanCounters.RTSSuccessCount.u.LowPart, 4); + memcpy_exl(pAdapter, &pRaCfg->data[16], (UCHAR *)&pAdapter->WlanCounters.RTSFailureCount.u.LowPart, 4); + memcpy_exl(pAdapter, &pRaCfg->data[20], (UCHAR *)&pAdapter->WlanCounters.ReceivedFragmentCount.QuadPart, 4); + memcpy_exl(pAdapter, &pRaCfg->data[24], (UCHAR *)&pAdapter->WlanCounters.FCSErrorCount.u.LowPart, 4); + memcpy_exl(pAdapter, &pRaCfg->data[28], (UCHAR *)&pAdapter->Counters8023.RxNoBuffer, 4); + memcpy_exl(pAdapter, &pRaCfg->data[32], (UCHAR *)&pAdapter->WlanCounters.FrameDuplicateCount.u.LowPart, 4); + memcpy_exl(pAdapter, &pRaCfg->data[36], (UCHAR *)&pAdapter->RalinkCounters.OneSecFalseCCACnt, 4); + + if (pAdapter->ate.RxAntennaSel == 0) + { + INT32 RSSI0 = 0; + INT32 RSSI1 = 0; + INT32 RSSI2 = 0; + + RSSI0 = (INT32)(pAdapter->ate.LastRssi0 - pAdapter->BbpRssiToDbmDelta); + RSSI1 = (INT32)(pAdapter->ate.LastRssi1 - pAdapter->BbpRssiToDbmDelta); + RSSI2 = (INT32)(pAdapter->ate.LastRssi2 - pAdapter->BbpRssiToDbmDelta); + memcpy_exl(pAdapter, &pRaCfg->data[40], (UCHAR *)&RSSI0, 4); + memcpy_exl(pAdapter, &pRaCfg->data[44], (UCHAR *)&RSSI1, 4); + memcpy_exl(pAdapter, &pRaCfg->data[48], (UCHAR *)&RSSI2, 4); + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+52, NDIS_STATUS_SUCCESS); + } + else + { + INT32 RSSI0 = 0; + + RSSI0 = (INT32)(pAdapter->ate.LastRssi0 - pAdapter->BbpRssiToDbmDelta); + memcpy_exl(pAdapter, &pRaCfg->data[40], (UCHAR *)&RSSI0, 4); + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+44, NDIS_STATUS_SUCCESS); + } + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_RESET_COUNTER( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 1; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_RESET_COUNTER\n")); + + sprintf((char *)str, "%d", value); + Set_ResetStatCounter_Proc(pAdapter, str); + + pAdapter->ate.TxDoneCount = 0; + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SEL_TX_ANTENNA( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SEL_TX_ANTENNA\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_TX_Antenna_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SEL_RX_ANTENNA( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SEL_RX_ANTENNA\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_RX_Antenna_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_PREAMBLE( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_PREAMBLE\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_TX_MODE_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_CHANNEL( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_CHANNEL\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_CHANNEL_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_ADDR1( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_ADDR1\n")); + + /* + Addr is an array of UCHAR, + so no need to perform endian swap. + */ + memcpy(pAdapter->ate.Addr1, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_ADDR2( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_ADDR2\n")); + + /* + Addr is an array of UCHAR, + so no need to perform endian swap. + */ + memcpy(pAdapter->ate.Addr2, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_ADDR3( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_ADDR3\n")); + + /* + Addr is an array of UCHAR, + so no need to perform endian swap. + */ + memcpy(pAdapter->ate.Addr3, (PUCHAR)(pRaCfg->data - 2), MAC_ADDR_LEN); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_RATE( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_RATE\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_TX_MCS_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_TX_FRAME_LEN( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + SHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_TX_FRAME_LEN\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + sprintf((char *)str, "%d", value); + Set_ATE_TX_LENGTH_Proc(pAdapter, str); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_SET_TX_FRAME_COUNT( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT value = 0; + STRING str[LEN_OF_ARG]; + + NdisZeroMemory(str, LEN_OF_ARG); + + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_ATE_SET_TX_FRAME_COUNT\n")); + + memcpy((PUCHAR)&value, (PUCHAR)&(pRaCfg->status), 2); + value = ntohs(value); + +#ifdef RTMP_MAC_PCI + /* TX_FRAME_COUNT == 0 means tx infinitely */ + if (value == 0) + { + /* Use TxCount = 0xFFFFFFFF to approximate the infinity. */ + pAdapter->ate.TxCount = 0xFFFFFFFF; + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_COUNT_Proc (TxCount = %d)\n", pAdapter->ate.TxCount)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_COUNT_Proc Success\n")); + + + } + else +#endif // RTMP_MAC_PCI // + { + sprintf((char *)str, "%d", value); + Set_ATE_TX_COUNT_Proc(pAdapter, str); + } + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_START_RX_FRAME( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("RACFG_CMD_RX_START\n")); + + Set_ATE_Proc(pAdapter, "RXFRAME"); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_E2PROM_READ_BULK( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset; + USHORT len; + USHORT buffer[EEPROM_SIZE/2]; + + offset = ntohs(pRaCfg->status); + memcpy(&len, pRaCfg->data, 2); + len = ntohs(len); + + rt_ee_read_all(pAdapter, (USHORT *)buffer); + + if (offset + len <= EEPROM_SIZE) + memcpy_exs(pAdapter, pRaCfg->data, (UCHAR *)buffer+offset, len); + else + ATEDBGPRINT(RT_DEBUG_ERROR, ("exceed EEPROM size\n")); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+len, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_E2PROM_WRITE_BULK( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset; + USHORT len; + USHORT buffer[EEPROM_SIZE/2]; + + offset = ntohs(pRaCfg->status); + memcpy(&len, pRaCfg->data, 2); + len = ntohs(len); + + rt_ee_read_all(pAdapter,(USHORT *)buffer); + memcpy_exs(pAdapter, (UCHAR *)buffer + offset, (UCHAR *)pRaCfg->data + 2, len); + rt_ee_write_all(pAdapter,(USHORT *)buffer); + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_IO_WRITE_BULK( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + UINT32 offset, i, value; + USHORT len; + + memcpy(&offset, &pRaCfg->status, 4); + offset = ntohl(offset); + memcpy(&len, pRaCfg->data+2, 2); + len = ntohs(len); + + for (i = 0; i < len; i += 4) + { + memcpy_exl(pAdapter, (UCHAR *)&value, pRaCfg->data+4+i, 4); + ATEDBGPRINT(RT_DEBUG_TRACE,("Write %x %x\n", offset + i, value)); + RTMP_IO_WRITE32(pAdapter, ((offset+i) & (0xffff)), value); + } + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_BBP_READ_BULK( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset; + USHORT len; + USHORT j; + + offset = ntohs(pRaCfg->status); + memcpy(&len, pRaCfg->data, 2); + len = ntohs(len); + + for (j = offset; j < (offset+len); j++) + { + pRaCfg->data[j - offset] = 0; + + if (pAdapter->ate.Mode == ATE_STOP) + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, j, &pRaCfg->data[j - offset]); + } + else + { + ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, j, &pRaCfg->data[j - offset]); + } + } + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+len, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_BBP_WRITE_BULK( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset; + USHORT len; + USHORT j; + UCHAR *value; + + offset = ntohs(pRaCfg->status); + memcpy(&len, pRaCfg->data, 2); + len = ntohs(len); + + for (j = offset; j < (offset+len); j++) + { + value = pRaCfg->data + 2 + (j - offset); + if (pAdapter->ate.Mode == ATE_STOP) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, j, *value); + } + else + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, j, *value); + } + } + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +#ifdef RTMP_RF_RW_SUPPORT +static inline INT DO_RACFG_CMD_ATE_RF_READ_BULK( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset; + USHORT len; + USHORT j; + + offset = ntohs(pRaCfg->status); + memcpy(&len, pRaCfg->data, 2); + len = ntohs(len); + + for (j = offset; j < (offset+len); j++) + { + pRaCfg->data[j - offset] = 0; + ATE_RF_IO_READ8_BY_REG_ID(pAdapter, j, &pRaCfg->data[j - offset]); + } + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status)+len, NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} + + +static inline INT DO_RACFG_CMD_ATE_RF_WRITE_BULK( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq, + IN struct ate_racfghdr *pRaCfg) +{ + USHORT offset; + USHORT len; + USHORT j; + UCHAR *value; + + offset = ntohs(pRaCfg->status); + memcpy(&len, pRaCfg->data, 2); + len = ntohs(len); + + for (j = offset; j < (offset+len); j++) + { + value = pRaCfg->data + 2 + (j - offset); + ATE_RF_IO_WRITE8_BY_REG_ID(pAdapter, j, *value); + } + + ResponseToGUI(pRaCfg, wrq, sizeof(pRaCfg->status), NDIS_STATUS_SUCCESS); + + return NDIS_STATUS_SUCCESS; +} +#endif // RTMP_RF_RW_SUPPORT // +#endif // RALINK_28xx_QA // + + +#ifdef RTMP_MAC_PCI +static INT TxDmaBusy( + IN PRTMP_ADAPTER pAd) +{ + INT result; + WPDMA_GLO_CFG_STRUC GloCfg; + + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); // disable DMA + if (GloCfg.field.TxDMABusy) + result = 1; + else + result = 0; + + return result; +} + + +static INT RxDmaBusy( + IN PRTMP_ADAPTER pAd) +{ + INT result; + WPDMA_GLO_CFG_STRUC GloCfg; + + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); // disable DMA + if (GloCfg.field.RxDMABusy) + result = 1; + else + result = 0; + + return result; +} + + +static VOID RtmpDmaEnable( + IN PRTMP_ADAPTER pAd, + IN INT Enable) +{ + BOOLEAN value; + ULONG WaitCnt; + WPDMA_GLO_CFG_STRUC GloCfg; + + value = Enable > 0 ? 1 : 0; + + // check DMA is in busy mode. + WaitCnt = 0; + + while (TxDmaBusy(pAd) || RxDmaBusy(pAd)) + { + RTMPusecDelay(10); + if (WaitCnt++ > 100) + break; + } + + RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word); // disable DMA + GloCfg.field.EnableTxDMA = value; + GloCfg.field.EnableRxDMA = value; + RTMP_IO_WRITE32(pAd, WPDMA_GLO_CFG, GloCfg.word); // abort all TX rings + RTMPusecDelay(5000); + + return; +} +#endif // RTMP_MAC_PCI // + + + + +static VOID BbpSoftReset( + IN PRTMP_ADAPTER pAd) +{ + UCHAR BbpData = 0; + + // Soft reset, set BBP R21 bit0=1->0 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R21, &BbpData); + BbpData |= 0x00000001; //set bit0=1 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BbpData); + + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R21, &BbpData); + BbpData &= ~(0x00000001); //set bit0=0 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R21, BbpData); + + return; +} + + +static VOID RtmpRfIoWrite( + IN PRTMP_ADAPTER pAd) +{ + // Set RF value 1's set R3[bit2] = [0] + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2); + RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04))); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4); + + RTMPusecDelay(200); + + // Set RF value 2's set R3[bit2] = [1] + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2); + RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 | 0x04)); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4); + + RTMPusecDelay(200); + + // Set RF value 3's set R3[bit2] = [0] + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R1); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R2); + RTMP_RF_IO_WRITE32(pAd, (pAd->LatchRfRegs.R3 & (~0x04))); + RTMP_RF_IO_WRITE32(pAd, pAd->LatchRfRegs.R4); + + return; +} + + +#ifdef RT30xx +static int CheckMCSValid( + UCHAR Mode, + UCHAR Mcs, + BOOLEAN bRT2070) +#endif // RT30xx // +#ifndef RT30xx +static int CheckMCSValid( + IN UCHAR Mode, + IN UCHAR Mcs) +#endif // RT30xx // +{ + int i; + PCHAR pRateTab; + + switch (Mode) + { + case 0: + pRateTab = CCKRateTable; + break; + case 1: + pRateTab = OFDMRateTable; + break; + case 2: + case 3: +#ifdef RT30xx + if (bRT2070) + pRateTab = OFDMRateTable; + else +#endif // RT30xx // + pRateTab = HTMIXRateTable; + break; + default: + ATEDBGPRINT(RT_DEBUG_ERROR, ("unrecognizable Tx Mode %d\n", Mode)); + return -1; + break; + } + + i = 0; + while (pRateTab[i] != -1) + { + if (pRateTab[i] == Mcs) + return 0; + i++; + } + + return -1; +} + + +static INT ATETxPwrHandler( + IN PRTMP_ADAPTER pAd, + IN char index) +{ + ULONG R; + CHAR TxPower = 0; + UCHAR Bbp94 = 0; + BOOLEAN bPowerReduce = FALSE; +#ifdef RTMP_RF_RW_SUPPORT + UCHAR RFValue = 0; +#endif // RTMP_RF_RW_SUPPORT // + +#ifdef RALINK_28xx_QA + if ((pAd->ate.bQATxStart == TRUE) || (pAd->ate.bQARxStart == TRUE)) + { + /* + When QA is used for Tx, pAd->ate.TxPower0/1 and real tx power + are not synchronized. + */ + return 0; + } + else +#endif // RALINK_28xx_QA // + + if (index == 0) + { + TxPower = pAd->ate.TxPower0; + } + else if (index == 1) + { + TxPower = pAd->ate.TxPower1; + } + else + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Only TxPower0 and TxPower1 are adjustable !\n")); + ATEDBGPRINT(RT_DEBUG_ERROR, ("TxPower%d is out of range !\n", index)); + } + +#ifdef RTMP_RF_RW_SUPPORT + if (IS_RT30xx(pAd)) + { + // Set Tx Power + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R12, (PUCHAR)&RFValue); + RFValue = (RFValue & 0xE0) | TxPower; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R12, (UCHAR)RFValue); + ATEDBGPRINT(RT_DEBUG_TRACE, ("3070 or 2070:%s (TxPower=%d, RFValue=%x)\n", __FUNCTION__, TxPower, RFValue)); + } + else +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + if (index == 0) + { + // Set Tx0 Power + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R12, (PUCHAR)&RFValue); + + if (pAd->ate.Channel <= 14) + RFValue = 0x60 | TxPower; + else + RFValue = 0xE0 | (TxPower & 0x3) | ((TxPower & 0xC) << 1); + + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R12, (UCHAR)RFValue); + } + else if (index == 1) + { + // Set Tx1 Power + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R13, (PUCHAR)&RFValue); + + if (pAd->ate.Channel <= 14) + RFValue = 0x60 | TxPower; + else + RFValue = 0xE0 | (TxPower & 0x3) | ((TxPower & 0xC) << 1); + + + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R13, (UCHAR)RFValue); + } + else + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Only TxPower0 and TxPower1 are adjustable !\n")); + ATEDBGPRINT(RT_DEBUG_ERROR, ("TxPower%d is out of range !\n", index)); + } + } + else +#endif // RT35xx // +#endif // RTMP_RF_RW_SUPPORT // + { + if (pAd->ate.Channel <= 14) + { + if (TxPower > 31) + { + // R3, R4 can't large than 31 (0x24), 31 ~ 36 used by BBP 94 + R = 31; + if (TxPower <= 36) + Bbp94 = BBPR94_DEFAULT + (UCHAR)(TxPower - 31); + } + else if (TxPower < 0) + { + // R3, R4 can't less than 0, -1 ~ -6 used by BBP 94 + R = 0; + if (TxPower >= -6) + Bbp94 = BBPR94_DEFAULT + TxPower; + } + else + { + // 0 ~ 31 + R = (ULONG) TxPower; + Bbp94 = BBPR94_DEFAULT; + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R=%ld, BBP_R94=%d)\n", __FUNCTION__, TxPower, R, Bbp94)); + } + else /* 5.5 GHz */ + { + if (TxPower > 15) + { + // R3, R4 can't large than 15 (0x0F) + R = 15; + } + else if (TxPower < 0) + { + // R3, R4 can't less than 0 + // -1 ~ -7 + ASSERT((TxPower >= -7)); + R = (ULONG)(TxPower + 7); + bPowerReduce = TRUE; + } + else + { + // 0 ~ 15 + R = (ULONG) TxPower; + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("%s (TxPower=%d, R=%lu)\n", __FUNCTION__, TxPower, R)); + } + + if (pAd->ate.Channel <= 14) + { + if (index == 0) + { + // shift TX power control to correct RF(R3) register bit position + R = R << 9; + R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff); + pAd->LatchRfRegs.R3 = R; + } + else + { + // shift TX power control to correct RF(R4) register bit position + R = R << 6; + R |= (pAd->LatchRfRegs.R4 & 0xfffff83f); + pAd->LatchRfRegs.R4 = R; + } + } + else /* 5.5GHz */ + { + if (bPowerReduce == FALSE) + { + if (index == 0) + { + // shift TX power control to correct RF(R3) register bit position + R = (R << 10) | (1 << 9); + R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff); + pAd->LatchRfRegs.R3 = R; + } + else + { + // shift TX power control to correct RF(R4) register bit position + R = (R << 7) | (1 << 6); + R |= (pAd->LatchRfRegs.R4 & 0xfffff83f); + pAd->LatchRfRegs.R4 = R; + } + } + else + { + if (index == 0) + { + // shift TX power control to correct RF(R3) register bit position + R = (R << 10); + R |= (pAd->LatchRfRegs.R3 & 0xffffc1ff); + + /* Clear bit 9 of R3 to reduce 7dB. */ + pAd->LatchRfRegs.R3 = (R & (~(1 << 9))); + } + else + { + // shift TX power control to correct RF(R4) register bit position + R = (R << 7); + R |= (pAd->LatchRfRegs.R4 & 0xfffff83f); + + /* Clear bit 6 of R4 to reduce 7dB. */ + pAd->LatchRfRegs.R4 = (R & (~(1 << 6))); + } + } + } + RtmpRfIoWrite(pAd); + } + + return 0; +} + + +static NDIS_STATUS ATESTART( + IN PRTMP_ADAPTER pAd) +{ + UINT32 MacData=0, atemode=0, temp=0; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; +#ifdef RTMP_MAC_PCI + UINT32 ring_index=0; + PTXD_STRUC pTxD = NULL; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD = NULL; + TXD_STRUC TxD; +#endif // RT_BIG_ENDIAN // +#endif // RTMP_MAC_PCI // +#if defined(RT30xx) || defined(RT2883) + UINT32 bbp_index=0; + UCHAR RestoreRfICType=pAd->RfIcType; +#endif // RT30xx || RT2883 // + UCHAR BbpData = 0; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ===> %s\n", __FUNCTION__)); + +#if defined(LINUX) || defined(VXWORKS) +#ifdef RTMP_MAC_PCI + /* check if we have removed the firmware */ + if (!(ATE_ON(pAd))) + { + NICEraseFirmware(pAd); + } +#endif // RTMP_MAC_PCI // +#endif // defined(LINUX) || defined(VXWORKS) // + + atemode = pAd->ate.Mode; + pAd->ate.Mode = ATE_START; + + /* Disable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Disable auto responder */ + RTMP_IO_READ32(pAd, AUTO_RSP_CFG, &temp); + temp = temp & 0xFFFFFFFE; + RTMP_IO_WRITE32(pAd, AUTO_RSP_CFG, temp); + + /* clean bit4 to stop continuous Tx production test */ + /* Disable or cancel pending irp first ??? */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= 0xFFFFFFEF; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + if (atemode == ATE_TXCARR) + { + /* RT35xx ATE will reuse this code segment. */ +#ifdef RT30xx + /* Hardware Reset BBP */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); + temp = temp | 0x00000002; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); + temp = temp & ~(0x00000002); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); + + /* Restore All BBP Value */ + for (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++) + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd,bbp_index,restore_BBP[bbp_index]); +#ifdef RT35xx + if (IS_RT3572(pAd)) + ASSERT(RestoreRfICType != 0); +#endif // RT35xx // + + /* + The RfIcType will be reset to zero after the hardware reset bbp command. + Therefore, we must restore the original RfIcType. + */ + pAd->RfIcType=RestoreRfICType; +#endif // RT30xx // + + /* No Carrier Test set BBP R22 bit7=0, bit6=0, bit[5~0]=0x0 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData &= 0xFFFFFF00; // clear bit7, bit6, bit[5~0] + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + } + else if (atemode == ATE_TXCARRSUPP) + { + /* RT35xx ATE will reuse this code segment. */ +#ifdef RT30xx + /* Hardware Reset BBP */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); + temp = temp | 0x00000002; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); + temp = temp & ~(0x00000002); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); + + /* Restore All BBP Value */ + for (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++) + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd,bbp_index,restore_BBP[bbp_index]); + +#ifdef RT35xx + if (IS_RT3572(pAd)) + ASSERT(RestoreRfICType != 0); +#endif // RT35xx // + + /* + The RfIcType will be reset to zero after the hardware reset bbp command. + Therefore, we must restore the original RfIcType. + */ + pAd->RfIcType=RestoreRfICType; +#endif // RT30xx // + + /* No Cont. TX set BBP R22 bit7=0 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData &= ~(1 << 7); // set bit7=0 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + + /* No Carrier Suppression set BBP R24 bit0=0 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R24, &BbpData); + BbpData &= 0xFFFFFFFE; // clear bit0 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, BbpData); + } + + /* + We should free some resource which was allocated + when ATE_TXFRAME , ATE_STOP, and ATE_TXCONT. + */ + else if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP)) + { +#ifdef RTMP_MAC_PCI + PRTMP_TX_RING pTxRing = &pAd->TxRing[QID_AC_BE]; +#endif // RTMP_MAC_PCI // + if ((atemode == ATE_TXCONT) || (atemode == ATE_TXFRAME)) + { +#if defined(RT30xx) || defined(RT2883) + + /* Hardware Reset BBP */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); + temp = temp | 0x00000002; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &temp); + temp = temp & ~(0x00000002); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, temp); + + /* Restore All BBP Value */ + for (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++) + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd,bbp_index,restore_BBP[bbp_index]); +#ifdef RT35xx + if (IS_RT3572(pAd)) + ASSERT(RestoreRfICType != 0); +#endif // RT35xx // + + /* + The RfIcType will be reset to zero after the hardware reset bbp command. + Therefore, we must restore the original RfIcType. + */ + pAd->RfIcType=RestoreRfICType; +#endif // RT30xx || RT2883 // + + /* Not Cont. TX anymore, so set BBP R22 bit7=0 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData &= ~(1 << 7); // set bit7=0 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + } + + /* Abort Tx, Rx DMA. */ + RtmpDmaEnable(pAd, 0); +#ifdef RTMP_MAC_PCI + for (ring_index=0; ring_index<TX_RING_SIZE; ring_index++) + { + PNDIS_PACKET pPacket; + +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC)pAd->TxRing[QID_AC_BE].Cell[ring_index].AllocVa; +#else + pDestTxD = (PTXD_STRUC)pAd->TxRing[QID_AC_BE].Cell[ring_index].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif // !RT_BIG_ENDIAN // + pTxD->DMADONE = 0; + pPacket = pTxRing->Cell[ring_index].pNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNdisPacket as NULL after clear */ + pTxRing->Cell[ring_index].pNdisPacket = NULL; + + pPacket = pTxRing->Cell[ring_index].pNextNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNextNdisPacket as NULL after clear */ + pTxRing->Cell[ring_index].pNextNdisPacket = NULL; +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + } +#endif // RTMP_MAC_PCI // + + /* Start Tx, RX DMA */ + RtmpDmaEnable(pAd, 1); + } + + + /* reset Rx statistics. */ + pAd->ate.LastSNR0 = 0; + pAd->ate.LastSNR1 = 0; + pAd->ate.LastRssi0 = 0; + pAd->ate.LastRssi1 = 0; + pAd->ate.LastRssi2 = 0; + pAd->ate.AvgRssi0 = 0; + pAd->ate.AvgRssi1 = 0; + pAd->ate.AvgRssi2 = 0; + pAd->ate.AvgRssi0X8 = 0; + pAd->ate.AvgRssi1X8 = 0; + pAd->ate.AvgRssi2X8 = 0; + pAd->ate.NumOfAvgRssiSample = 0; + +#ifdef RALINK_28xx_QA + /* Tx frame */ + pAd->ate.bQATxStart = FALSE; + pAd->ate.bQARxStart = FALSE; + pAd->ate.seq = 0; + + /* counters */ + pAd->ate.U2M = 0; + pAd->ate.OtherData = 0; + pAd->ate.Beacon = 0; + pAd->ate.OtherCount = 0; + pAd->ate.TxAc0 = 0; + pAd->ate.TxAc1 = 0; + pAd->ate.TxAc2 = 0; + pAd->ate.TxAc3 = 0; + pAd->ate.TxHCCA = 0; + pAd->ate.TxMgmt = 0; + pAd->ate.RSSI0 = 0; + pAd->ate.RSSI1 = 0; + pAd->ate.RSSI2 = 0; + pAd->ate.SNR0 = 0; + pAd->ate.SNR1 = 0; + + /* control */ + pAd->ate.TxDoneCount = 0; + // TxStatus : 0 --> task is idle, 1 --> task is running + pAd->ate.TxStatus = 0; +#endif // RALINK_28xx_QA // + + // Soft reset BBP. + BbpSoftReset(pAd); + + +#ifdef CONFIG_STA_SUPPORT + /* LinkDown() has "AsicDisableSync();" and "RTMP_BBP_IO_R/W8_BY_REG_ID();" inside. */ +// LinkDown(pAd, FALSE); +// AsicEnableBssSync(pAd); + AsicDisableSync(pAd); +#ifdef RTMP_MAC_PCI +#if defined(LINUX) || defined(VXWORKS) + RTMP_OS_NETDEV_STOP_QUEUE(pAd->net_dev); +#endif // defined(LINUX) || defined(VXWORKS) // +#endif // RTMP_MAC_PCI // + /* + If we skip "LinkDown()", we should disable protection + to prevent from sending out RTS or CTS-to-self. + */ + ATEDisableAsicProtect(pAd); + RTMPStationStop(pAd); +#endif // CONFIG_STA_SUPPORT // + +#ifdef RTMP_MAC_PCI + /* Disable Tx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 2); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Disable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + +#endif // RTMP_MAC_PCI // + + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : <=== %s\n", __FUNCTION__)); + return Status; +} + + +static NDIS_STATUS ATESTOP( + IN PRTMP_ADAPTER pAd) +{ + UINT32 MacData=0, ring_index=0; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; +#ifdef RTMP_MAC_PCI + PRXD_STRUC pRxD = NULL; +#endif // RTMP_MAC_PCI // +#ifdef RT35xx + UINT32 bbp_index=0; + UCHAR RestoreRfICType=pAd->RfIcType; +#endif // RT35xx // + UCHAR BbpData = 0; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ===> %s\n", __FUNCTION__)); + +#ifdef RT35xx// todo + /* hardware reset BBP */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData = MacData | 0x00000002; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + RTMPusecDelay(10000); + + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData = MacData & ~(0x00000002); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Supposed that we have had a record in restore_BBP[] */ + /* restore all BBP value */ + for (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++) + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd,bbp_index,restore_BBP[bbp_index]); + + /* + The RfIcType will be reset to zero after the hardware reset bbp command. + Therefore, we must restore the original RfIcType. + */ + ASSERT(RestoreRfICType != 0); + pAd->RfIcType=RestoreRfICType; +#endif // RT35xx // + /* + Abort Tx, RX DMA. + Q : How to do the following I/O if Tx, Rx DMA is aborted ? + Ans : Bulk endpoints are aborted, while the control endpoint is not. + */ + + /* Default value in BBP R22 is 0x0. */ + BbpData = 0; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + + /* Clean bit4 to stop continuous Tx production test. */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= 0xFFFFFFEF; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Disable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Abort Tx, RX DMA */ + RtmpDmaEnable(pAd, 0); + + /* Disable Tx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 2); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + +#ifdef RTMP_MAC_PCI +#if defined(LINUX) || defined(VXWORKS) + pAd->ate.bFWLoading = TRUE; + + Status = NICLoadFirmware(pAd); + + if (Status != NDIS_STATUS_SUCCESS) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("NICLoadFirmware failed, Status[=0x%08x]\n", Status)); + return Status; + } +#endif // defined(LINUX) || defined(VXWORKS) // + pAd->ate.Mode = ATE_STOP; + + /* + Even the firmware has been loaded, + we still could use ATE_BBP_IO_READ8_BY_REG_ID(). + But this is not suggested. + */ + BbpSoftReset(pAd); + + RTMP_ASIC_INTERRUPT_DISABLE(pAd); + + NICInitializeAdapter(pAd, TRUE); + + /* + Reinitialize Rx Ring before Rx DMA is enabled. + >>>RxCoherent<<< was gone ! + */ + for (ring_index = 0; ring_index < RX_RING_SIZE; ring_index++) + { + pRxD = (PRXD_STRUC) pAd->RxRing.Cell[ring_index].AllocVa; + pRxD->DDONE = 0; + } + + /* We should read EEPROM for all cases. */ + NICReadEEPROMParameters(pAd, NULL); + NICInitAsicFromEEPROM(pAd); + + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + + /* empty function */ + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + + /* clear garbage interrupts */ + RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff); + /* Enable Interrupt */ + RTMP_ASIC_INTERRUPT_ENABLE(pAd); +#endif // RTMP_MAC_PCI // + + + /* restore RX_FILTR_CFG */ + +#ifdef CONFIG_STA_SUPPORT + /* restore RX_FILTR_CFG due to that QA maybe set it to 0x3 */ + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL); +#endif // CONFIG_STA_SUPPORT // + + /* Enable Tx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData |= (1 << 2); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* move to above */ + + /* Enable Tx, Rx DMA. */ + RtmpDmaEnable(pAd, 1); + + /* Enable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData |= (1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + +#ifdef RTMP_MAC_PCI + +#ifdef CONFIG_STA_SUPPORT + RTMPStationStart(pAd); +#endif // CONFIG_STA_SUPPORT // +#endif // RTMP_MAC_PCI + + +#if defined(LINUX) || defined(VXWORKS) + RTMP_OS_NETDEV_START_QUEUE(pAd->net_dev); +#endif // defined(LINUX) || defined(VXWORKS) // + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : <=== %s\n", __FUNCTION__)); + return Status; +} + + +static NDIS_STATUS TXCARR( + IN PRTMP_ADAPTER pAd) +{ + UINT32 MacData=0; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; +#ifdef RT30xx + UINT32 bbp_index=0; +#endif // RT30xx // + UCHAR BbpData = 0; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ===> %s\n", __FUNCTION__)); + + pAd->ate.Mode = ATE_TXCARR; + + /* RT35xx ATE will reuse this code segment. */ +#ifdef RT30xx + for (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++) + restore_BBP[bbp_index]=0; + /* Record All BBP Value */ + for (bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++) + ATE_BBP_IO_READ8_BY_REG_ID(pAd,bbp_index,&restore_BBP[bbp_index]); +#endif // RT30xx // + + + /* QA has done the following steps if it is used. */ + if (pAd->ate.bQATxStart == FALSE) + { + /* Soft reset BBP. */ + BbpSoftReset(pAd); + + /* Carrier Test set BBP R22 bit7=1, bit6=1, bit[5~0]=0x01 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData &= 0xFFFFFF00; // clear bit7, bit6, bit[5~0] + BbpData |= 0x000000C1; // set bit7=1, bit6=1, bit[5~0]=0x01 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + + /* set MAC_SYS_CTRL(0x1004) Continuous Tx Production Test (bit4) = 1 */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData = MacData | 0x00000010; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : <=== %s\n", __FUNCTION__)); + return Status; +} + + +static NDIS_STATUS TXCONT( + IN PRTMP_ADAPTER pAd) +{ + UINT32 MacData=0; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; +#ifdef RTMP_MAC_PCI + UINT32 ring_index=0; + PTXD_STRUC pTxD = NULL; + PRTMP_TX_RING pTxRing = &pAd->TxRing[QID_AC_BE]; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD = NULL; + TXD_STRUC TxD; +#endif // RT_BIG_ENDIAN // +#endif // RTMP_MAC_PCI // +#ifdef RT30xx + UINT32 bbp_index=0; +#endif // RT30xx // + UCHAR BbpData = 0; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ===> %s\n", __FUNCTION__)); + + if (pAd->ate.bQATxStart == TRUE) + { + /* + set MAC_SYS_CTRL(0x1004) bit4(Continuous Tx Production Test) + and bit2(MAC TX enable) back to zero. + */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= 0xFFFFFFEB; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* set BBP R22 bit7=0 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData &= 0xFFFFFF7F; // set bit7=0 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + } + + /* RT35xx ATE will reuse this code segment. */ +#ifdef RT30xx + for(bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++) + restore_BBP[bbp_index]=0; + /* Record All BBP Value */ + for(bbp_index=0;bbp_index<ATE_BBP_REG_NUM;bbp_index++) + ATE_BBP_IO_READ8_BY_REG_ID(pAd,bbp_index,&restore_BBP[bbp_index]); +#endif // RT30xx // + + + /* + for TxCont mode. + Step 1: Send 50 packets first then wait for a moment. + Step 2: Send more 50 packet then start continue mode. + */ + + + /* Step 1: send 50 packets first. */ + pAd->ate.Mode = ATE_TXCONT; + pAd->ate.TxCount = 50; + + + /* Soft reset BBP. */ + BbpSoftReset(pAd); + + /* Abort Tx, RX DMA. */ + RtmpDmaEnable(pAd, 0); + +#ifdef RTMP_MAC_PCI + /* Fix can't smooth kick */ + { + RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * 0x10, &pTxRing->TxDmaIdx); + pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx; + pTxRing->TxCpuIdx = pTxRing->TxDmaIdx; + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * 0x10, pTxRing->TxCpuIdx); + } +#endif // RTMP_MAC_PCI // + + /* Do it after Tx/Rx DMA is aborted. */ + pAd->ate.TxDoneCount = 0; + + /* Only needed if we have to send some normal frames. */ + SetJapanFilter(pAd); + +#ifdef RTMP_MAC_PCI + for (ring_index = 0; (ring_index < TX_RING_SIZE-1) && (ring_index < pAd->ate.TxCount); ring_index++) + { + PNDIS_PACKET pPacket; + UINT32 TxIdx = pTxRing->TxCpuIdx; + +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif // !RT_BIG_ENDIAN // + + /* Clean current cell. */ + pPacket = pTxRing->Cell[TxIdx].pNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNdisPacket as NULL after clear */ + pTxRing->Cell[TxIdx].pNdisPacket = NULL; + + pPacket = pTxRing->Cell[TxIdx].pNextNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNextNdisPacket as NULL after clear */ + pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + + if (ATESetUpFrame(pAd, TxIdx) != 0) + return NDIS_STATUS_FAILURE; + + INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE); + } + + ATESetUpFrame(pAd, pTxRing->TxCpuIdx); +#endif // RTMP_MAC_PCI // + + + /* Enable Tx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData |= (1 << 2); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Disable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Start Tx, RX DMA. */ + RtmpDmaEnable(pAd, 1); + + +#ifdef RALINK_28xx_QA + if (pAd->ate.bQATxStart == TRUE) + { + pAd->ate.TxStatus = 1; + } +#endif // RALINK_28xx_QA // + +#ifdef RTMP_MAC_PCI + /* kick Tx Ring */ + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * RINGREG_DIFF, pAd->TxRing[QID_AC_BE].TxCpuIdx); + + RTMPusecDelay(5000); +#endif // RTMP_MAC_PCI // + + + /* Step 2: send more 50 packets then start continue mode. */ + /* Abort Tx, RX DMA. */ + RtmpDmaEnable(pAd, 0); + + /* Cont. TX set BBP R22 bit7=1 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData |= 0x00000080; // set bit7=1 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + + pAd->ate.TxCount = 50; +#ifdef RTMP_MAC_PCI + /* Fix can't smooth kick */ + { + RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * 0x10, &pTxRing->TxDmaIdx); + pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx; + pTxRing->TxCpuIdx = pTxRing->TxDmaIdx; + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * 0x10, pTxRing->TxCpuIdx); + } +#endif // RTMP_MAC_PCI // + + pAd->ate.TxDoneCount = 0; + SetJapanFilter(pAd); + +#ifdef RTMP_MAC_PCI + for (ring_index = 0; (ring_index < TX_RING_SIZE-1) && (ring_index < pAd->ate.TxCount); ring_index++) + { + PNDIS_PACKET pPacket; + UINT32 TxIdx = pTxRing->TxCpuIdx; + +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif // !RT_BIG_ENDIAN // + /* clean current cell */ + pPacket = pTxRing->Cell[TxIdx].pNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNdisPacket as NULL after clear. */ + pTxRing->Cell[TxIdx].pNdisPacket = NULL; + + pPacket = pTxRing->Cell[TxIdx].pNextNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNextNdisPacket as NULL after clear. */ + pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + + if (ATESetUpFrame(pAd, TxIdx) != 0) + return NDIS_STATUS_FAILURE; + + INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE); + } + + ATESetUpFrame(pAd, pTxRing->TxCpuIdx); +#endif // RTMP_MAC_PCI // + + + /* Enable Tx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData |= (1 << 2); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Disable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Start Tx, Rx DMA. */ + RtmpDmaEnable(pAd, 1); + +#ifdef RALINK_28xx_QA + if (pAd->ate.bQATxStart == TRUE) + { + pAd->ate.TxStatus = 1; + } +#endif // RALINK_28xx_QA // + +#ifdef RTMP_MAC_PCI + /* kick Tx Ring */ + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * RINGREG_DIFF, pAd->TxRing[QID_AC_BE].TxCpuIdx); +#endif // RTMP_MAC_PCI // + + RTMPusecDelay(500); + + /* enable continuous tx production test */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData |= 0x00000010; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : <=== %s\n", __FUNCTION__)); + return Status; +} + + +static NDIS_STATUS TXFRAME( + IN PRTMP_ADAPTER pAd) +{ + UINT32 MacData=0; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; +#ifdef RTMP_MAC_PCI + UINT32 ring_index=0; + PRTMP_TX_RING pTxRing = &pAd->TxRing[QID_AC_BE]; + PTXD_STRUC pTxD = NULL; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD = NULL; + TXD_STRUC TxD; +#endif // RT_BIG_ENDIAN // +#endif // RTMP_MAC_PCI // + UCHAR BbpData = 0; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ===> %s(Count=%d)\n", __FUNCTION__, pAd->ate.TxCount)); + pAd->ate.Mode |= ATE_TXFRAME; + +#ifdef RTMP_MAC_PCI + /* Default value in BBP R22 is 0x0. */ + BbpData = 0; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + + /* Soft reset BBP. */ + BbpSoftReset(pAd); + + /* clean bit4 to stop continuous Tx production test */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= 0xFFFFFFEF; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Abort Tx, RX DMA. */ + RtmpDmaEnable(pAd, 0); + + /* Fix can't smooth kick */ + { + RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * RINGREG_DIFF, &pTxRing->TxDmaIdx); + pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx; + pTxRing->TxCpuIdx = pTxRing->TxDmaIdx; + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * RINGREG_DIFF, pTxRing->TxCpuIdx); + } + + pAd->ate.TxDoneCount = 0; + + SetJapanFilter(pAd); + + for (ring_index = 0; (ring_index < TX_RING_SIZE-1) && (ring_index < pAd->ate.TxCount); ring_index++) + { + PNDIS_PACKET pPacket; + UINT32 TxIdx = pTxRing->TxCpuIdx; + +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif // !RT_BIG_ENDIAN // + /* Clean current cell. */ + pPacket = pTxRing->Cell[TxIdx].pNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNdisPacket as NULL after clear */ + pTxRing->Cell[TxIdx].pNdisPacket = NULL; + + pPacket = pTxRing->Cell[TxIdx].pNextNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNextNdisPacket as NULL after clear */ + pTxRing->Cell[TxIdx].pNextNdisPacket = NULL; + +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + + if (ATESetUpFrame(pAd, TxIdx) != 0) + return NDIS_STATUS_FAILURE; + + INC_RING_INDEX(pTxRing->TxCpuIdx, TX_RING_SIZE); + + } + + ATESetUpFrame(pAd, pTxRing->TxCpuIdx); + + /* Start Tx, Rx DMA. */ + RtmpDmaEnable(pAd, 1); + + /* Enable Tx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData |= (1 << 2); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); +#endif // RTMP_MAC_PCI // + + +#ifdef RALINK_28xx_QA + /* add this for LoopBack mode */ + if (pAd->ate.bQARxStart == FALSE) + { + /* Disable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + } + + if (pAd->ate.bQATxStart == TRUE) + { + pAd->ate.TxStatus = 1; + } +#else + /* Disable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); +#endif // RALINK_28xx_QA // + +#ifdef RTMP_MAC_PCI + RTMP_IO_READ32(pAd, TX_DTX_IDX0 + QID_AC_BE * RINGREG_DIFF, &pAd->TxRing[QID_AC_BE].TxDmaIdx); + /* kick Tx Ring */ + RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + QID_AC_BE * RINGREG_DIFF, pAd->TxRing[QID_AC_BE].TxCpuIdx); + + pAd->RalinkCounters.KickTxCount++; +#endif // RTMP_MAC_PCI // + + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : <=== %s\n", __FUNCTION__)); + return Status; +} + + +static NDIS_STATUS RXFRAME( + IN PRTMP_ADAPTER pAd) +{ + UINT32 MacData=0; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + UCHAR BbpData = 0; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ===> %s\n", __FUNCTION__)); + + /* Disable Rx of MAC block */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + /* Default value in BBP R22 is 0x0. */ + BbpData = 0; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + + /* Clean bit4 to stop continuous Tx production test. */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= 0xFFFFFFEF; + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + pAd->ate.Mode |= ATE_RXFRAME; + + + /* Disable Tx of MAC block. */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 2); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + + /* Enable Rx of MAC block. */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData |= (1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : <=== %s\n", __FUNCTION__)); + return Status; +} + + +#ifdef RALINK_28xx_QA +static NDIS_STATUS TXSTOP( + IN PRTMP_ADAPTER pAd) +{ + UINT32 MacData=0, atemode=0; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; +#ifdef RTMP_MAC_PCI + UINT32 ring_index=0; + PTXD_STRUC pTxD = NULL; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD = NULL; + TXD_STRUC TxD; +#endif // RT_BIG_ENDIAN // +#endif // RTMP_MAC_PCI // + UCHAR BbpData = 0; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ===> %s\n", __FUNCTION__)); + + atemode = pAd->ate.Mode; + pAd->ate.Mode &= ATE_TXSTOP; + pAd->ate.bQATxStart = FALSE; + + if (atemode == ATE_TXCARR) + { + /* No Carrier Test set BBP R22 bit7=0, bit6=0, bit[5~0]=0x0 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData &= 0xFFFFFF00; // clear bit7, bit6, bit[5~0] + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + } + else if (atemode == ATE_TXCARRSUPP) + { + /* No Cont. TX set BBP R22 bit7=0 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData &= ~(1 << 7); // set bit7=0 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + + /* No Carrier Suppression set BBP R24 bit0=0 */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R24, &BbpData); + BbpData &= 0xFFFFFFFE; // clear bit0 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, BbpData); + } + + /* + We should free some resource which was allocated + when ATE_TXFRAME, ATE_STOP, and ATE_TXCONT. + */ + else if ((atemode & ATE_TXFRAME) || (atemode == ATE_STOP)) +#ifdef RTMP_MAC_PCI + { + PRTMP_TX_RING pTxRing = &pAd->TxRing[QID_AC_BE]; + + if (atemode == ATE_TXCONT) + { + // No Cont. TX set BBP R22 bit7=0 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R22, &BbpData); + BbpData &= ~(1 << 7); //set bit7=0 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R22, BbpData); + } + + /* Abort Tx, Rx DMA. */ + RtmpDmaEnable(pAd, 0); + + for (ring_index=0; ring_index<TX_RING_SIZE; ring_index++) + { + PNDIS_PACKET pPacket; + +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC)pAd->TxRing[QID_AC_BE].Cell[ring_index].AllocVa; +#else + pDestTxD = (PTXD_STRUC)pAd->TxRing[QID_AC_BE].Cell[ring_index].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); +#endif // !RT_BIG_ENDIAN // + pTxD->DMADONE = 0; + pPacket = pTxRing->Cell[ring_index].pNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNdisPacket as NULL after clear */ + pTxRing->Cell[ring_index].pNdisPacket = NULL; + + pPacket = pTxRing->Cell[ring_index].pNextNdisPacket; + + if (pPacket) + { + PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); + } + + /* Always assign pNextNdisPacket as NULL after clear */ + pTxRing->Cell[ring_index].pNextNdisPacket = NULL; +#ifdef RT_BIG_ENDIAN + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + } + /* Enable Tx, Rx DMA */ + RtmpDmaEnable(pAd, 1); + } +#endif // RTMP_MAC_PCI // + + + /* task Tx status : 0 --> task is idle, 1 --> task is running */ + pAd->ate.TxStatus = 0; + + /* Soft reset BBP. */ + BbpSoftReset(pAd); + + /* Disable Tx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 2); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : <=== %s\n", __FUNCTION__)); + return Status; +} + + +static NDIS_STATUS RXSTOP( + IN PRTMP_ADAPTER pAd) +{ + UINT32 MacData=0; + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : ===> %s\n", __FUNCTION__)); + + /* Disable Rx */ + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &MacData); + MacData &= ~(1 << 3); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, MacData); + + pAd->ate.Mode &= ATE_RXSTOP; + pAd->ate.bQARxStart = FALSE; +// pAd->ate.TxDoneCount = pAd->ate.TxCount; + + + /* Soft reset BBP. */ + BbpSoftReset(pAd); + + /* move to above */ + + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : <=== %s\n", __FUNCTION__)); + return Status; +} +#endif // RALINK_28xx_QA // + + + +/* +========================================================================== + Description: + Set ATE operation mode to + 0. ATESTART = Start ATE Mode + 1. ATESTOP = Stop ATE Mode + 2. TXCARR = Transmit Carrier + 3. TXCONT = Continuous Transmit + 4. TXFRAME = Transmit Frames + 5. RXFRAME = Receive Frames +#ifdef RALINK_28xx_QA + 6. TXSTOP = Stop Any Type of Transmition + 7. RXSTOP = Stop Receiving Frames +#endif // RALINK_28xx_QA // + + Return: + NDIS_STATUS_SUCCESS if all parameters are OK. +========================================================================== +*/ +static NDIS_STATUS ATECmdHandler( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + NDIS_STATUS Status = NDIS_STATUS_SUCCESS; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("===> %s\n", __FUNCTION__)); + + ATEAsicSwitchChannel(pAd); + + /* AsicLockChannel() is empty function so far in fact */ + AsicLockChannel(pAd, pAd->ate.Channel); + + RTMPusecDelay(5000); + + if (!strcmp(arg, "ATESTART")) + { + Status = ATESTART(pAd); + } + else if (!strcmp(arg, "ATESTOP")) + { + Status = ATESTOP(pAd); + } + else if (!strcmp(arg, "TXCARR")) + { + Status = TXCARR(pAd); + } + else if (!strcmp(arg, "TXCONT")) + { + Status = TXCONT(pAd); + } + else if (!strcmp(arg, "TXFRAME")) + { + Status = TXFRAME(pAd); + } + else if (!strcmp(arg, "RXFRAME")) + { + Status = RXFRAME(pAd); + } +#ifdef RALINK_28xx_QA + /* Enter ATE mode and set Tx/Rx Idle */ + else if (!strcmp(arg, "TXSTOP")) + { + Status = TXSTOP(pAd); + } + else if (!strcmp(arg, "RXSTOP")) + { + Status = RXSTOP(pAd); + } +#endif // RALINK_28xx_QA // + else + { + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATE : Invalid arg !\n")); + Status = NDIS_STATUS_INVALID_DATA; + } + RTMPusecDelay(5000); + + ATEDBGPRINT(RT_DEBUG_TRACE, ("<=== %s\n", __FUNCTION__)); + + return Status; +} + + +INT Set_ATE_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + + if (ATECmdHandler(pAd, arg) == NDIS_STATUS_SUCCESS) + { + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_Proc Success\n")); + + + return TRUE; + } + else + { + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_Proc Failed\n")); + return FALSE; + } +} + + +/* +========================================================================== + Description: + Set ATE ADDR1=DA for TxFrame(AP : To DS = 0 ; From DS = 1) + or + Set ATE ADDR3=DA for TxFrame(STA : To DS = 1 ; From DS = 0) + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_DA_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + PSTRING value; + INT i; + + // Mac address acceptable format 01:02:03:04:05:06 length 17 + if (strlen(arg) != 17) + return FALSE; + + for (i = 0, value = rstrtok(arg, ":"); value; value = rstrtok(NULL, ":")) + { + /* sanity check */ + if ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1)))) + { + return FALSE; + } + +#ifdef CONFIG_STA_SUPPORT + AtoH(value, &pAd->ate.Addr3[i++], 1); +#endif // CONFIG_STA_SUPPORT // + } + + /* sanity check */ + if (i != 6) + { + return FALSE; + } + +#ifdef CONFIG_STA_SUPPORT + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_DA_Proc (DA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr3[0], + pAd->ate.Addr3[1], pAd->ate.Addr3[2], pAd->ate.Addr3[3], pAd->ate.Addr3[4], pAd->ate.Addr3[5])); +#endif // CONFIG_STA_SUPPORT // + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_DA_Proc Success\n")); + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE ADDR3=SA for TxFrame(AP : To DS = 0 ; From DS = 1) + or + Set ATE ADDR2=SA for TxFrame(STA : To DS = 1 ; From DS = 0) + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_SA_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + PSTRING value; + INT i; + + // Mac address acceptable format 01:02:03:04:05:06 length 17 + if (strlen(arg) != 17) + return FALSE; + + for (i=0, value = rstrtok(arg, ":"); value; value = rstrtok(NULL, ":")) + { + /* sanity check */ + if ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1)))) + { + return FALSE; + } + +#ifdef CONFIG_STA_SUPPORT + AtoH(value, &pAd->ate.Addr2[i++], 1); +#endif // CONFIG_STA_SUPPORT // + } + + /* sanity check */ + if (i != 6) + { + return FALSE; + } + +#ifdef CONFIG_STA_SUPPORT + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_SA_Proc (SA = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr2[0], + pAd->ate.Addr2[1], pAd->ate.Addr2[2], pAd->ate.Addr2[3], pAd->ate.Addr2[4], pAd->ate.Addr2[5])); +#endif // CONFIG_STA_SUPPORT // + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_SA_Proc Success\n")); + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE ADDR2=BSSID for TxFrame(AP : To DS = 0 ; From DS = 1) + or + Set ATE ADDR1=BSSID for TxFrame(STA : To DS = 1 ; From DS = 0) + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_BSSID_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + PSTRING value; + INT i; + + // Mac address acceptable format 01:02:03:04:05:06 length 17 + if (strlen(arg) != 17) + return FALSE; + + for (i=0, value = rstrtok(arg, ":"); value; value = rstrtok(NULL, ":")) + { + /* sanity check */ + if ((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1)))) + { + return FALSE; + } + +#ifdef CONFIG_STA_SUPPORT + AtoH(value, &pAd->ate.Addr1[i++], 1); +#endif // CONFIG_STA_SUPPORT // + } + + /* sanity check */ + if(i != 6) + { + return FALSE; + } + +#ifdef CONFIG_STA_SUPPORT + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_BSSID_Proc (BSSID = %2X:%2X:%2X:%2X:%2X:%2X)\n", pAd->ate.Addr1[0], + pAd->ate.Addr1[1], pAd->ate.Addr1[2], pAd->ate.Addr1[3], pAd->ate.Addr1[4], pAd->ate.Addr1[5])); +#endif // CONFIG_STA_SUPPORT // + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_BSSID_Proc Success\n")); + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Tx Channel + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_CHANNEL_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR channel; + + channel = simple_strtol(arg, 0, 10); + + // to allow A band channel : ((channel < 1) || (channel > 14)) + if ((channel < 1) || (channel > 216)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_CHANNEL_Proc::Out of range, it should be in range of 1~14.\n")); + return FALSE; + } + + /* This is supposed just for rt3062 now. */ + /* todo : for 5G band(i.e., rt3562) */ + /* read tx power from e2p corresponding to ate channel */ +#ifdef RT35xx +#ifdef RTMP_MAC_PCI + if (channel != pAd->ate.Channel) + { + EEPROM_TX_PWR_STRUC Power; + EEPROM_TX_PWR_STRUC Power2; + UCHAR channel_power_index = ((channel-1)/2); + UCHAR channel_is_odd = (channel%2); + + pAd->ate.Channel = channel; + + // Read Tx power value for all channels + // Value from 1 - 0x7f. Default value is 24. + // Power value : 2.4G 0x00 (0) ~ 0x1F (31) + // : 5.5G 0xF9 (-7) ~ 0x0F (15) + // 0. 11b/g, ch1 - ch 14 + + if (channel_power_index < 7) + { + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX_PWR_OFFSET + channel_power_index * 2, Power.word); + RT28xx_EEPROM_READ16(pAd, EEPROM_G_TX2_PWR_OFFSET + channel_power_index * 2, Power2.word); + + if (channel_is_odd) + { + if ((Power.field.Byte1 > 31) || (Power.field.Byte1 < 0)) + pAd->ate.TxPower0 = DEFAULT_RF_TX_POWER; + else + pAd->ate.TxPower0 = Power.field.Byte1; + + if ((Power2.field.Byte1 > 31) || (Power2.field.Byte1 < 0)) + pAd->ate.TxPower1 = DEFAULT_RF_TX_POWER; + else + pAd->ate.TxPower1 = Power2.field.Byte1; + } + else + { + if ((Power.field.Byte0 > 31) || (Power.field.Byte0 < 0)) + pAd->ate.TxPower0 = DEFAULT_RF_TX_POWER; + else + pAd->ate.TxPower0 = Power.field.Byte0; + + if ((Power2.field.Byte0 > 31) || (Power2.field.Byte0 < 0)) + pAd->ate.TxPower1 = DEFAULT_RF_TX_POWER; + else + pAd->ate.TxPower1 = Power2.field.Byte0; + } + + /* update tx power */ + ATETxPwrHandler(pAd, 0); + ATETxPwrHandler(pAd, 1); + } + } +#endif // RTMP_MAC_PCI // +#endif // RT35xx // + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_CHANNEL_Proc (ATE Channel = %d)\n", pAd->ate.Channel)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_CHANNEL_Proc Success\n")); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Tx Power0 + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_POWER0_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + CHAR TxPower; + + TxPower = simple_strtol(arg, 0, 10); + + if (pAd->ate.Channel <= 14) + { + if ((TxPower > 31) || (TxPower < 0)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER0_Proc::Out of range (Value=%d)\n", TxPower)); + return FALSE; + } + } + else/* 5.5 GHz */ + { + if ((TxPower > 15) || (TxPower < -7)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER0_Proc::Out of range (Value=%d)\n", TxPower)); + return FALSE; + } + } + + pAd->ate.TxPower0 = TxPower; + ATETxPwrHandler(pAd, 0); + + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_POWER0_Proc Success\n")); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Tx Power1 + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_POWER1_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + CHAR TxPower; + + TxPower = simple_strtol(arg, 0, 10); + + if (pAd->ate.Channel <= 14) + { + if ((TxPower > 31) || (TxPower < 0)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER1_Proc::Out of range (Value=%d)\n", TxPower)); + return FALSE; + } + } + else + { + if ((TxPower > 15) || (TxPower < -7)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_POWER1_Proc::Out of range (Value=%d)\n", TxPower)); + return FALSE; + } + } + + pAd->ate.TxPower1 = TxPower; + ATETxPwrHandler(pAd, 1); + + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_POWER1_Proc Success\n")); + + + return TRUE; +} + + + + +/* +========================================================================== + Description: + Set ATE Tx Antenna + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_Antenna_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + CHAR value; + + value = simple_strtol(arg, 0, 10); + + if ((value > 2) || (value < 0)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_Antenna_Proc::Out of range (Value=%d)\n", value)); + return FALSE; + } + + pAd->ate.TxAntennaSel = value; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_Antenna_Proc (Antenna = %d)\n", pAd->ate.TxAntennaSel)); + ATEDBGPRINT(RT_DEBUG_TRACE,("Ralink: Set_ATE_TX_Antenna_Proc Success\n")); + + /* calibration power unbalance issues */ + ATEAsicSwitchChannel(pAd); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Rx Antenna + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_RX_Antenna_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + CHAR value; + + value = simple_strtol(arg, 0, 10); + + if ((value > 3) || (value < 0)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_RX_Antenna_Proc::Out of range (Value=%d)\n", value)); + return FALSE; + } + + pAd->ate.RxAntennaSel = value; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_RX_Antenna_Proc (Antenna = %d)\n", pAd->ate.RxAntennaSel)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_RX_Antenna_Proc Success\n")); + + /* calibration power unbalance issues */ + ATEAsicSwitchChannel(pAd); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE RF frequence offset + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_FREQOFFSET_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR RFFreqOffset = 0; + ULONG R4 = 0; +#ifdef RTMP_RF_RW_SUPPORT + UCHAR RFValue = 0; +#endif // RTMP_RF_RW_SUPPORT // + + RFFreqOffset = simple_strtol(arg, 0, 10); + + /* RT35xx ATE will reuse this code segment. */ +#ifdef RTMP_RF_RW_SUPPORT +//2008/08/06: KH modified the limit of offset value from 64 to 96(0x5F + 0x01) + if (RFFreqOffset >= 96) +#else + if (RFFreqOffset >= 64) +#endif // RTMP_RF_RW_SUPPORT // + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_FREQOFFSET_Proc::Out of range.\n")); + return FALSE; + } + + pAd->ate.RFFreqOffset = RFFreqOffset; + +#ifdef RTMP_RF_RW_SUPPORT + if (IS_RT30xx(pAd) || IS_RT3572(pAd)) + { + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R23, (PUCHAR)&RFValue); +//2008/08/06: KH modified "pAd->RFFreqOffset" to "pAd->ate.RFFreqOffset" + RFValue = ((RFValue & 0x80) | pAd->ate.RFFreqOffset); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R23, (UCHAR)RFValue); + } + else +#endif // RTMP_RF_RW_SUPPORT // + { + // RT28xx + // shift TX power control to correct RF register bit position + R4 = pAd->ate.RFFreqOffset << 15; + R4 |= (pAd->LatchRfRegs.R4 & ((~0x001f8000))); + pAd->LatchRfRegs.R4 = R4; + + RtmpRfIoWrite(pAd); + } + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_FREQOFFSET_Proc (RFFreqOffset = %d)\n", pAd->ate.RFFreqOffset)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_FREQOFFSET_Proc Success\n")); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE RF BW + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_BW_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + INT i; + UCHAR value = 0; + UCHAR BBPCurrentBW; + + BBPCurrentBW = simple_strtol(arg, 0, 10); + + if ((BBPCurrentBW == 0) +#ifdef RT30xx + || IS_RT2070(pAd) +#endif // RT30xx // + ) + { + pAd->ate.TxWI.BW = BW_20; + } + else + { + pAd->ate.TxWI.BW = BW_40; + } + + /* RT35xx ATE will reuse this code segment. */ + // Fix the error spectrum of CCK-40MHZ. + // Turn on BBP 20MHz mode by request here. + if ((pAd->ate.TxWI.PHYMODE == MODE_CCK) && (pAd->ate.TxWI.BW == BW_40)) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_BW_Proc!! Warning!! CCK only supports 20MHZ!!\nBandwidth switch to 20\n")); + pAd->ate.TxWI.BW = BW_20; + } + + if (pAd->ate.TxWI.BW == BW_20) + { + if (pAd->ate.Channel <= 14) + { + for (i=0; i<5; i++) + { + if (pAd->Tx20MPwrCfgGBand[i] != 0xffffffff) + { + RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->Tx20MPwrCfgGBand[i]); + RTMPusecDelay(5000); + } + } + } + else + { + for (i=0; i<5; i++) + { + if (pAd->Tx20MPwrCfgABand[i] != 0xffffffff) + { + RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->Tx20MPwrCfgABand[i]); + RTMPusecDelay(5000); + } + } + } + + // Set BBP R4 bit[4:3]=0:0 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value); + value &= (~0x18); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value); + +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + if (pAd->ate.Channel > 14) + { + value = 0x22 + (GET_LNA_GAIN(pAd)*5)/3; + } + else + { + value = 0x1C + 2*GET_LNA_GAIN(pAd); + } + + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value); + } +#endif // RT35xx // + +#ifndef RT35xx + // Set BBP R66=0x3C + value = 0x3C; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value); +#endif // !RT35xx // + + // Set BBP R68=0x0B + // to improve Rx sensitivity. + value = 0x0B; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R68, value); + // Set BBP R69=0x16 + value = 0x16; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, value); + // Set BBP R70=0x08 + value = 0x08; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, value); + // Set BBP R73=0x11 + value = 0x11; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, value); + + /* + If Channel=14, Bandwidth=20M and Mode=CCK, Set BBP R4 bit5=1 + (to set Japan filter coefficients). + This segment of code will only works when ATETXMODE and ATECHANNEL + were set to MODE_CCK and 14 respectively before ATETXBW is set to 0. + */ + if (pAd->ate.Channel == 14) + { + INT TxMode = pAd->ate.TxWI.PHYMODE; + + if (TxMode == MODE_CCK) + { + // when Channel==14 && Mode==CCK && BandWidth==20M, BBP R4 bit5=1 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value); + value |= 0x20; //set bit5=1 + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value); + } + } + +#ifdef RT30xx + // set BW = 20 MHz + if (IS_RT30xx(pAd)) + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, (UCHAR) pAd->Mlme.CaliBW20RfR24); + else +#endif // RT30xx // +#ifdef RT35xx + // set BW = 20 MHz + if (IS_RT3572(pAd)) + { + // R24, R31, one is for tx, the other is for rx + if (pAd->ate.TxWI.PHYMODE == MODE_CCK)// CCK + { + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, 0x1f);// todo + } + else + { + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, 0x08);// todo + } +// ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, (UCHAR)pAd->Mlme.CaliBW20RfR24);// todo + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R31, 0x0f); + } + else +#endif // RT35xx // + // set BW = 20 MHz + { + pAd->LatchRfRegs.R4 &= ~0x00200000; + RtmpRfIoWrite(pAd); + } + } + // If bandwidth = 40M, set RF Reg4 bit 21 = 0. + else if (pAd->ate.TxWI.BW == BW_40) + { + if (pAd->ate.Channel <= 14) + { + for (i=0; i<5; i++) + { + if (pAd->Tx40MPwrCfgGBand[i] != 0xffffffff) + { + RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->Tx40MPwrCfgGBand[i]); + RTMPusecDelay(5000); + } + } + } + else + { + for (i=0; i<5; i++) + { + if (pAd->Tx40MPwrCfgABand[i] != 0xffffffff) + { + RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, pAd->Tx40MPwrCfgABand[i]); + RTMPusecDelay(5000); + } + } + + if ((pAd->ate.TxWI.PHYMODE >= 2/* MODE_HTMIX */) && (pAd->ate.TxWI.MCS == 7)) + { + value = 0x28; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R67, value); + } + } + + // Set BBP R4 bit[4:3]=1:0 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &value); + value &= (~0x18); + value |= 0x10; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, value); + +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + if (pAd->ate.Channel > 14) + { + value = 0x22 + (GET_LNA_GAIN(pAd)*5)/3; + } + else + { + value = 0x1C + 2*GET_LNA_GAIN(pAd); + } + + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value); + } +#endif // RT35xx // + +#ifndef RT35xx + // Set BBP R66=0x3C + value = 0x3C; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, value); +#endif // !RT35xx // + + // Set BBP R68=0x0C + // to improve Rx sensitivity + value = 0x0C; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R68, value); + // Set BBP R69=0x1A + value = 0x1A; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, value); + // Set BBP R70=0x0A + value = 0x0A; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, value); + // Set BBP R73=0x16 + value = 0x16; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, value); + + // If bandwidth = 40M, set RF Reg4 bit 21 = 1. +#ifdef RT30xx + // set BW = 40 MHz + if(IS_RT30xx(pAd)) + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, (UCHAR) pAd->Mlme.CaliBW40RfR24); + else +#endif // RT30xx // +#ifdef RT35xx + // set BW = 40 MHz + if (IS_RT3572(pAd)) + { + // R24, R31, one is for tx, the other is for rx + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, 0x28); +// ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R31, (UCHAR)pAd->Mlme.CaliBW40RfR24); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R31, 0x2f); + } + else +#endif // RT35xx // + // set BW = 40 MHz + { + pAd->LatchRfRegs.R4 |= 0x00200000; + RtmpRfIoWrite(pAd); + } + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_BW_Proc (BBPCurrentBW = %d)\n", pAd->ate.TxWI.BW)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_BW_Proc Success\n")); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Tx frame length + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_LENGTH_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + pAd->ate.TxLength = simple_strtol(arg, 0, 10); + + if ((pAd->ate.TxLength < 24) || (pAd->ate.TxLength > (MAX_FRAME_SIZE - 34/* == 2312 */))) + { + pAd->ate.TxLength = (MAX_FRAME_SIZE - 34/* == 2312 */); + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_LENGTH_Proc::Out of range, it should be in range of 24~%d.\n", (MAX_FRAME_SIZE - 34/* == 2312 */))); + return FALSE; + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_LENGTH_Proc (TxLength = %d)\n", pAd->ate.TxLength)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_LENGTH_Proc Success\n")); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Tx frame count + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_COUNT_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + pAd->ate.TxCount = simple_strtol(arg, 0, 10); + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_COUNT_Proc (TxCount = %d)\n", pAd->ate.TxCount)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_COUNT_Proc Success\n")); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Tx frame MCS + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_MCS_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR MCS; + INT result; + + MCS = simple_strtol(arg, 0, 10); +#ifndef RT30xx + result = CheckMCSValid(pAd->ate.TxWI.PHYMODE, MCS); +#endif // RT30xx // + + /* RT35xx ATE will reuse this code segment. */ +#ifdef RT30xx + result = CheckMCSValid(pAd->ate.TxWI.PHYMODE, MCS, IS_RT2070(pAd)); +#endif // RT30xx // + + + if (result != -1) + { + pAd->ate.TxWI.MCS = (UCHAR)MCS; + } + else + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_MCS_Proc::Out of range, refer to rate table.\n")); + return FALSE; + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_MCS_Proc (MCS = %d)\n", pAd->ate.TxWI.MCS)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_MCS_Proc Success\n")); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Tx frame Mode + 0: MODE_CCK + 1: MODE_OFDM + 2: MODE_HTMIX + 3: MODE_HTGREENFIELD + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_MODE_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR BbpData = 0; + + pAd->ate.TxWI.PHYMODE = simple_strtol(arg, 0, 10); + + if (pAd->ate.TxWI.PHYMODE > 3) + { + pAd->ate.TxWI.PHYMODE = 0; + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_MODE_Proc::Out of range.\nIt should be in range of 0~3\n")); + ATEDBGPRINT(RT_DEBUG_ERROR, ("0: CCK, 1: OFDM, 2: HT_MIX, 3: HT_GREEN_FIELD.\n")); + return FALSE; + } + + // Turn on BBP 20MHz mode by request here. + if (pAd->ate.TxWI.PHYMODE == MODE_CCK) + { + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BbpData); + BbpData &= (~0x18); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BbpData); + pAd->ate.TxWI.BW = BW_20; + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_MODE_Proc::CCK Only support 20MHZ. Switch to 20MHZ.\n")); + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_MODE_Proc (TxMode = %d)\n", pAd->ate.TxWI.PHYMODE)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_MODE_Proc Success\n")); + + + return TRUE; +} + + +/* +========================================================================== + Description: + Set ATE Tx frame GI + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +INT Set_ATE_TX_GI_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + pAd->ate.TxWI.ShortGI = simple_strtol(arg, 0, 10); + + if (pAd->ate.TxWI.ShortGI > 1) + { + pAd->ate.TxWI.ShortGI = 0; + ATEDBGPRINT(RT_DEBUG_ERROR, ("Set_ATE_TX_GI_Proc::Out of range\n")); + return FALSE; + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_TX_GI_Proc (GI = %d)\n", pAd->ate.TxWI.ShortGI)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_TX_GI_Proc Success\n")); + + + return TRUE; +} + + +INT Set_ATE_RX_FER_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + pAd->ate.bRxFER = simple_strtol(arg, 0, 10); + + if (pAd->ate.bRxFER == 1) + { + pAd->ate.RxCntPerSec = 0; + pAd->ate.RxTotalCnt = 0; + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_RX_FER_Proc (bRxFER = %d)\n", pAd->ate.bRxFER)); + ATEDBGPRINT(RT_DEBUG_TRACE, ("Ralink: Set_ATE_RX_FER_Proc Success\n")); + + + return TRUE; +} + + +INT Set_ATE_Read_RF_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ +#ifdef RTMP_RF_RW_SUPPORT + /* modify by WY for Read RF Reg. error */ + UCHAR RFValue; + INT index=0; + +//2008/07/10:KH add to support RT30xx ATE<-- + if (IS_RT30xx(pAd) || IS_RT3572(pAd)) + { + for (index = 0; index < 32; index++) + { + ATE_RF_IO_READ8_BY_REG_ID(pAd, index, (PUCHAR)&RFValue); + ate_print("R%d=%d\n",index,RFValue); + } + } + else +//2008/07/10:KH add to support RT30xx ATE--> +#endif // RTMP_RF_RW_SUPPORT // + { + ate_print(KERN_EMERG "R1 = %lx\n", pAd->LatchRfRegs.R1); + ate_print(KERN_EMERG "R2 = %lx\n", pAd->LatchRfRegs.R2); + ate_print(KERN_EMERG "R3 = %lx\n", pAd->LatchRfRegs.R3); + ate_print(KERN_EMERG "R4 = %lx\n", pAd->LatchRfRegs.R4); + } + return TRUE; +} + +#ifndef RTMP_RF_RW_SUPPORT +INT Set_ATE_Write_RF1_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT32 value = (UINT32) simple_strtol(arg, 0, 16); + + pAd->LatchRfRegs.R1 = value; + RtmpRfIoWrite(pAd); + + return TRUE; +} + + +INT Set_ATE_Write_RF2_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT32 value = (UINT32) simple_strtol(arg, 0, 16); + + pAd->LatchRfRegs.R2 = value; + RtmpRfIoWrite(pAd); + + return TRUE; +} + + +INT Set_ATE_Write_RF3_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT32 value = (UINT32) simple_strtol(arg, 0, 16); + + pAd->LatchRfRegs.R3 = value; + RtmpRfIoWrite(pAd); + + return TRUE; +} + + +INT Set_ATE_Write_RF4_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT32 value = (UINT32) simple_strtol(arg, 0, 16); + + pAd->LatchRfRegs.R4 = value; + RtmpRfIoWrite(pAd); + + return TRUE; +} +#endif // RTMP_RF_RW_SUPPORT // + +/* +========================================================================== + Description: + Load and Write EEPROM from a binary file prepared in advance. + + Return: + TRUE if all parameters are OK, FALSE otherwise +========================================================================== +*/ +#if defined(LINUX) || defined(VXWORKS) +INT Set_ATE_Load_E2P_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + BOOLEAN ret = FALSE; + PSTRING src = EEPROM_BIN_FILE_NAME; + RTMP_OS_FD srcf; + INT32 retval; + USHORT WriteEEPROM[(EEPROM_SIZE/2)]; + INT FileLength = 0; + UINT32 value = (UINT32) simple_strtol(arg, 0, 10); + RTMP_OS_FS_INFO osFSInfo; + + ATEDBGPRINT(RT_DEBUG_ERROR, ("===> %s (value=%d)\n\n", __FUNCTION__, value)); + + if (value > 0) + { + /* zero the e2p buffer */ + NdisZeroMemory((PUCHAR)WriteEEPROM, EEPROM_SIZE); + + RtmpOSFSInfoChange(&osFSInfo, TRUE); + + do + { + /* open the bin file */ + srcf = RtmpOSFileOpen(src, O_RDONLY, 0); + + if (IS_FILE_OPEN_ERR(srcf)) + { + ate_print("%s - Error opening file %s\n", __FUNCTION__, src); + break; + } + + /* read the firmware from the file *.bin */ + FileLength = RtmpOSFileRead(srcf, (PSTRING)WriteEEPROM, EEPROM_SIZE); + + if (FileLength != EEPROM_SIZE) + { + ate_print("%s: error file length (=%d) in e2p.bin\n", + __FUNCTION__, FileLength); + break; + } + else + { + /* write the content of .bin file to EEPROM */ +#if defined(RTMP_MAC_PCI) && defined(RTMP_PCI_SUPPORT) + { + USHORT index=0; + USHORT value=0; + + INT32 e2p_size=512;/* == 0x200 for PCI interface */ + USHORT tempData=0; + for (index = 0 ; index < (e2p_size / 2); ) + { + /* "value" is especially for some compilers... */ + tempData = le2cpu16(WriteEEPROM[index]); + value = tempData; + RT28xx_EEPROM_WRITE16(pAd, index*2, value); + index ++; + } + } +#else + rt_ee_write_all(pAd, WriteEEPROM); +#endif /* defined(RTMP_MAC_PCI) && defined(RTMP_PCI_SUPPORT) */ + ret = TRUE; + } + break; + } while(TRUE); + + /* close firmware file */ + if (IS_FILE_OPEN_ERR(srcf)) + { + ; + } + else + { + retval = RtmpOSFileClose(srcf); + + if (retval) + { + ATEDBGPRINT(RT_DEBUG_ERROR, ("--> Error %d closing %s\n", -retval, src)); + + } + } + + /* restore */ + RtmpOSFSInfoChange(&osFSInfo, FALSE); + } + + ATEDBGPRINT(RT_DEBUG_ERROR, ("<=== %s (ret=%d)\n", __FUNCTION__, ret)); + + return ret; + +} +#endif // defined(LINUX) || defined(VXWORKS) // + + + + +INT Set_ATE_Read_E2P_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + USHORT buffer[EEPROM_SIZE/2]; + USHORT *p; + int i; + + rt_ee_read_all(pAd, (USHORT *)buffer); + p = buffer; + for (i = 0; i < (EEPROM_SIZE/2); i++) + { + ate_print("%4.4x ", *p); + if (((i+1) % 16) == 0) + ate_print("\n"); + p++; + } + return TRUE; +} + + +#ifdef RT35xx +/* + ======================================================================== + + Routine Description: + Set LED Signal Stregth, dedicated for ATE. + + + Arguments: + pAd Pointer to our adapter + Dbm Signal Stregth + + Return Value: + None + + IRQL = PASSIVE_LEVEL + + Note: + Can be run on any IRQL level. + + According to Microsoft Zero Config Wireless Signal Stregth definition as belows. + <= 0 No Signal + <= 1 Very Low + <= 3 Low + <= 7 Good + <= 15 Very Good + > 15 Excellent + ======================================================================== +*/ + +INT Set_ATE_LED_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR nLed = simple_strtol(arg, 0, 10); + + if (nLed <= 0) + nLed = 0; + else if (nLed <= 1 ) + nLed = 1; + else if (nLed <= 3) + nLed = 3; + else if (nLed <= 7) + nLed = 7; + else if (nLed <= 15) + nLed = 15; + else + nLed = 31; + + /* always update signal strength to firmware */ + if (pAd->LedCntl.field.LedMode == LED_MODE_SIGNAL_STREGTH) + { + AsicSendCommandToMcu(pAd, 0x51, 0xff, nLed, pAd->LedCntl.field.Polarity); + pAd->ate.LedIndicatorStrength = nLed; + } + ATEDBGPRINT(RT_DEBUG_TRACE, ("Set_ATE_LED_Proc :: %d\n", pAd->ate.LedIndicatorStrength)); + + return TRUE; +} + + +INT Set_ATE_HW_LED_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if (IS_RT3572(pAd)) + { + RTMPSetLED(pAd, LED_HW_CONTROL); + } + else + { + return FALSE; + } + + return TRUE; +} +#endif // RT35xx // + + +INT Set_ATE_Show_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ate_print("Mode=%d\n", pAd->ate.Mode); + ate_print("TxPower0=%d\n", pAd->ate.TxPower0); + ate_print("TxPower1=%d\n", pAd->ate.TxPower1); + ate_print("TxAntennaSel=%d\n", pAd->ate.TxAntennaSel); + ate_print("RxAntennaSel=%d\n", pAd->ate.RxAntennaSel); + ate_print("BBPCurrentBW=%d\n", pAd->ate.TxWI.BW); + ate_print("GI=%d\n", pAd->ate.TxWI.ShortGI); + ate_print("MCS=%d\n", pAd->ate.TxWI.MCS); + ate_print("TxMode=%d\n", pAd->ate.TxWI.PHYMODE); + ate_print("Addr1=%02x:%02x:%02x:%02x:%02x:%02x\n", + pAd->ate.Addr1[0], pAd->ate.Addr1[1], pAd->ate.Addr1[2], pAd->ate.Addr1[3], pAd->ate.Addr1[4], pAd->ate.Addr1[5]); + ate_print("Addr2=%02x:%02x:%02x:%02x:%02x:%02x\n", + pAd->ate.Addr2[0], pAd->ate.Addr2[1], pAd->ate.Addr2[2], pAd->ate.Addr2[3], pAd->ate.Addr2[4], pAd->ate.Addr2[5]); + ate_print("Addr3=%02x:%02x:%02x:%02x:%02x:%02x\n", + pAd->ate.Addr3[0], pAd->ate.Addr3[1], pAd->ate.Addr3[2], pAd->ate.Addr3[3], pAd->ate.Addr3[4], pAd->ate.Addr3[5]); + ate_print("Channel=%d\n", pAd->ate.Channel); + ate_print("TxLength=%d\n", pAd->ate.TxLength); + ate_print("TxCount=%u\n", pAd->ate.TxCount); + ate_print("RFFreqOffset=%d\n", pAd->ate.RFFreqOffset); +#ifdef RT35xx + ate_print("LedIndicatorStregth=%d\n", pAd->ate.LedIndicatorStrength); +#endif // RT35xx // + ate_print(KERN_EMERG "Set_ATE_Show_Proc Success\n"); + return TRUE; +} + + +INT Set_ATE_Help_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ate_print("ATE=ATESTART, ATESTOP, TXCONT, TXCARR, TXFRAME, RXFRAME\n"); + ate_print("ATEDA\n"); + ate_print("ATESA\n"); + ate_print("ATEBSSID\n"); + ate_print("ATECHANNEL, range:0~14(unless A band !)\n"); + ate_print("ATETXPOW0, set power level of antenna 1.\n"); + ate_print("ATETXPOW1, set power level of antenna 2.\n"); + ate_print("ATETXANT, set TX antenna. 0:all, 1:antenna one, 2:antenna two.\n"); + ate_print("ATERXANT, set RX antenna.0:all, 1:antenna one, 2:antenna two, 3:antenna three.\n"); +#ifdef RTMP_RF_RW_SUPPORT + ate_print("ATETXFREQOFFSET, set frequency offset, range 0~95\n"); +#else + ate_print("ATETXFREQOFFSET, set frequency offset, range 0~63\n"); +#endif // RTMP_RF_RW_SUPPORT // + ate_print("ATETXBW, set BandWidth, 0:20MHz, 1:40MHz.\n"); + ate_print("ATETXLEN, set Frame length, range 24~%d\n", (MAX_FRAME_SIZE - 34/* == 2312 */)); + ate_print("ATETXCNT, set how many frame going to transmit.\n"); + ate_print("ATETXMCS, set MCS, reference to rate table.\n"); + ate_print("ATETXMODE, set Mode 0:CCK, 1:OFDM, 2:HT-Mix, 3:GreenField, reference to rate table.\n"); + ate_print("ATETXGI, set GI interval, 0:Long, 1:Short\n"); + ate_print("ATERXFER, 0:disable Rx Frame error rate. 1:enable Rx Frame error rate.\n"); + ate_print("ATERRF, show all RF registers.\n"); + ate_print("ATEWRF1, set RF1 register.\n"); + ate_print("ATEWRF2, set RF2 register.\n"); + ate_print("ATEWRF3, set RF3 register.\n"); + ate_print("ATEWRF4, set RF4 register.\n"); + ate_print("ATELDE2P, load EEPROM from .bin file.\n"); + ate_print("ATERE2P, display all EEPROM content.\n"); +#ifdef RT35xx + ate_print("ATELED, test signal LED, range 0~31.\n"); + ate_print("ATEHWLED, control LED by hardware.\n"); +#endif // RT35xx // + ate_print("ATESHOW, display all parameters of ATE.\n"); + ate_print("ATEHELP, online help.\n"); + + return TRUE; +} + + +#ifdef RT35xx +VOID ATEAsicSetTxRxPath( + IN PRTMP_ADAPTER pAd) +{ + UCHAR RFValue = 0, BbpValue = 0; + + // set TX path, pAd->ate.TxAntennaSel : 0 -> All, 1 -> TX0, 2 -> TX1 + switch (pAd->Antenna.field.TxPath) + { + case 2: + switch (pAd->ate.TxAntennaSel) + { + case 1: + // set BBP R1, bit 4:3 = 00 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue); + BbpValue &= 0xE7; // 11100111B + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue); + + // set RF R1, bit 7:5:3 = 110 + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue = RFValue & 0x57; + RFValue = RFValue | 0xA0; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + case 2: + // set BBP R1, bit 4:3 = 01 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue); + BbpValue &= 0xE7; + BbpValue |= 0x08; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue); + + // set RF R1, bit 7:5:3 = 101 + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue = RFValue & 0x57; + RFValue = RFValue | 0x88; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + default: + // set BBP R1, bit 4:3 = 10 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue); + BbpValue &= 0xE7; + BbpValue |= 0x10; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue); + break; + } + break; + + default: + break; + } + + + // set RX path, pAd->ate.RxAntennaSel : 0 -> All, 1 -> RX0, 2 -> RX1, 3 -> RX2 + switch (pAd->Antenna.field.RxPath) + { + case 3: + switch (pAd->ate.RxAntennaSel) + { + case 1: + // set BBP R3, bit 4:3:1:0 = 0000 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x00; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + + // set RF R1, bit 6:4:2 = 110 + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue = RFValue & 0xAB; + RFValue = RFValue | 0x50; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + case 2: + // set BBP R3, bit 4:3:1:0 = 0001 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x01; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + + // set RF R1, bit 6:4:2 = 101 + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue = RFValue & 0xAB; + RFValue = RFValue | 0x44; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + case 3: + // set BBP R3, bit 4:3:1:0 = 0002 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x02; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + + // set RF R1, bit 6:4:2 = 011 + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue = RFValue & 0xAB; + RFValue = RFValue | 0x14; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + default: + // set BBP R3, bit 4:3:1:0 = 1000 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x10; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + + // set RF R1, bit 6:4:2 = 000 +// ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); +// RFValue = RFValue & 0xAB; +// ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + } + break; + + case 2: + switch (pAd->ate.RxAntennaSel) + { + case 1: + // set BBP R3, bit 4:3:1:0 = 0000 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x00; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + + // set RF R1, bit 6:4:2 = 110 + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue = RFValue & 0xAB; + RFValue = RFValue | 0x50; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + case 2: + // set BBP R3, bit 4:3:1:0 = 0001 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x01; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + + // set RF R1, bit 6:4:2 = 101 + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue = RFValue & 0xAB; + RFValue = RFValue | 0x44; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + default: + // set BBP R3, bit 4:3:1:0 = 0100 + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x08; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + + // set RF R1, bit 6:4:2 = 000 +// ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); +// RFValue = RFValue & 0xAB; +// ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + } + break; + + default: + switch (pAd->ate.RxAntennaSel) + { + default: + // set RF R1, bit 6:4:2 = 000 +// ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); +// RFValue = RFValue & 0xAB; +// ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + break; + } + break; + } +} +#endif // RT35xx // + + +/* +========================================================================== + Description: + + AsicSwitchChannel() dedicated for ATE. + +========================================================================== +*/ +VOID ATEAsicSwitchChannel( + IN PRTMP_ADAPTER pAd) +{ + UINT32 R2 = 0, R3 = DEFAULT_RF_TX_POWER, R4 = 0, Value = 0; + RTMP_RF_REGS *RFRegTable = NULL; + UCHAR index = 0, BbpValue = 0, R66 = 0x30, Channel = 0; + CHAR TxPwer = 0, TxPwer2 = 0; + + +#ifdef RTMP_RF_RW_SUPPORT + /* added to prevent RF register reading error */ + UCHAR RFValue = 0; +#endif // RTMP_RF_RW_SUPPORT // + +#ifdef RALINK_28xx_QA + // for QA mode, TX power values are passed from UI + if ((pAd->ate.bQATxStart == TRUE) || (pAd->ate.bQARxStart == TRUE)) + { + if (pAd->ate.Channel != pAd->LatchRfRegs.Channel) + { + pAd->ate.Channel = pAd->LatchRfRegs.Channel; + } + return; + } + else +#endif // RALINK_28xx_QA // + Channel = pAd->ate.Channel; + + // fill Tx power value + TxPwer = pAd->ate.TxPower0; + TxPwer2 = pAd->ate.TxPower1; + +#ifdef RT30xx +//2008/07/10:KH add to support 3070 ATE<-- + + /* + The RF programming sequence is difference between 3xxx and 2xxx. + The 3070 is 1T1R. Therefore, we don't need to set the number of Tx/Rx path + and the only job is to set the parameters of channels. + */ + if (IS_RT30xx(pAd) && ((pAd->RfIcType == RFIC_3020) || + (pAd->RfIcType == RFIC_3021) || (pAd->RfIcType == RFIC_3022) || + (pAd->RfIcType == RFIC_2020))) + { + /* modify by WY for Read RF Reg. error */ + + for (index = 0; index < NUM_OF_3020_CHNL; index++) + { + if (Channel == FreqItems3020[index].Channel) + { + // Programming channel parameters. + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R02, FreqItems3020[index].N); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R03, FreqItems3020[index].K); + + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R06, (PUCHAR)&RFValue); + RFValue = (RFValue & 0xFC) | FreqItems3020[index].R; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R06, (UCHAR)RFValue); + + // Set Tx Power. + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R12, (PUCHAR)&RFValue); + RFValue = (RFValue & 0xE0) | TxPwer; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R12, (UCHAR)RFValue); + + // Set RF offset. + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R23, (PUCHAR)&RFValue); + //2008/08/06: KH modified "pAd->RFFreqOffset" to "pAd->ate.RFFreqOffset" + RFValue = (RFValue & 0x80) | pAd->ate.RFFreqOffset; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R23, (UCHAR)RFValue); + + // Set BW. + if (pAd->ate.TxWI.BW == BW_40) + { + RFValue = pAd->Mlme.CaliBW40RfR24; +// DISABLE_11N_CHECK(pAd); + } + else + { + RFValue = pAd->Mlme.CaliBW20RfR24; + } + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, (UCHAR)RFValue); + + // Enable RF tuning + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R07, (PUCHAR)&RFValue); + RFValue = RFValue | 0x1; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R07, (UCHAR)RFValue); + + // latch channel for future usage + pAd->LatchRfRegs.Channel = Channel; + + break; + } + } + + ATEDBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%d, Pwr1=%d, %dT), N=0x%02X, K=0x%02X, R=0x%02X\n", + Channel, + pAd->RfIcType, + TxPwer, + TxPwer2, + pAd->Antenna.field.TxPath, + FreqItems3020[index].N, + FreqItems3020[index].K, + FreqItems3020[index].R)); + } + else +//2008/07/10:KH add to support 3070 ATE--> +#endif // RT30xx // +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + for (index = 0; index < NUM_OF_3572_CHNL; index++) + { + if (Channel == FreqItems3572[index].Channel) + { + // for 2.4G, restore BBP25, BBP26 + if (Channel <= 14) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, pAd->Bbp25); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R26, pAd->Bbp26); + } + // hard code for 5GHz, Gary 2008-12-10 + else + { + // enable IQ Phase Correction + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x09); + // IQ phase correction value + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R26, 0xFF); + } + + // programming channel parameters + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R02, FreqItems3572[index].N); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R03, FreqItems3572[index].K); + + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R06, (PUCHAR)&RFValue); + if (Channel <= 14) + RFValue = (RFValue & 0xF0) | FreqItems3572[index].R | 0x8; + else + RFValue = (RFValue & 0xF0) | FreqItems3572[index].R | 0x4; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R06, (UCHAR)RFValue); + + // PLL mode for 2.4G or 5G + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R05, (PUCHAR)&RFValue); + if (Channel <= 14) + RFValue = (RFValue & 0xF3) | 0x4; + else + RFValue = (RFValue & 0xF3) | 0x8; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R05, (UCHAR)RFValue); + + // set Tx0 Power + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R12, (PUCHAR)&RFValue); + if (Channel <= 14) + RFValue = 0x60 | TxPwer; + else + RFValue = 0xE0 | (TxPwer & 0x3) | ((TxPwer & 0xC) << 1); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R12, (UCHAR)RFValue); + + // set Tx1 Power + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R13, (PUCHAR)&RFValue); + if (Channel <= 14) + RFValue = 0x60 | TxPwer2; + else + RFValue = 0xE0 | (TxPwer2 & 0x3) | ((TxPwer2 & 0xC) << 1); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R13, (UCHAR)RFValue); + + // Tx/Rx stream setting + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R01, (PUCHAR)&RFValue); + RFValue &= 0x03; // clear bit[7~2] + if (pAd->Antenna.field.TxPath == 1) + RFValue |= 0xA0; + else if (pAd->Antenna.field.TxPath == 2) + RFValue |= 0x80; + if (pAd->Antenna.field.RxPath == 1) + RFValue |= 0x50; + else if (pAd->Antenna.field.RxPath == 2) + RFValue |= 0x40; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R01, (UCHAR)RFValue); + + ATEAsicSetTxRxPath(pAd); + + // set RF offset + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R23, (PUCHAR)&RFValue); + RFValue = (RFValue & 0x80) | pAd->ate.RFFreqOffset; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R23, (UCHAR)RFValue); + + // copy to Set_ATE_TX_BW_Proc() as RT30xx ATE driver. + // set BW + if (/*!bScan &&*/(pAd->ate.TxWI.BW == BW_40)) + { + RFValue = pAd->Mlme.CaliBW40RfR24; +#ifdef HUAWEI_ATE + /* This is supposed just for rt3062 now. */ + if (pAd->ate.TxWI.PHYMODE == MODE_HTMIX) + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, 0x24); + else +#endif // HUAWEI_ATE // + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, 0x28); + + /* no such function in linux driver */ +// DISABLE_11N_CHECK(pAd); + } + else + { + RFValue = pAd->Mlme.CaliBW20RfR24; + + if (pAd->ate.TxWI.PHYMODE == MODE_CCK) + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, 0x1f); + else + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, 0x08); + } + + // R24, R31, one is for tx, the other is for rx +// ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R24, (UCHAR)RFValue);// todo + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R31, (UCHAR)RFValue); + + // enable RF tuning + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R07, (PUCHAR)&RFValue); + if (Channel <= 14) +// RFValue = (RFValue & 0x37) | 0xCC; + RFValue = 0xd8; //?? to check 3572?? hardcode + else + RFValue = (RFValue & 0x37) | 0x14; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R07, (UCHAR)RFValue); + + // TSSI input band select + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R09, (PUCHAR)&RFValue); + if (Channel <= 14) + { +// RFValue = (RFValue & 0xBF) | 0x40; + RFValue = 0xC3; + } + else + { +// RFValue = (RFValue & 0xBF) | 0x40; + RFValue = 0xC0; + } + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R09, (UCHAR)RFValue); + + // loop filter 1 + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R10, (UCHAR)0xF1); + + // loop filter 2 + if (Channel <= 14) + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R11, (UCHAR)0xB9); + else + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R11, (UCHAR)0x00); + + // tx_mx2_ic + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R15, (PUCHAR)&RFValue); + if (Channel <= 14) + RFValue = (RFValue & 0x8F) | 0x50; + else + RFValue = (RFValue & 0x8F) | 0x50; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R15, (UCHAR)RFValue); + +#ifdef HUAWEI_ATE + /* This is supposed just for rt3062 now. */ + if ((Channel == 1) && (pAd->ate.TxWI.PHYMODE == MODE_CCK)) + { + RFValue = 0x68; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R12, RFValue); + } +#endif // HUAWEI_ATE // + + // tx_mx1_ic +// ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R16, (PUCHAR)&RFValue); + if (Channel <= 14) + { + RFValue = 0x4c; + // clear bit [2:0] + RFValue &= (~0x7); + RFValue |= pAd->TxMixerGain24G; + } + else + { + RFValue = 0x7a; + // clear bit [2:0] + RFValue &= (~0x7); + RFValue |= pAd->TxMixerGain5G; + } + + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R16, (UCHAR)RFValue); + + // tx_lo1 +// if (Channel <= 14) +// ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R17, (UCHAR)0xB3); +// else + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R17, (UCHAR)0x23); + + // tx_lo2 + RFValue = ((Channel <= 14) ? (0x93) : ((Channel <= 64) ? (0xb7) : ((Channel <= 128) ? (0x74) : (0x72)))); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R19, (UCHAR)RFValue); + + // rx_l01 + RFValue = ((Channel <= 14) ? (0xB3) : ((Channel <= 64) ? (0xF6) : ((Channel <= 128) ? (0xF4) : (0xF3)))); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R20, (UCHAR)RFValue); + + // pfd_delay + RFValue = ((Channel <= 14) ? (0x15) : ((Channel <= 64) ? (0x3d) : ((Channel <= 128) ? (0x01) : (0x01)))); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R25, (UCHAR)RFValue); + + // rx_lo2 + if (Channel <= 14) + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R26, (UCHAR)0x85); + else + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R26, (UCHAR)0x87); + + // drv_cc + if (Channel <= 14) + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R29, (UCHAR)0x9B); + else + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R29, (UCHAR)0x9F); + + // GPIO 7 for RT3572/3562/3062 + RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value); + + if (Channel <= 14) + Value = ((Value & 0xFFFF7FFF) | 0x00000080); + else + Value = (Value & 0xFFFF7F7F); + + RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value); + + // enable RF tuning, this must be in the last + ATE_RF_IO_READ8_BY_REG_ID(pAd, RF_R07, (PUCHAR)&RFValue); + RFValue = RFValue | 0x1; + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R07, (UCHAR)RFValue); + + RTMPusecDelay(2000); + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R08, (UCHAR)0x80); + + // latch channel for future usage + pAd->LatchRfRegs.Channel = Channel; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("RT35xx: SwitchChannel#%d(Pwr0=%d, Pwr1=%d, %dT), N=0x%02X, K=0x%02X, R=0x%02X\n", + Channel, + TxPwer, + TxPwer2, + pAd->Antenna.field.TxPath, + FreqItems3572[index].N, + FreqItems3572[index].K, + FreqItems3572[index].R)); + break; + } + } + } + else +#endif // RT35xx // + { + /* RT28xx */ + RFRegTable = RF2850RegTable; + + switch (pAd->RfIcType) + { + /* But only 2850 and 2750 support 5.5GHz band... */ + case RFIC_2820: + case RFIC_2850: + case RFIC_2720: + case RFIC_2750: + for (index = 0; index < NUM_OF_2850_CHNL; index++) + { + if (Channel == RFRegTable[index].Channel) + { + R2 = RFRegTable[index].R2; + + // If TX path is 1, bit 14 = 1; + if (pAd->Antenna.field.TxPath == 1) + { + R2 |= 0x4000; + } + if (pAd->Antenna.field.TxPath == 2) + { + if (pAd->ate.TxAntennaSel == 1) + { + // If TX Antenna select is 1 , bit 14 = 1; Disable Ant 2 + R2 |= 0x4000; + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue); + BbpValue &= 0xE7; // 11100111B + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue); + } + else if (pAd->ate.TxAntennaSel == 2) + { + // If TX Antenna select is 2 , bit 15 = 1; Disable Ant 1 + R2 |= 0x8000; + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue); + BbpValue &= 0xE7; + BbpValue |= 0x08; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue); + } + else + { + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &BbpValue); + BbpValue &= 0xE7; + BbpValue |= 0x10; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, BbpValue); + } + } + + if (pAd->Antenna.field.RxPath == 2) + { + switch (pAd->ate.RxAntennaSel) + { + case 1: + R2 |= 0x20040; + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x00; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + break; + case 2: + R2 |= 0x10040; + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x01; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + break; + default: + R2 |= 0x40; + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + /* Only enable two Antenna to receive. */ + BbpValue |= 0x08; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + break; + } + } + else if (pAd->Antenna.field.RxPath == 1) + { + // write 1 to off RxPath + R2 |= 0x20040; + } + + if (pAd->Antenna.field.RxPath == 3) + { + switch (pAd->ate.RxAntennaSel) + { + case 1: + R2 |= 0x20040; + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x00; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + break; + case 2: + R2 |= 0x10040; + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x01; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + break; + case 3: + R2 |= 0x30000; + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x02; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + break; + default: + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BbpValue); + BbpValue &= 0xE4; + BbpValue |= 0x10; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BbpValue); + break; + } + } + + if (Channel > 14) + { + // initialize R3, R4 + R3 = (RFRegTable[index].R3 & 0xffffc1ff); + R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->ate.RFFreqOffset << 15); + + /* + According the Rory's suggestion to solve the middle range issue. + + 5.5G band power range : 0xF9~0X0F, TX0 Reg3 bit9/TX1 Reg4 bit6="0" + means the TX power reduce 7dB. + */ + // R3 + if ((TxPwer >= -7) && (TxPwer < 0)) + { + TxPwer = (7+TxPwer); + TxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer); + R3 |= (TxPwer << 10); + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATEAsicSwitchChannel: TxPwer=%d \n", TxPwer)); + } + else + { + TxPwer = (TxPwer > 0xF) ? (0xF) : (TxPwer); + R3 |= (TxPwer << 10) | (1 << 9); + } + + // R4 + if ((TxPwer2 >= -7) && (TxPwer2 < 0)) + { + TxPwer2 = (7+TxPwer2); + TxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2); + R4 |= (TxPwer2 << 7); + ATEDBGPRINT(RT_DEBUG_TRACE, ("ATEAsicSwitchChannel: TxPwer2=%d \n", TxPwer2)); + } + else + { + TxPwer2 = (TxPwer2 > 0xF) ? (0xF) : (TxPwer2); + R4 |= (TxPwer2 << 7) | (1 << 6); + } + } + else + { + // Set TX power0. + R3 = (RFRegTable[index].R3 & 0xffffc1ff) | (TxPwer << 9); + // Set frequency offset and TX power1. + R4 = (RFRegTable[index].R4 & (~0x001f87c0)) | (pAd->ate.RFFreqOffset << 15) | (TxPwer2 <<6); + + } + + // based on BBP current mode before changing RF channel + if (pAd->ate.TxWI.BW == BW_40) + { + R4 |=0x200000; + } + + // Update variables. + pAd->LatchRfRegs.Channel = Channel; + + + pAd->LatchRfRegs.R1 = RFRegTable[index].R1; + pAd->LatchRfRegs.R2 = R2; + pAd->LatchRfRegs.R3 = R3; + pAd->LatchRfRegs.R4 = R4; + + RtmpRfIoWrite(pAd); + + break; + } + } + break; + + default: + break; + } + } + + // Change BBP setting during switch from a->g, g->a + if (Channel <= 14) + { + UINT32 TxPinCfg = 0x00050F0A;// 2007.10.09 by Brian : 0x0005050A ==> 0x00050F0A + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd))); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd))); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd))); + + /* For 1T/2R chip only... */ + if (pAd->NicConfig2.field.ExternalLNAForG) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x62); +#ifdef RT35xx + if (IS_RT3572(pAd)) + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46); +#endif // RT35xx // + } + else + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x84); +#ifdef RT35xx + if (IS_RT3572(pAd)) + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50); +#endif // RT35xx // + } +#ifndef CONFIG_RT2883_FPGA /* to be removed */ + // According the Rory's suggestion to solve the middle range issue. + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R86, &BbpValue); + + ASSERT((BbpValue == 0x00)); + if ((BbpValue != 0x00)) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0x00); + } +#endif // CONFIG_RT2883_FPGA // + + // 5.5 GHz band selection PIN, bit1 and bit2 are complement + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value &= (~0x6); + Value |= (0x04); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + + // Turn off unused PA or LNA when only 1T or 1R. + if (pAd->Antenna.field.TxPath == 1) + { + TxPinCfg &= 0xFFFFFFF3; + } + if (pAd->Antenna.field.RxPath == 1) + { + TxPinCfg &= 0xFFFFF3FF; + } + + /* calibration power unbalance issues */ + if (pAd->Antenna.field.TxPath == 2) + { + if (pAd->ate.TxAntennaSel == 1) + { + TxPinCfg &= 0xFFFFFFF7; + } + else if (pAd->ate.TxAntennaSel == 2) + { + TxPinCfg &= 0xFFFFFFFD; + } + } + + RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg); + } + else + { + UINT32 TxPinCfg = 0x00050F05;// 2007.10.09 by Brian : 0x00050505 ==> 0x00050F05 + + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R62, (0x37 - GET_LNA_GAIN(pAd))); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R63, (0x37 - GET_LNA_GAIN(pAd))); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R64, (0x37 - GET_LNA_GAIN(pAd))); +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + // Rx High power VGA offset for LNA select + if (pAd->NicConfig2.field.ExternalLNAForA) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x94); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x46); + } + else + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0x94); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R75, 0x50); + } + } + else +#endif // RT35xx // + { + + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R82, 0xF2); + } + // According the Rory's suggestion to solve the middle range issue. + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R86, &BbpValue); + + ASSERT((BbpValue == 0x00)); + if ((BbpValue != 0x00)) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R86, 0x00); + } + + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R91, &BbpValue); + ASSERT((BbpValue == 0x04)); + + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R92, &BbpValue); + ASSERT((BbpValue == 0x00)); + + // 5.5 GHz band selection PIN, bit1 and bit2 are complement + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value &= (~0x6); + Value |= (0x02); + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + + // Turn off unused PA or LNA when only 1T or 1R. + if (pAd->Antenna.field.TxPath == 1) + { + TxPinCfg &= 0xFFFFFFF3; + } + if (pAd->Antenna.field.RxPath == 1) + { + TxPinCfg &= 0xFFFFF3FF; + } + + RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg); + } + +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + if (Channel > 14) + { + R66 = 0x22 + (GET_LNA_GAIN(pAd)*5)/3; + } + else + { + R66 = 0x1C + 2*GET_LNA_GAIN(pAd); + } + + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + + if (pAd->ate.TxWI.BW == BW_20) + { + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R31, 0x0f); + } + else + { + ATE_RF_IO_WRITE8_BY_REG_ID(pAd, RF_R31, 0x2f); + } + } +#endif // RT35xx // + +#ifndef RT35xx + // R66 should be set according to Channel and use 20MHz when scanning + if (Channel <= 14) + { + // BG band + R66 = 0x2E + GET_LNA_GAIN(pAd); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + else + { + // 5.5 GHz band + if (pAd->ate.TxWI.BW == BW_20) + { + R66 = (UCHAR)(0x32 + (GET_LNA_GAIN(pAd)*5)/3); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + else + { + R66 = (UCHAR)(0x3A + (GET_LNA_GAIN(pAd)*5)/3); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, R66); + } + } +#endif // !RT35xx // + + /* + On 11A, We should delay and wait RF/BBP to be stable + and the appropriate time should be 1000 micro seconds. + + 2005/06/05 - On 11G, We also need this delay time. Otherwise it's difficult to pass the WHQL. + */ + RTMPusecDelay(1000); + +#ifdef RTMP_RF_RW_SUPPORT + ATEDBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%d, Pwr1=%d, %dT), N=0x%02X, K=0x%02X, R=0x%02X\n", + Channel, + pAd->RfIcType, + TxPwer, + TxPwer2, + pAd->Antenna.field.TxPath, + FreqItems3020[index].N, + FreqItems3020[index].K, + FreqItems3020[index].R)); +#endif // RTMP_RF_RW_SUPPORT // +#ifndef RTMP_RF_RW_SUPPORT + if (Channel > 14) + { + // When 5.5GHz band the LSB of TxPwr will be used to reduced 7dB or not. + ATEDBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, %dT) to , R1=0x%08lx, R2=0x%08lx, R3=0x%08lx, R4=0x%08lx\n", + Channel, + pAd->RfIcType, + pAd->Antenna.field.TxPath, + pAd->LatchRfRegs.R1, + pAd->LatchRfRegs.R2, + pAd->LatchRfRegs.R3, + pAd->LatchRfRegs.R4)); + } + else + { + ATEDBGPRINT(RT_DEBUG_TRACE, ("SwitchChannel#%d(RF=%d, Pwr0=%u, Pwr1=%u, %dT) to , R1=0x%08lx, R2=0x%08lx, R3=0x%08lx, R4=0x%08lx\n", + Channel, + pAd->RfIcType, + (R3 & 0x00003e00) >> 9, + (R4 & 0x000007c0) >> 6, + pAd->Antenna.field.TxPath, + pAd->LatchRfRegs.R1, + pAd->LatchRfRegs.R2, + pAd->LatchRfRegs.R3, + pAd->LatchRfRegs.R4)); + } +#endif // RTMP_RF_RW_SUPPORT // +} + + + +/* In fact, no one will call this routine so far ! */ + +/* +========================================================================== + Description: + Gives CCK TX rate 2 more dB TX power. + This routine works only in ATE mode. + + calculate desired Tx power in RF R3.Tx0~5, should consider - + 0. if current radio is a noisy environment (pAd->DrsCounters.fNoisyEnvironment) + 1. TxPowerPercentage + 2. auto calibration based on TSSI feedback + 3. extra 2 db for CCK + 4. -10 db upon very-short distance (AvgRSSI >= -40db) to AP + + NOTE: Since this routine requires the value of (pAd->DrsCounters.fNoisyEnvironment), + it should be called AFTER MlmeDynamicTxRateSwitching() +========================================================================== +*/ +VOID ATEAsicAdjustTxPower( + IN PRTMP_ADAPTER pAd) +{ + INT i, j; + CHAR DeltaPwr = 0; + BOOLEAN bAutoTxAgc = FALSE; + UCHAR TssiRef, *pTssiMinusBoundary, *pTssiPlusBoundary, TxAgcStep; + UCHAR BbpR49 = 0, idx; + PCHAR pTxAgcCompensate; + ULONG TxPwr[5]; + CHAR Value; + + /* no one calls this procedure so far */ + if (pAd->ate.TxWI.BW == BW_40) + { + if (pAd->ate.Channel > 14) + { + TxPwr[0] = pAd->Tx40MPwrCfgABand[0]; + TxPwr[1] = pAd->Tx40MPwrCfgABand[1]; + TxPwr[2] = pAd->Tx40MPwrCfgABand[2]; + TxPwr[3] = pAd->Tx40MPwrCfgABand[3]; + TxPwr[4] = pAd->Tx40MPwrCfgABand[4]; + } + else + { + TxPwr[0] = pAd->Tx40MPwrCfgGBand[0]; + TxPwr[1] = pAd->Tx40MPwrCfgGBand[1]; + TxPwr[2] = pAd->Tx40MPwrCfgGBand[2]; + TxPwr[3] = pAd->Tx40MPwrCfgGBand[3]; + TxPwr[4] = pAd->Tx40MPwrCfgGBand[4]; + } + } + else + { + if (pAd->ate.Channel > 14) + { + TxPwr[0] = pAd->Tx20MPwrCfgABand[0]; + TxPwr[1] = pAd->Tx20MPwrCfgABand[1]; + TxPwr[2] = pAd->Tx20MPwrCfgABand[2]; + TxPwr[3] = pAd->Tx20MPwrCfgABand[3]; + TxPwr[4] = pAd->Tx20MPwrCfgABand[4]; + } + else + { + TxPwr[0] = pAd->Tx20MPwrCfgGBand[0]; + TxPwr[1] = pAd->Tx20MPwrCfgGBand[1]; + TxPwr[2] = pAd->Tx20MPwrCfgGBand[2]; + TxPwr[3] = pAd->Tx20MPwrCfgGBand[3]; + TxPwr[4] = pAd->Tx20MPwrCfgGBand[4]; + } + } + + // TX power compensation for temperature variation based on TSSI. + // Do it per 4 seconds. + if (pAd->Mlme.OneSecPeriodicRound % 4 == 0) + { + if (pAd->ate.Channel <= 14) + { + /* bg channel */ + bAutoTxAgc = pAd->bAutoTxAgcG; + TssiRef = pAd->TssiRefG; + pTssiMinusBoundary = &pAd->TssiMinusBoundaryG[0]; + pTssiPlusBoundary = &pAd->TssiPlusBoundaryG[0]; + TxAgcStep = pAd->TxAgcStepG; + pTxAgcCompensate = &pAd->TxAgcCompensateG; + } + else + { + /* a channel */ + bAutoTxAgc = pAd->bAutoTxAgcA; + TssiRef = pAd->TssiRefA; + pTssiMinusBoundary = &pAd->TssiMinusBoundaryA[0]; + pTssiPlusBoundary = &pAd->TssiPlusBoundaryA[0]; + TxAgcStep = pAd->TxAgcStepA; + pTxAgcCompensate = &pAd->TxAgcCompensateA; + } + + if (bAutoTxAgc) + { + /* BbpR49 is unsigned char. */ + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R49, &BbpR49); + + /* (p) TssiPlusBoundaryG[0] = 0 = (m) TssiMinusBoundaryG[0] */ + /* compensate: +4 +3 +2 +1 0 -1 -2 -3 -4 * steps */ + /* step value is defined in pAd->TxAgcStepG for tx power value */ + + /* [4]+1+[4] p4 p3 p2 p1 o1 m1 m2 m3 m4 */ + /* ex: 0x00 0x15 0x25 0x45 0x88 0xA0 0xB5 0xD0 0xF0 + above value are examined in mass factory production */ + /* [4] [3] [2] [1] [0] [1] [2] [3] [4] */ + + /* plus is 0x10 ~ 0x40, minus is 0x60 ~ 0x90 */ + /* if value is between p1 ~ o1 or o1 ~ s1, no need to adjust tx power */ + /* if value is 0x65, tx power will be -= TxAgcStep*(2-1) */ + + if (BbpR49 > pTssiMinusBoundary[1]) + { + // Reading is larger than the reference value. + // Check for how large we need to decrease the Tx power. + for (idx = 1; idx < 5; idx++) + { + // Found the range. + if (BbpR49 <= pTssiMinusBoundary[idx]) + break; + } + + // The index is the step we should decrease, idx = 0 means there is nothing to compensate. +// if (R3 > (ULONG) (TxAgcStep * (idx-1))) + *pTxAgcCompensate = -(TxAgcStep * (idx-1)); +// else +// *pTxAgcCompensate = -((UCHAR)R3); + + DeltaPwr += (*pTxAgcCompensate); + ATEDBGPRINT(RT_DEBUG_TRACE, ("-- Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = -%d\n", + BbpR49, TssiRef, TxAgcStep, idx-1)); + } + else if (BbpR49 < pTssiPlusBoundary[1]) + { + // Reading is smaller than the reference value. + // Check for how large we need to increase the Tx power. + for (idx = 1; idx < 5; idx++) + { + // Found the range. + if (BbpR49 >= pTssiPlusBoundary[idx]) + break; + } + + // The index is the step we should increase, idx = 0 means there is nothing to compensate. + *pTxAgcCompensate = TxAgcStep * (idx-1); + DeltaPwr += (*pTxAgcCompensate); + ATEDBGPRINT(RT_DEBUG_TRACE, ("++ Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\n", + BbpR49, TssiRef, TxAgcStep, idx-1)); + } + else + { + *pTxAgcCompensate = 0; + ATEDBGPRINT(RT_DEBUG_TRACE, (" Tx Power, BBP R1=%x, TssiRef=%x, TxAgcStep=%x, step = +%d\n", + BbpR49, TssiRef, TxAgcStep, 0)); + } + } + } + else + { + if (pAd->ate.Channel <= 14) + { + bAutoTxAgc = pAd->bAutoTxAgcG; + pTxAgcCompensate = &pAd->TxAgcCompensateG; + } + else + { + bAutoTxAgc = pAd->bAutoTxAgcA; + pTxAgcCompensate = &pAd->TxAgcCompensateA; + } + + if (bAutoTxAgc) + DeltaPwr += (*pTxAgcCompensate); + } + + /* Calculate delta power based on the percentage specified from UI. */ + // E2PROM setting is calibrated for maximum TX power (i.e. 100%) + // We lower TX power here according to the percentage specified from UI. + if (pAd->CommonCfg.TxPowerPercentage == 0xffffffff) // AUTO TX POWER control + ; + else if (pAd->CommonCfg.TxPowerPercentage > 90) // 91 ~ 100% & AUTO, treat as 100% in terms of mW + ; + else if (pAd->CommonCfg.TxPowerPercentage > 60) // 61 ~ 90%, treat as 75% in terms of mW + { + DeltaPwr -= 1; + } + else if (pAd->CommonCfg.TxPowerPercentage > 30) // 31 ~ 60%, treat as 50% in terms of mW + { + DeltaPwr -= 3; + } + else if (pAd->CommonCfg.TxPowerPercentage > 15) // 16 ~ 30%, treat as 25% in terms of mW + { + DeltaPwr -= 6; + } + else if (pAd->CommonCfg.TxPowerPercentage > 9) // 10 ~ 15%, treat as 12.5% in terms of mW + { + DeltaPwr -= 9; + } + else // 0 ~ 9 %, treat as MIN(~3%) in terms of mW + { + DeltaPwr -= 12; + } + + /* Reset different new tx power for different TX rate. */ + for (i=0; i<5; i++) + { + if (TxPwr[i] != 0xffffffff) + { + for (j=0; j<8; j++) + { + Value = (CHAR)((TxPwr[i] >> j*4) & 0x0F); /* 0 ~ 15 */ + + if ((Value + DeltaPwr) < 0) + { + Value = 0; /* min */ + } + else if ((Value + DeltaPwr) > 0xF) + { + Value = 0xF; /* max */ + } + else + { + Value += DeltaPwr; /* temperature compensation */ + } + + /* fill new value to CSR offset */ + TxPwr[i] = (TxPwr[i] & ~(0x0000000F << j*4)) | (Value << j*4); + } + + /* write tx power value to CSR */ + /* TX_PWR_CFG_0 (8 tx rate) for TX power for OFDM 12M/18M + TX power for OFDM 6M/9M + TX power for CCK5.5M/11M + TX power for CCK1M/2M */ + /* TX_PWR_CFG_1 ~ TX_PWR_CFG_4 */ + RTMP_IO_WRITE32(pAd, TX_PWR_CFG_0 + i*4, TxPwr[i]); + + + } + } + +} + + +/* +======================================================================== + Routine Description: + Write TxWI for ATE mode. + + Return Value: + None +======================================================================== +*/ +#ifdef RTMP_MAC_PCI +static VOID ATEWriteTxWI( + IN PRTMP_ADAPTER pAd, + IN PTXWI_STRUC pOutTxWI, + IN BOOLEAN FRAG, + IN BOOLEAN CFACK, + IN BOOLEAN InsTimestamp, + IN BOOLEAN AMPDU, + IN BOOLEAN Ack, + IN BOOLEAN NSeq, // HW new a sequence. + IN UCHAR BASize, + IN UCHAR WCID, + IN ULONG Length, + IN UCHAR PID, + IN UCHAR TID, + IN UCHAR TxRate, + IN UCHAR Txopmode, + IN BOOLEAN CfAck, + IN HTTRANSMIT_SETTING *pTransmit) +{ + TXWI_STRUC TxWI; + PTXWI_STRUC pTxWI; + + // + // Always use Long preamble before verifiation short preamble functionality works well. + // Todo: remove the following line if short preamble functionality works + // + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); + NdisZeroMemory(&TxWI, TXWI_SIZE); + pTxWI = &TxWI; + + pTxWI->FRAG= FRAG; + + pTxWI->CFACK = CFACK; + pTxWI->TS= InsTimestamp; + pTxWI->AMPDU = AMPDU; + pTxWI->ACK = Ack; + pTxWI->txop= Txopmode; + + pTxWI->NSEQ = NSeq; + + // John tune the performace with Intel Client in 20 MHz performance + if ( BASize >7 ) + BASize =7; + + pTxWI->BAWinSize = BASize; + pTxWI->WirelessCliID = WCID; + pTxWI->MPDUtotalByteCount = Length; + pTxWI->PacketId = PID; + + // If CCK or OFDM, BW must be 20 + pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); + pTxWI->ShortGI = pTransmit->field.ShortGI; + pTxWI->STBC = pTransmit->field.STBC; + + pTxWI->MCS = pTransmit->field.MCS; + pTxWI->PHYMODE = pTransmit->field.MODE; + pTxWI->CFACK = CfAck; + pTxWI->MIMOps = 0; + pTxWI->MpduDensity = 0; + + pTxWI->PacketId = pTxWI->MCS; + NdisMoveMemory(pOutTxWI, &TxWI, sizeof(TXWI_STRUC)); + + return; +} +#endif // RTMP_MAC_PCI // + + + + +/* +======================================================================== + + Routine Description: + Disable protection for ATE. +======================================================================== +*/ +VOID ATEDisableAsicProtect( + IN PRTMP_ADAPTER pAd) +{ + PROT_CFG_STRUC ProtCfg, ProtCfg4; + UINT32 Protect[6]; + USHORT offset; + UCHAR i; + UINT32 MacReg = 0; + + // Config ASIC RTS threshold register + RTMP_IO_READ32(pAd, TX_RTS_CFG, &MacReg); + MacReg &= 0xFF0000FF; + MacReg |= (0xFFF << 8); + RTMP_IO_WRITE32(pAd, TX_RTS_CFG, MacReg); + + // Initial common protection settings + RTMPZeroMemory(Protect, sizeof(Protect)); + ProtCfg4.word = 0; + ProtCfg.word = 0; + ProtCfg.field.TxopAllowGF40 = 1; + ProtCfg.field.TxopAllowGF20 = 1; + ProtCfg.field.TxopAllowMM40 = 1; + ProtCfg.field.TxopAllowMM20 = 1; + ProtCfg.field.TxopAllowOfdm = 1; + ProtCfg.field.TxopAllowCck = 1; + ProtCfg.field.RTSThEn = 1; + ProtCfg.field.ProtectNav = ASIC_SHORTNAV; + + // Handle legacy(B/G) protection + ProtCfg.field.ProtectRate = pAd->CommonCfg.RtsRate; + ProtCfg.field.ProtectCtrl = 0; + Protect[0] = ProtCfg.word; + Protect[1] = ProtCfg.word; + /* CTS-self is not used */ + pAd->FlgCtsEnabled = 0; + + // NO PROTECT + // 1.All STAs in the BSS are 20/40 MHz HT + // 2. in ai 20/40MHz BSS + // 3. all STAs are 20MHz in a 20MHz BSS + // Pure HT. no protection. + + // MM20_PROT_CFG + // Reserved (31:27) + // PROT_TXOP(25:20) -- 010111 + // PROT_NAV(19:18) -- 01 (Short NAV protection) + // PROT_CTRL(17:16) -- 00 (None) + // PROT_RATE(15:0) -- 0x4004 (OFDM 24M) + Protect[2] = 0x01744004; + + // MM40_PROT_CFG + // Reserved (31:27) + // PROT_TXOP(25:20) -- 111111 + // PROT_NAV(19:18) -- 01 (Short NAV protection) + // PROT_CTRL(17:16) -- 00 (None) + // PROT_RATE(15:0) -- 0x4084 (duplicate OFDM 24M) + Protect[3] = 0x03f44084; + + // CF20_PROT_CFG + // Reserved (31:27) + // PROT_TXOP(25:20) -- 010111 + // PROT_NAV(19:18) -- 01 (Short NAV protection) + // PROT_CTRL(17:16) -- 00 (None) + // PROT_RATE(15:0) -- 0x4004 (OFDM 24M) + Protect[4] = 0x01744004; + + // CF40_PROT_CFG + // Reserved (31:27) + // PROT_TXOP(25:20) -- 111111 + // PROT_NAV(19:18) -- 01 (Short NAV protection) + // PROT_CTRL(17:16) -- 00 (None) + // PROT_RATE(15:0) -- 0x4084 (duplicate OFDM 24M) + Protect[5] = 0x03f44084; + + pAd->CommonCfg.IOTestParm.bRTSLongProtOn = FALSE; + + offset = CCK_PROT_CFG; + for (i = 0;i < 6;i++) + RTMP_IO_WRITE32(pAd, offset + i*4, Protect[i]); + +} + + + + +/* There are two ways to convert Rssi */ +/* the way used with GET_LNA_GAIN() */ +CHAR ATEConvertToRssi( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi, + IN UCHAR RssiNumber) +{ + UCHAR RssiOffset, LNAGain; + + // Rssi equals to zero should be an invalid value + if (Rssi == 0) + return -99; + + LNAGain = GET_LNA_GAIN(pAd); + if (pAd->LatchRfRegs.Channel > 14) + { + if (RssiNumber == 0) + RssiOffset = pAd->ARssiOffset0; + else if (RssiNumber == 1) + RssiOffset = pAd->ARssiOffset1; + else + RssiOffset = pAd->ARssiOffset2; + } + else + { + if (RssiNumber == 0) + RssiOffset = pAd->BGRssiOffset0; + else if (RssiNumber == 1) + RssiOffset = pAd->BGRssiOffset1; + else + RssiOffset = pAd->BGRssiOffset2; + } + + return (-12 - RssiOffset - LNAGain - Rssi); +} + + +/* +======================================================================== + + Routine Description: + Set Japan filter coefficients if needed. + Note: + This routine should only be called when + entering TXFRAME mode or TXCONT mode. + +======================================================================== +*/ +static VOID SetJapanFilter( + IN PRTMP_ADAPTER pAd) +{ + UCHAR BbpData = 0; + + // + // If Channel=14 and Bandwidth=20M and Mode=CCK, set BBP R4 bit5=1 + // (Japan Tx filter coefficients)when (TXFRAME or TXCONT). + // + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BbpData); + + if ((pAd->ate.TxWI.PHYMODE == MODE_CCK) && (pAd->ate.Channel == 14) && (pAd->ate.TxWI.BW == BW_20)) + { + BbpData |= 0x20; // turn on + ATEDBGPRINT(RT_DEBUG_TRACE, ("SetJapanFilter!!!\n")); + } + else + { + BbpData &= 0xdf; // turn off + ATEDBGPRINT(RT_DEBUG_TRACE, ("ClearJapanFilter!!!\n")); + } + + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BbpData); +} + + +VOID ATESampleRssi( + IN PRTMP_ADAPTER pAd, + IN PRXWI_STRUC pRxWI) +{ + /* There are two ways to collect RSSI. */ +// pAd->LastRxRate = (USHORT)((pRxWI->MCS) + (pRxWI->BW <<7) + (pRxWI->ShortGI <<8)+ (pRxWI->PHYMODE <<14)) ; + if (pRxWI->RSSI0 != 0) + { + pAd->ate.LastRssi0 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI0, RSSI_0); + pAd->ate.AvgRssi0X8 = (pAd->ate.AvgRssi0X8 - pAd->ate.AvgRssi0) + pAd->ate.LastRssi0; + pAd->ate.AvgRssi0 = pAd->ate.AvgRssi0X8 >> 3; + } + if (pRxWI->RSSI1 != 0) + { + pAd->ate.LastRssi1 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI1, RSSI_1); + pAd->ate.AvgRssi1X8 = (pAd->ate.AvgRssi1X8 - pAd->ate.AvgRssi1) + pAd->ate.LastRssi1; + pAd->ate.AvgRssi1 = pAd->ate.AvgRssi1X8 >> 3; + } + if (pRxWI->RSSI2 != 0) + { + pAd->ate.LastRssi2 = ATEConvertToRssi(pAd, (CHAR) pRxWI->RSSI2, RSSI_2); + pAd->ate.AvgRssi2X8 = (pAd->ate.AvgRssi2X8 - pAd->ate.AvgRssi2) + pAd->ate.LastRssi2; + pAd->ate.AvgRssi2 = pAd->ate.AvgRssi2X8 >> 3; + } + + pAd->ate.LastSNR0 = (CHAR)(pRxWI->SNR0);// CHAR ==> UCHAR ? + pAd->ate.LastSNR1 = (CHAR)(pRxWI->SNR1);// CHAR ==> UCHAR ? + + pAd->ate.NumOfAvgRssiSample ++; +} + + +#ifdef CONFIG_STA_SUPPORT +VOID RTMPStationStop( + IN PRTMP_ADAPTER pAd) +{ +// BOOLEAN Cancelled; + + ATEDBGPRINT(RT_DEBUG_TRACE, ("==> RTMPStationStop\n")); + + // For rx statistics, we need to keep this timer running. +// RTMPCancelTimer(&pAd->Mlme.PeriodicTimer, &Cancelled); + + ATEDBGPRINT(RT_DEBUG_TRACE, ("<== RTMPStationStop\n")); +} + + +VOID RTMPStationStart( + IN PRTMP_ADAPTER pAd) +{ + ATEDBGPRINT(RT_DEBUG_TRACE, ("==> RTMPStationStart\n")); + +#ifdef RTMP_MAC_PCI + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + + /* We did not cancel this timer when entering ATE mode. */ +// RTMPSetTimer(&pAd->Mlme.PeriodicTimer, MLME_TASK_EXEC_INTV); +#endif // RTMP_MAC_PCI // + + ATEDBGPRINT(RT_DEBUG_TRACE, ("<== RTMPStationStart\n")); +} +#endif // CONFIG_STA_SUPPORT // + + +/* +========================================================================== + Description: + Setup Frame format. + NOTE: + This routine should only be used in ATE mode. +========================================================================== +*/ +#ifdef RTMP_MAC_PCI +static INT ATESetUpFrame( + IN PRTMP_ADAPTER pAd, + IN UINT32 TxIdx) +{ + UINT j; + PTXD_STRUC pTxD; +#ifdef RT_BIG_ENDIAN + PTXD_STRUC pDestTxD; + TXD_STRUC TxD; +#endif + PNDIS_PACKET pPacket; + PUCHAR pDest; + PVOID AllocVa; + NDIS_PHYSICAL_ADDRESS AllocPa; + HTTRANSMIT_SETTING TxHTPhyMode; + + PRTMP_TX_RING pTxRing = &pAd->TxRing[QID_AC_BE]; + PTXWI_STRUC pTxWI = (PTXWI_STRUC) pTxRing->Cell[TxIdx].DmaBuf.AllocVa; + PUCHAR pDMAHeaderBufVA = (PUCHAR) pTxRing->Cell[TxIdx].DmaBuf.AllocVa; + +#ifdef RALINK_28xx_QA + PHEADER_802_11 pHeader80211; +#endif // RALINK_28xx_QA // + + if (pAd->ate.bQATxStart == TRUE) + { + // always use QID_AC_BE and FIFO_EDCA + + // fill TxWI + TxHTPhyMode.field.BW = pAd->ate.TxWI.BW; + TxHTPhyMode.field.ShortGI = pAd->ate.TxWI.ShortGI; + TxHTPhyMode.field.STBC = 0; + TxHTPhyMode.field.MCS = pAd->ate.TxWI.MCS; + TxHTPhyMode.field.MODE = pAd->ate.TxWI.PHYMODE; + + ATEWriteTxWI(pAd, pTxWI, pAd->ate.TxWI.FRAG, pAd->ate.TxWI.CFACK, + pAd->ate.TxWI.TS, pAd->ate.TxWI.AMPDU, pAd->ate.TxWI.ACK, pAd->ate.TxWI.NSEQ, + pAd->ate.TxWI.BAWinSize, 0, pAd->ate.TxWI.MPDUtotalByteCount, pAd->ate.TxWI.PacketId, 0, 0, + pAd->ate.TxWI.txop/*IFS_HTTXOP*/, pAd->ate.TxWI.CFACK/*FALSE*/, &TxHTPhyMode); + + /* It will affect transmit data rate ??? But QA is tested... */ + } + else + { + TxHTPhyMode.field.BW = pAd->ate.TxWI.BW; + TxHTPhyMode.field.ShortGI = pAd->ate.TxWI.ShortGI; + TxHTPhyMode.field.STBC = 0; + TxHTPhyMode.field.MCS = pAd->ate.TxWI.MCS; + TxHTPhyMode.field.MODE = pAd->ate.TxWI.PHYMODE; + ATEWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, + 4, 0, pAd->ate.TxLength, 0, 0, 0, IFS_HTTXOP, FALSE, &TxHTPhyMode); + } + + // fill 802.11 header +#ifdef RALINK_28xx_QA + if (pAd->ate.bQATxStart == TRUE) + { + NdisMoveMemory(pDMAHeaderBufVA+TXWI_SIZE, pAd->ate.Header, pAd->ate.HLen); + } + else +#endif // RALINK_28xx_QA // + { + NdisMoveMemory(pDMAHeaderBufVA+TXWI_SIZE, TemplateFrame, LENGTH_802_11); + NdisMoveMemory(pDMAHeaderBufVA+TXWI_SIZE+4, pAd->ate.Addr1, ETH_LENGTH_OF_ADDRESS); + NdisMoveMemory(pDMAHeaderBufVA+TXWI_SIZE+10, pAd->ate.Addr2, ETH_LENGTH_OF_ADDRESS); + NdisMoveMemory(pDMAHeaderBufVA+TXWI_SIZE+16, pAd->ate.Addr3, ETH_LENGTH_OF_ADDRESS); + } + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (((PUCHAR)pDMAHeaderBufVA)+TXWI_SIZE), DIR_READ, FALSE); +#endif // RT_BIG_ENDIAN // + + /* alloc buffer for payload */ +#ifdef RALINK_28xx_QA + if (pAd->ate.bQATxStart == TRUE) + { + pPacket = RTMP_AllocateRxPacketBuffer(pAd, pAd->ate.DLen + 0x100, FALSE, &AllocVa, &AllocPa); + } + else +#endif // RALINK_28xx_QA // + { + pPacket = RTMP_AllocateRxPacketBuffer(pAd, pAd->ate.TxLength, FALSE, &AllocVa, &AllocPa); + } + + if (pPacket == NULL) + { + pAd->ate.TxCount = 0; + ATEDBGPRINT(RT_DEBUG_TRACE, ("%s fail to alloc packet space.\n", __FUNCTION__)); + return -1; + } + pTxRing->Cell[TxIdx].pNextNdisPacket = pPacket; + + pDest = (PUCHAR) AllocVa; + +#ifdef RALINK_28xx_QA + if (pAd->ate.bQATxStart == TRUE) + { + GET_OS_PKT_LEN(pPacket) = pAd->ate.DLen; + } + else +#endif // RALINK_28xx_QA // + { + GET_OS_PKT_LEN(pPacket) = pAd->ate.TxLength - LENGTH_802_11; + } + + // prepare frame payload +#ifdef RALINK_28xx_QA + if (pAd->ate.bQATxStart == TRUE) + { + // copy pattern + if ((pAd->ate.PLen != 0)) + { + int j; + + for (j = 0; j < pAd->ate.DLen; j+=pAd->ate.PLen) + { + memcpy(GET_OS_PKT_DATAPTR(pPacket) + j, pAd->ate.Pattern, pAd->ate.PLen); + } + } + } + else +#endif // RALINK_28xx_QA // + { + for(j = 0; j < GET_OS_PKT_LEN(pPacket); j++) + pDest[j] = 0xA5; + } + + /* build Tx Descriptor */ +#ifndef RT_BIG_ENDIAN + pTxD = (PTXD_STRUC) pTxRing->Cell[TxIdx].AllocVa; +#else + pDestTxD = (PTXD_STRUC)pTxRing->Cell[TxIdx].AllocVa; + TxD = *pDestTxD; + pTxD = &TxD; +#endif // !RT_BIG_ENDIAN // + +#ifdef RALINK_28xx_QA + if (pAd->ate.bQATxStart == TRUE) + { + // prepare TxD + NdisZeroMemory(pTxD, TXD_SIZE); + RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA); + // build TX DESC + pTxD->SDPtr0 = RTMP_GetPhysicalAddressLow(pTxRing->Cell[TxIdx].DmaBuf.AllocPa); + pTxD->SDLen0 = TXWI_SIZE + pAd->ate.HLen; + pTxD->LastSec0 = 0; + pTxD->SDPtr1 = AllocPa; + pTxD->SDLen1 = GET_OS_PKT_LEN(pPacket); + pTxD->LastSec1 = 1; + + pDest = (PUCHAR)pTxWI; + pDest += TXWI_SIZE; + pHeader80211 = (PHEADER_802_11)pDest; + + // modify sequence number... + if (pAd->ate.TxDoneCount == 0) + { + pAd->ate.seq = pHeader80211->Sequence; + } + else + pHeader80211->Sequence = ++pAd->ate.seq; + } + else +#endif // RALINK_28xx_QA // + { + NdisZeroMemory(pTxD, TXD_SIZE); + RTMPWriteTxDescriptor(pAd, pTxD, FALSE, FIFO_EDCA); + // build TX DESC + pTxD->SDPtr0 = RTMP_GetPhysicalAddressLow (pTxRing->Cell[TxIdx].DmaBuf.AllocPa); + pTxD->SDLen0 = TXWI_SIZE + LENGTH_802_11; + pTxD->LastSec0 = 0; + pTxD->SDPtr1 = AllocPa; + pTxD->SDLen1 = GET_OS_PKT_LEN(pPacket); + pTxD->LastSec1 = 1; + } + +#ifdef RT_BIG_ENDIAN + RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI); + RTMPFrameEndianChange(pAd, (((PUCHAR)pDMAHeaderBufVA)+TXWI_SIZE), DIR_WRITE, FALSE); + RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); + WriteBackToDescriptor((PUCHAR)pDestTxD, (PUCHAR)pTxD, FALSE, TYPE_TXD); +#endif // RT_BIG_ENDIAN // + + return 0; +} + +#ifdef RT35xx +/* +======================================================================== + + Routine Description: 3062/3562 R66 writing must select BBP_R27 + + Arguments: + + Return Value: + + Note: + +======================================================================== +*/ +NTSTATUS ATE_RT3562WriteBBPR66( + IN PRTMP_ADAPTER pAd, + IN UCHAR Value) +{ + NTSTATUS NStatus = STATUS_UNSUCCESSFUL; + UCHAR BBPData = 0; + + if (!IS_RT3572(pAd)) + return NStatus; + + ATEPCIReadBBPRegister(pAd, BBP_R27, &BBPData); + + // R66 controls the gain of Rx0 + BBPData &= ~(0x60);// clear bit 5,6 + ATEPCIWriteBBPRegister(pAd, BBP_R27, BBPData); + ATEPCIWriteBBPRegister(pAd, BBP_R66, Value); + + // R66 controls the gain of Rx1 + BBPData |= 0x20;// set bit 5 + ATEPCIWriteBBPRegister(pAd, BBP_R27, BBPData); + ATEPCIWriteBBPRegister(pAd, BBP_R66, Value); + NStatus = STATUS_SUCCESS; + + return NStatus; +} +#endif // RT35xx // +/*=======================End of RTMP_MAC_PCI =======================*/ +#endif // RTMP_MAC_PCI // + + + + +VOID rt_ee_read_all(PRTMP_ADAPTER pAd, USHORT *Data) +{ + USHORT i; + USHORT value; + + + for (i = 0 ; i < EEPROM_SIZE/2 ; ) + { + /* "value" is especially for some compilers... */ + RT28xx_EEPROM_READ16(pAd, i*2, value); + Data[i] = value; + i++; + } +} + + +VOID rt_ee_write_all(PRTMP_ADAPTER pAd, USHORT *Data) +{ + USHORT i; + USHORT value; + + + for (i = 0 ; i < EEPROM_SIZE/2 ; ) + { + /* "value" is especially for some compilers... */ + value = Data[i]; + RT28xx_EEPROM_WRITE16(pAd, i*2, value); + i++; + } +} + + +#ifdef RALINK_28xx_QA +VOID ATE_QA_Statistics( + IN PRTMP_ADAPTER pAd, + IN PRXWI_STRUC pRxWI, + IN PRT28XX_RXD_STRUC pRxD, + IN PHEADER_802_11 pHeader) +{ + // update counter first + if (pHeader != NULL) + { + if (pHeader->FC.Type == BTYPE_DATA) + { + if (pRxD->U2M) + pAd->ate.U2M++; + else + pAd->ate.OtherData++; + } + else if (pHeader->FC.Type == BTYPE_MGMT) + { + if (pHeader->FC.SubType == SUBTYPE_BEACON) + pAd->ate.Beacon++; + else + pAd->ate.OtherCount++; + } + else if (pHeader->FC.Type == BTYPE_CNTL) + { + pAd->ate.OtherCount++; + } + } + pAd->ate.RSSI0 = pRxWI->RSSI0; + pAd->ate.RSSI1 = pRxWI->RSSI1; + pAd->ate.RSSI2 = pRxWI->RSSI2; + pAd->ate.SNR0 = pRxWI->SNR0; + pAd->ate.SNR1 = pRxWI->SNR1; +} + + + +VOID RtmpDoAte( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq) +{ + USHORT Command_Id; + INT Status = NDIS_STATUS_SUCCESS; + struct ate_racfghdr *pRaCfg; + + + if ((pRaCfg = kmalloc(sizeof(struct ate_racfghdr), GFP_KERNEL)) == NULL) + { + Status = -EINVAL; + return; + } + + NdisZeroMemory(pRaCfg, sizeof(struct ate_racfghdr)); + + if (copy_from_user((PUCHAR)pRaCfg, wrq->u.data.pointer, wrq->u.data.length)) + { + Status = -EFAULT; + + kfree(pRaCfg); + return; + } + + Command_Id = ntohs(pRaCfg->command_id); + + ATEDBGPRINT(RT_DEBUG_TRACE,("\n%s: Command_Id = 0x%04x !\n", __FUNCTION__, Command_Id)); + + switch (Command_Id) + { + /* We will get this command when QA starts. */ + case RACFG_CMD_ATE_START: + Status=DO_RACFG_CMD_ATE_START(pAdapter,wrq,pRaCfg); + break; + + /* We will get this command either QA is closed or ated is killed by user. */ + case RACFG_CMD_ATE_STOP: + Status=DO_RACFG_CMD_ATE_STOP(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_RF_WRITE_ALL: + Status=DO_RACFG_CMD_RF_WRITE_ALL(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_E2PROM_READ16: + Status=DO_RACFG_CMD_E2PROM_READ16(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_E2PROM_WRITE16: + Status=DO_RACFG_CMD_E2PROM_WRITE16(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_E2PROM_READ_ALL: + Status=DO_RACFG_CMD_E2PROM_READ_ALL(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_E2PROM_WRITE_ALL: + Status=DO_RACFG_CMD_E2PROM_WRITE_ALL(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_IO_READ: + Status=DO_RACFG_CMD_IO_READ(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_IO_WRITE: + Status=DO_RACFG_CMD_IO_WRITE(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_IO_READ_BULK: + Status=DO_RACFG_CMD_IO_READ_BULK(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_BBP_READ8: + Status=DO_RACFG_CMD_BBP_READ8(pAdapter,wrq,pRaCfg); + break; + case RACFG_CMD_BBP_WRITE8: + Status=DO_RACFG_CMD_BBP_WRITE8(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_BBP_READ_ALL: + Status=DO_RACFG_CMD_BBP_READ_ALL(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_E2PROM_READ_BULK: + Status=DO_RACFG_CMD_ATE_E2PROM_READ_BULK(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_E2PROM_WRITE_BULK: + Status=DO_RACFG_CMD_ATE_E2PROM_WRITE_BULK(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_IO_WRITE_BULK: + Status=DO_RACFG_CMD_ATE_IO_WRITE_BULK(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_BBP_READ_BULK: + Status=DO_RACFG_CMD_ATE_BBP_READ_BULK(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_BBP_WRITE_BULK: + Status=DO_RACFG_CMD_ATE_BBP_WRITE_BULK(pAdapter,wrq,pRaCfg); + break; + +#ifdef RTMP_RF_RW_SUPPORT + case RACFG_CMD_ATE_RF_READ_BULK: + Status=DO_RACFG_CMD_ATE_RF_READ_BULK(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_RF_WRITE_BULK: + Status=DO_RACFG_CMD_ATE_RF_WRITE_BULK(pAdapter,wrq,pRaCfg); + break; +#endif // RTMP_RF_RW_SUPPORT // + + case RACFG_CMD_GET_NOISE_LEVEL: + Status=DO_RACFG_CMD_GET_NOISE_LEVEL(pAdapter,wrq,pRaCfg); + break; + + + case RACFG_CMD_GET_COUNTER: + Status=DO_RACFG_CMD_GET_COUNTER(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_CLEAR_COUNTER: + Status=DO_RACFG_CMD_CLEAR_COUNTER(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_TX_START: + Status=DO_RACFG_CMD_TX_START(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_GET_TX_STATUS: + Status=DO_RACFG_CMD_GET_TX_STATUS(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_TX_STOP: + Status=DO_RACFG_CMD_TX_STOP(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_RX_START: + Status=DO_RACFG_CMD_RX_START(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_RX_STOP: + Status=DO_RACFG_CMD_RX_STOP(pAdapter,wrq,pRaCfg); + break; + + /* The following cases are for new ATE GUI(not QA). */ + /*==================================================*/ + case RACFG_CMD_ATE_START_TX_CARRIER: + Status=DO_RACFG_CMD_ATE_START_TX_CARRIER(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_START_TX_CONT: + Status=DO_RACFG_CMD_ATE_START_TX_CONT(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_START_TX_FRAME: + Status=DO_RACFG_CMD_ATE_START_TX_FRAME(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_BW: + Status=DO_RACFG_CMD_ATE_SET_BW(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_TX_POWER0: + Status=DO_RACFG_CMD_ATE_SET_TX_POWER0(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_TX_POWER1: + Status=DO_RACFG_CMD_ATE_SET_TX_POWER1(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_FREQ_OFFSET: + Status=DO_RACFG_CMD_ATE_SET_TX_POWER1(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_GET_STATISTICS: + Status=DO_RACFG_CMD_ATE_GET_STATISTICS(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_RESET_COUNTER: + Status=DO_RACFG_CMD_ATE_RESET_COUNTER(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SEL_TX_ANTENNA: + Status=DO_RACFG_CMD_ATE_SEL_TX_ANTENNA(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SEL_RX_ANTENNA: + Status=DO_RACFG_CMD_ATE_SEL_TX_ANTENNA(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_PREAMBLE: + Status=DO_RACFG_CMD_ATE_SET_PREAMBLE(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_CHANNEL: + Status=DO_RACFG_CMD_ATE_SET_CHANNEL(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_ADDR1: + Status=DO_RACFG_CMD_ATE_SET_ADDR1(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_ADDR2: + Status=DO_RACFG_CMD_ATE_SET_ADDR2(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_ADDR3: + Status=DO_RACFG_CMD_ATE_SET_ADDR3(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_RATE: + Status=DO_RACFG_CMD_ATE_SET_RATE(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_TX_FRAME_LEN: + Status=DO_RACFG_CMD_ATE_SET_TX_FRAME_LEN(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_SET_TX_FRAME_COUNT: + Status=DO_RACFG_CMD_ATE_SET_TX_FRAME_COUNT(pAdapter,wrq,pRaCfg); + break; + + case RACFG_CMD_ATE_START_RX_FRAME: + Status=DO_RACFG_CMD_ATE_START_RX_FRAME(pAdapter,wrq,pRaCfg); + break; + default: + break; + } + + ASSERT(pRaCfg != NULL); + + if (pRaCfg != NULL) + kfree(pRaCfg); + + return; +} + + +VOID BubbleSort(INT32 n, INT32 a[]) +{ + INT32 k, j, temp; + + for (k = n-1; k>0; k--) + { + for (j = 0; j<k; j++) + { + if (a[j] > a[j+1]) + { + temp = a[j]; + a[j]=a[j+1]; + a[j+1]=temp; + } + } + } +} + + +VOID CalNoiseLevel(PRTMP_ADAPTER pAd, UCHAR channel, INT32 RSSI[3][10]) +{ + INT32 RSSI0, RSSI1, RSSI2; + CHAR Rssi0Offset, Rssi1Offset, Rssi2Offset; + UCHAR BbpR50Rssi0 = 0, BbpR51Rssi1 = 0, BbpR52Rssi2 = 0; + UCHAR Org_BBP66value = 0, Org_BBP69value = 0, Org_BBP70value = 0, data = 0; + USHORT LNA_Gain = 0; + INT32 j = 0; + UCHAR Org_Channel = pAd->ate.Channel; + USHORT GainValue = 0, OffsetValue = 0; + + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &Org_BBP66value); + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R69, &Org_BBP69value); + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R70, &Org_BBP70value); + + //********************************************************************** + // Read the value of LNA gain and Rssi offset + //********************************************************************** + RT28xx_EEPROM_READ16(pAd, EEPROM_LNA_OFFSET, GainValue); + + // for Noise Level + if (channel <= 14) + { + LNA_Gain = GainValue & 0x00FF; + + RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_BG_OFFSET, OffsetValue); + Rssi0Offset = OffsetValue & 0x00FF; + Rssi1Offset = (OffsetValue & 0xFF00) >> 8; + RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_BG_OFFSET + 2)/* 0x48 */, OffsetValue); + Rssi2Offset = OffsetValue & 0x00FF; + } + else + { + LNA_Gain = (GainValue & 0xFF00) >> 8; + + RT28xx_EEPROM_READ16(pAd, EEPROM_RSSI_A_OFFSET, OffsetValue); + Rssi0Offset = OffsetValue & 0x00FF; + Rssi1Offset = (OffsetValue & 0xFF00) >> 8; + RT28xx_EEPROM_READ16(pAd, (EEPROM_RSSI_A_OFFSET + 2)/* 0x4C */, OffsetValue); + Rssi2Offset = OffsetValue & 0x00FF; + } + //********************************************************************** + { + pAd->ate.Channel = channel; + ATEAsicSwitchChannel(pAd); + mdelay(5); + + data = 0x10; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, data); + data = 0x40; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, data); + data = 0x40; + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, data); + mdelay(5); + + // start Rx + pAd->ate.bQARxStart = TRUE; + Set_ATE_Proc(pAd, "RXFRAME"); + + mdelay(5); + + for (j = 0; j < 10; j++) + { + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R50, &BbpR50Rssi0); + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R51, &BbpR51Rssi1); + ATE_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R52, &BbpR52Rssi2); + + mdelay(10); + + // calculate RSSI 0 + if (BbpR50Rssi0 == 0) + { + RSSI0 = -100; + } + else + { + RSSI0 = (INT32)(-12 - BbpR50Rssi0 - LNA_Gain - Rssi0Offset); + } + RSSI[0][j] = RSSI0; + + if ( pAd->Antenna.field.RxPath >= 2 ) // 2R + { + // calculate RSSI 1 + if (BbpR51Rssi1 == 0) + { + RSSI1 = -100; + } + else + { + RSSI1 = (INT32)(-12 - BbpR51Rssi1 - LNA_Gain - Rssi1Offset); + } + RSSI[1][j] = RSSI1; + } + + if ( pAd->Antenna.field.RxPath >= 3 ) // 3R + { + // calculate RSSI 2 + if (BbpR52Rssi2 == 0) + RSSI2 = -100; + else + RSSI2 = (INT32)(-12 - BbpR52Rssi2 - LNA_Gain - Rssi2Offset); + + RSSI[2][j] = RSSI2; + } + } + + // stop Rx + Set_ATE_Proc(pAd, "RXSTOP"); + + mdelay(5); + + BubbleSort(10, RSSI[0]); // 1R + + if ( pAd->Antenna.field.RxPath >= 2 ) // 2R + { + BubbleSort(10, RSSI[1]); + } + + if ( pAd->Antenna.field.RxPath >= 3 ) // 3R + { + BubbleSort(10, RSSI[2]); + } + } + + pAd->ate.Channel = Org_Channel; + ATEAsicSwitchChannel(pAd); + + // restore original value + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, Org_BBP66value); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, Org_BBP69value); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, Org_BBP70value); + + return; +} + + +BOOLEAN SyncTxRxConfig(PRTMP_ADAPTER pAd, USHORT offset, UCHAR value) +{ + UCHAR tmp = 0, bbp_data = 0; + + if (ATE_ON(pAd)) + { + ATE_BBP_IO_READ8_BY_REG_ID(pAd, offset, &bbp_data); + } + else + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, offset, &bbp_data); + } + + /* confirm again */ + ASSERT(bbp_data == value); + + switch (offset) + { + case BBP_R1: + /* Need to synchronize tx configuration with legacy ATE. */ + tmp = (bbp_data & ((1 << 4) | (1 << 3))/* 0x18 */) >> 3; + switch (tmp) + { + /* The BBP R1 bit[4:3] = 2 :: Both DACs will be used by QA. */ + case 2: + /* All */ + pAd->ate.TxAntennaSel = 0; + break; + /* The BBP R1 bit[4:3] = 0 :: DAC 0 will be used by QA. */ + case 0: + /* Antenna one */ + pAd->ate.TxAntennaSel = 1; + break; + /* The BBP R1 bit[4:3] = 1 :: DAC 1 will be used by QA. */ + case 1: + /* Antenna two */ + pAd->ate.TxAntennaSel = 2; + break; + default: + DBGPRINT(RT_DEBUG_TRACE, ("%s -- Sth. wrong! : return FALSE; \n", __FUNCTION__)); + return FALSE; + } + break;/* case BBP_R1 */ + + case BBP_R3: + /* Need to synchronize rx configuration with legacy ATE. */ + tmp = (bbp_data & ((1 << 1) | (1 << 0))/* 0x03 */); + switch(tmp) + { + /* The BBP R3 bit[1:0] = 3 :: All ADCs will be used by QA. */ + case 3: + /* All */ + pAd->ate.RxAntennaSel = 0; + break; + /* + The BBP R3 bit[1:0] = 0 :: ADC 0 will be used by QA, + unless the BBP R3 bit[4:3] = 2 + */ + case 0: + /* Antenna one */ + pAd->ate.RxAntennaSel = 1; + tmp = ((bbp_data & ((1 << 4) | (1 << 3))/* 0x03 */) >> 3); + if (tmp == 2)// 3R + { + /* Default : All ADCs will be used by QA */ + pAd->ate.RxAntennaSel = 0; + } + break; + /* The BBP R3 bit[1:0] = 1 :: ADC 1 will be used by QA. */ + case 1: + /* Antenna two */ + pAd->ate.RxAntennaSel = 2; + break; + /* The BBP R3 bit[1:0] = 2 :: ADC 2 will be used by QA. */ + case 2: + /* Antenna three */ + pAd->ate.RxAntennaSel = 3; + break; + default: + DBGPRINT(RT_DEBUG_ERROR, ("%s -- Impossible! : return FALSE; \n", __FUNCTION__)); + return FALSE; + } + break;/* case BBP_R3 */ + + default: + DBGPRINT(RT_DEBUG_ERROR, ("%s -- Sth. wrong! : return FALSE; \n", __FUNCTION__)); + return FALSE; + + } + return TRUE; +} + + +static VOID memcpy_exl(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len) +{ + ULONG i, Value = 0; + ULONG *pDst, *pSrc; + UCHAR *p8; + + p8 = src; + pDst = (ULONG *) dst; + pSrc = (ULONG *) src; + + for (i = 0 ; i < (len/4); i++) + { + /* For alignment issue, we need a variable "Value". */ + memmove(&Value, pSrc, 4); + Value = htonl(Value); + memmove(pDst, &Value, 4); + pDst++; + pSrc++; + } + if ((len % 4) != 0) + { + /* wish that it will never reach here */ + memmove(&Value, pSrc, (len % 4)); + Value = htonl(Value); + memmove(pDst, &Value, (len % 4)); + } +} + + +static VOID memcpy_exs(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, ULONG len) +{ + ULONG i; + USHORT *pDst, *pSrc; + + pDst = (USHORT *) dst; + pSrc = (USHORT *) src; + + for (i =0; i < (len/2); i++) + { + *pDst = ntohs(*pSrc); + pDst++; + pSrc++; + } + + if ((len % 2) != 0) + { + memcpy(pDst, pSrc, (len % 2)); + *pDst = ntohs(*pDst); + } +} + + +static VOID RTMP_IO_READ_BULK(PRTMP_ADAPTER pAd, UCHAR *dst, UCHAR *src, UINT32 len) +{ + UINT32 i, Value; + UINT32 *pDst, *pSrc; + + pDst = (UINT32 *) dst; + pSrc = (UINT32 *) src; + + for (i = 0 ; i < (len/4); i++) + { + RTMP_IO_READ32(pAd, (ULONG)pSrc, &Value); + Value = htonl(Value); + memmove(pDst, &Value, 4); + pDst++; + pSrc++; + } + return; +} + + +INT Set_TxStop_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("Set_TxStop_Proc\n")); + + if (Set_ATE_Proc(pAd, "TXSTOP")) + { + return TRUE; + } + else + { + return FALSE; + } +} + + +INT Set_RxStop_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ATEDBGPRINT(RT_DEBUG_TRACE,("Set_RxStop_Proc\n")); + + if (Set_ATE_Proc(pAd, "RXSTOP")) + { + return TRUE; + } + else + { + return FALSE; + } +} + + +#ifdef DBG +INT Set_EERead_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + USHORT buffer[EEPROM_SIZE/2]; + USHORT *p; + INT i; + + rt_ee_read_all(pAd, (USHORT *)buffer); + p = buffer; + + for (i = 0; i < (EEPROM_SIZE/2); i++) + { + ate_print(KERN_EMERG "%4.4x ", *p); + if (((i+1) % 16) == 0) + ate_print(KERN_EMERG "\n"); + p++; + } + + return TRUE; +} + + +INT Set_EEWrite_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + USHORT offset = 0, value; + PSTRING p2 = arg; + + while ((*p2 != ':') && (*p2 != '\0')) + { + p2++; + } + + if (*p2 == ':') + { + A2Hex(offset, arg); + A2Hex(value, p2 + 1); + } + else + { + A2Hex(value, arg); + } + + if (offset >= EEPROM_SIZE) + { + ate_print(KERN_EMERG "Offset can not exceed EEPROM_SIZE( == 0x%04x)\n", EEPROM_SIZE); + return FALSE; + } + + RT28xx_EEPROM_WRITE16(pAd, offset, value); + + return TRUE; +} + + +INT Set_BBPRead_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR value = 0, offset; + + A2Hex(offset, arg); + + if (ATE_ON(pAd)) + { + ATE_BBP_IO_READ8_BY_REG_ID(pAd, offset, &value); + } + else + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, offset, &value); + } + + ate_print(KERN_EMERG "%x\n", value); + + return TRUE; +} + + +INT Set_BBPWrite_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + USHORT offset = 0; + PSTRING p2 = arg; + UCHAR value; + + while ((*p2 != ':') && (*p2 != '\0')) + { + p2++; + } + + if (*p2 == ':') + { + A2Hex(offset, arg); + A2Hex(value, p2 + 1); + } + else + { + A2Hex(value, arg); + } + + if (ATE_ON(pAd)) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAd, offset, value); + } + else + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, offset, value); + } + + return TRUE; +} + + +INT Set_RFWrite_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + PSTRING p2, p3, p4; + UINT32 R1, R2, R3, R4; + + p2 = arg; + + while ((*p2 != ':') && (*p2 != '\0')) + { + p2++; + } + + if (*p2 != ':') + return FALSE; + + p3 = p2 + 1; + + while((*p3 != ':') && (*p3 != '\0')) + { + p3++; + } + + if (*p3 != ':') + return FALSE; + + p4 = p3 + 1; + + while ((*p4 != ':') && (*p4 != '\0')) + { + p4++; + } + + if (*p4 != ':') + return FALSE; + + + A2Hex(R1, arg); + A2Hex(R2, p2 + 1); + A2Hex(R3, p3 + 1); + A2Hex(R4, p4 + 1); + + RTMP_RF_IO_WRITE32(pAd, R1); + RTMP_RF_IO_WRITE32(pAd, R2); + RTMP_RF_IO_WRITE32(pAd, R3); + RTMP_RF_IO_WRITE32(pAd, R4); + + return TRUE; +} +#endif // DBG // +#endif // RALINK_28xx_QA // + + +#endif // RALINK_ATE // + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_linux.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_linux.c new file mode 100644 index 000000000..fd283085a --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_linux.c @@ -0,0 +1,1941 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + +#include "rt_config.h" + +ULONG RTDebugLevel = RT_DEBUG_ERROR; + + +UCHAR RALINK_OUI[] = {0x00, 0x0c, 0x43}; + +#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 */ + }; + +#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 // + +#endif // SYSTEM_LOG_SUPPORT // + +/* timeout -- ms */ +VOID RTMP_SetPeriodicTimer( + IN NDIS_MINIPORT_TIMER *pTimer, + IN unsigned long timeout) +{ + timeout = ((timeout*OS_HZ) / 1000); + pTimer->expires = jiffies + timeout; + add_timer(pTimer); +} + +/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */ +VOID RTMP_OS_Init_Timer( + IN PRTMP_ADAPTER pAd, + IN NDIS_MINIPORT_TIMER *pTimer, + IN TIMER_FUNCTION function, + IN PVOID data) +{ + if (!timer_pending(pTimer)) + { + init_timer(pTimer); + pTimer->data = (unsigned long)data; + pTimer->function = function; + } +} + + +VOID RTMP_OS_Add_Timer( + IN NDIS_MINIPORT_TIMER *pTimer, + IN unsigned long timeout) +{ + if (timer_pending(pTimer)) + return; + + timeout = ((timeout*OS_HZ) / 1000); + pTimer->expires = jiffies + timeout; + add_timer(pTimer); +} + +VOID RTMP_OS_Mod_Timer( + IN NDIS_MINIPORT_TIMER *pTimer, + IN unsigned long timeout) +{ + timeout = ((timeout*OS_HZ) / 1000); + mod_timer(pTimer, jiffies + timeout); +} + +VOID RTMP_OS_Del_Timer( + IN NDIS_MINIPORT_TIMER *pTimer, + OUT BOOLEAN *pCancelled) +{ + if (timer_pending(pTimer)) + { + *pCancelled = del_timer_sync(pTimer); + } + else + { + *pCancelled = TRUE; + } + +} + + +// Unify all delay routine by using udelay +VOID RTMPusecDelay( + IN ULONG usec) +{ + ULONG i; + + for (i = 0; i < (usec / 50); i++) + udelay(50); + + if (usec % 50) + udelay(usec % 50); +} + +void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time) +{ + time->u.LowPart = jiffies; +} + +// pAd MUST allow to be NULL +NDIS_STATUS os_alloc_mem( + IN RTMP_ADAPTER *pAd, + OUT UCHAR **mem, + IN ULONG size) +{ + *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC); + if (*mem) + return (NDIS_STATUS_SUCCESS); + else + return (NDIS_STATUS_FAILURE); +} + +// pAd MUST allow to be NULL +NDIS_STATUS os_free_mem( + IN PRTMP_ADAPTER pAd, + IN PVOID mem) +{ + + ASSERT(mem); + kfree(mem); + return (NDIS_STATUS_SUCCESS); +} + + + + +PNDIS_PACKET RtmpOSNetPktAlloc( + IN RTMP_ADAPTER *pAd, + IN int size) +{ + struct sk_buff *skb; + /* Add 2 more bytes for ip header alignment*/ + skb = dev_alloc_skb(size+2); + if (skb != NULL) + { + MEM_DBG_PKT_ALLOC_INC(pAd); + } + + return ((PNDIS_PACKET)skb); +} + + +PNDIS_PACKET RTMP_AllocateFragPacketBuffer( + IN PRTMP_ADAPTER pAd, + IN ULONG Length) +{ + struct sk_buff *pkt; + + pkt = dev_alloc_skb(Length); + + if (pkt == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length)); + } + + if (pkt) + { + MEM_DBG_PKT_ALLOC_INC(pAd); + RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); + } + + return (PNDIS_PACKET) pkt; +} + + +PNDIS_PACKET RTMP_AllocateTxPacketBuffer( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress) +{ + struct sk_buff *pkt; + + pkt = dev_alloc_skb(Length); + + if (pkt == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length)); + } + + if (pkt) + { + MEM_DBG_PKT_ALLOC_INC(pAd); + RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); + *VirtualAddress = (PVOID) pkt->data; + } + else + { + *VirtualAddress = (PVOID) NULL; + } + + return (PNDIS_PACKET) pkt; +} + + +VOID build_tx_packet( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PUCHAR pFrame, + IN ULONG FrameLen) +{ + + struct sk_buff *pTxPkt; + + ASSERT(pPacket); + pTxPkt = RTPKT_TO_OSPKT(pPacket); + + NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen); +} + +VOID RTMPFreeAdapter( + IN PRTMP_ADAPTER pAd) +{ + POS_COOKIE os_cookie; + int index; + + os_cookie=(POS_COOKIE)pAd->OS_Cookie; + + if (pAd->BeaconBuf) + kfree(pAd->BeaconBuf); + + + NdisFreeSpinLock(&pAd->MgmtRingLock); + +#ifdef RTMP_MAC_PCI + NdisFreeSpinLock(&pAd->RxRingLock); +#endif // RTMP_MAC_PCI // + + 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); + + + vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); + if (os_cookie) + kfree(os_cookie); +} + +BOOLEAN OS_Need_Clone_Packet(void) +{ + return (FALSE); +} + + + +/* + ======================================================================== + + Routine Description: + clone an input NDIS PACKET to another one. The new internally created NDIS PACKET + must have only one NDIS BUFFER + return - byte copied. 0 means can't create NDIS PACKET + NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket + + Arguments: + pAd Pointer to our adapter + pInsAMSDUHdr EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU. + *pSrcTotalLen return total packet length. This lenght is calculated with 802.3 format packet. + + Return Value: + NDIS_STATUS_SUCCESS + NDIS_STATUS_FAILURE + + Note: + + ======================================================================== +*/ +NDIS_STATUS RTMPCloneNdisPacket( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN pInsAMSDUHdr, + IN PNDIS_PACKET pInPacket, + OUT PNDIS_PACKET *ppOutPacket) +{ + + struct sk_buff *pkt; + + ASSERT(pInPacket); + ASSERT(ppOutPacket); + + // 1. Allocate a packet + pkt = dev_alloc_skb(2048); + + if (pkt == NULL) + { + return NDIS_STATUS_FAILURE; + } + + MEM_DBG_PKT_ALLOC_INC(pAd); + skb_put(pkt, GET_OS_PKT_LEN(pInPacket)); + NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket)); + *ppOutPacket = OSPKT_TO_RTPKT(pkt); + + + RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); + + printk("###Clone###\n"); + + return NDIS_STATUS_SUCCESS; +} + + +// the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket() +NDIS_STATUS RTMPAllocateNdisPacket( + IN PRTMP_ADAPTER pAd, + OUT PNDIS_PACKET *ppPacket, + IN PUCHAR pHeader, + IN UINT HeaderLen, + IN PUCHAR pData, + IN UINT DataLen) +{ + PNDIS_PACKET pPacket; + ASSERT(pData); + ASSERT(DataLen); + + // 1. Allocate a packet + pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + RTMP_PKT_TAIL_PADDING); + + if (pPacket == NULL) + { + *ppPacket = NULL; +#ifdef DEBUG + printk("RTMPAllocateNdisPacket Fail\n\n"); +#endif + return NDIS_STATUS_FAILURE; + } + MEM_DBG_PKT_ALLOC_INC(pAd); + + // 2. clone the frame content + if (HeaderLen > 0) + NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen); + if (DataLen > 0) + NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen); + + // 3. update length of packet + skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen); + + RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS); +// printk("%s : pPacket = %p, len = %d\n", __FUNCTION__, pPacket, GET_OS_PKT_LEN(pPacket)); + *ppPacket = pPacket; + return NDIS_STATUS_SUCCESS; +} + +/* + ======================================================================== + Description: + This routine frees a miniport internally allocated NDIS_PACKET and its + corresponding NDIS_BUFFER and allocated memory. + ======================================================================== +*/ +VOID RTMPFreeNdisPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket) +{ + dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket)); + MEM_DBG_PKT_FREE_INC(pAd); +} + + +// IRQL = DISPATCH_LEVEL +// NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same +// scatter gather buffer +NDIS_STATUS Sniff2BytesFromNdisBuffer( + IN PNDIS_BUFFER pFirstBuffer, + IN UCHAR DesiredOffset, + OUT PUCHAR pByte0, + OUT PUCHAR pByte1) +{ + *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset); + *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1); + + return NDIS_STATUS_SUCCESS; +} + + +void RTMP_QueryPacketInfo( + IN PNDIS_PACKET pPacket, + OUT PACKET_INFO *pPacketInfo, + OUT PUCHAR *pSrcBufVA, + OUT UINT *pSrcBufLen) +{ + pPacketInfo->BufferCount = 1; + pPacketInfo->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket); + pPacketInfo->PhysicalBufferCount = 1; + pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket); + + *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket); + *pSrcBufLen = GET_OS_PKT_LEN(pPacket); +} + +void RTMP_QueryNextPacketInfo( + IN PNDIS_PACKET *ppPacket, + OUT PACKET_INFO *pPacketInfo, + OUT PUCHAR *pSrcBufVA, + OUT UINT *pSrcBufLen) +{ + PNDIS_PACKET pPacket = NULL; + + if (*ppPacket) + pPacket = GET_OS_PKT_NEXT(*ppPacket); + + if (pPacket) + { + pPacketInfo->BufferCount = 1; + pPacketInfo->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket); + pPacketInfo->PhysicalBufferCount = 1; + pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket); + + *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket); + *pSrcBufLen = GET_OS_PKT_LEN(pPacket); + *ppPacket = GET_OS_PKT_NEXT(pPacket); + } + else + { + pPacketInfo->BufferCount = 0; + pPacketInfo->pFirstBuffer = NULL; + pPacketInfo->PhysicalBufferCount = 0; + pPacketInfo->TotalPacketLength = 0; + + *pSrcBufVA = NULL; + *pSrcBufLen = 0; + *ppPacket = NULL; + } +} + + +PNDIS_PACKET DuplicatePacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN UCHAR FromWhichBSSID) +{ + struct sk_buff *skb; + PNDIS_PACKET pRetPacket = NULL; + USHORT DataSize; + UCHAR *pData; + + DataSize = (USHORT) GET_OS_PKT_LEN(pPacket); + pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket); + + + skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG); + if (skb) + { + MEM_DBG_PKT_ALLOC_INC(pAd); + skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); + pRetPacket = OSPKT_TO_RTPKT(skb); + } + + + return pRetPacket; + +} + +PNDIS_PACKET duplicate_pkt( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pHeader802_3, + IN UINT HdrLen, + IN PUCHAR pData, + IN ULONG DataSize, + IN UCHAR FromWhichBSSID) +{ + struct sk_buff *skb; + PNDIS_PACKET pPacket = NULL; + + if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL) + { + MEM_DBG_PKT_ALLOC_INC(pAd); + + skb_reserve(skb, 2); + NdisMoveMemory(skb->tail, pHeader802_3, HdrLen); + skb_put(skb, HdrLen); + NdisMoveMemory(skb->tail, pData, DataSize); + skb_put(skb, DataSize); + skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); + pPacket = OSPKT_TO_RTPKT(skb); + } + + return pPacket; +} + + +#define TKIP_TX_MIC_SIZE 8 +PNDIS_PACKET duplicate_pkt_with_TKIP_MIC( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket) +{ + struct sk_buff *skb, *newskb; + + + skb = RTPKT_TO_OSPKT(pPacket); + if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE) + { + // alloc a new skb and copy the packet + newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC); + MEM_DBG_PKT_ALLOC_INC(pAd); + + dev_kfree_skb_any(skb); + MEM_DBG_PKT_FREE_INC(pAd); + + if (newskb == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n")); + return NULL; + } + skb = newskb; + } + + return OSPKT_TO_RTPKT(skb); + + +} + + + + +PNDIS_PACKET ExpandPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN UINT32 ext_head_len, + IN UINT32 ext_tail_len) +{ + struct sk_buff *skb, *newskb; + + + skb = RTPKT_TO_OSPKT(pPacket); + //printk("original skb_headroom(%d)/skb_tailroom(%d)\n", skb_headroom(skb), skb_tailroom(skb)); + if (skb_cloned(skb) || (skb_headroom(skb) < ext_head_len) || (skb_tailroom(skb) < ext_tail_len)) + { + UINT32 head_len = (skb_headroom(skb) < ext_head_len) ? ext_head_len : skb_headroom(skb); + UINT32 tail_len = (skb_tailroom(skb) < ext_tail_len) ? ext_tail_len : skb_tailroom(skb); + + // alloc a new skb and copy the packet + newskb = skb_copy_expand(skb, head_len, tail_len, GFP_ATOMIC); + MEM_DBG_PKT_ALLOC_INC(pAd); + + dev_kfree_skb_any(skb); + MEM_DBG_PKT_FREE_INC(pAd); + + if (newskb == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx buffer for WPI failed!, dropping packet!\n")); + return NULL; + } + skb = newskb; + //printk("new skb_headroom(%d)/skb_tailroom(%d)\n", skb_headroom(skb), skb_tailroom(skb)); + } + + return OSPKT_TO_RTPKT(skb); + +} + +PNDIS_PACKET ClonePacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN PUCHAR pData, + IN ULONG DataSize) +{ + struct sk_buff *pRxPkt; + struct sk_buff *pClonedPkt; + + ASSERT(pPacket); + pRxPkt = RTPKT_TO_OSPKT(pPacket); + + // clone the packet + pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG); + + if (pClonedPkt) + { + // set the correct dataptr and data len + MEM_DBG_PKT_ALLOC_INC(pAd); + pClonedPkt->dev = pRxPkt->dev; + pClonedPkt->data = pData; + pClonedPkt->len = DataSize; + pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len; + ASSERT(DataSize < 1530); + } + return pClonedPkt; +} + +// +// change OS packet DataPtr and DataLen +// +void update_os_packet_info( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + struct sk_buff *pOSPkt; + + ASSERT(pRxBlk->pRxPacket); + pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); + + pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); + pOSPkt->data = pRxBlk->pData; + pOSPkt->len = pRxBlk->DataSize; + pOSPkt->tail = pOSPkt->data + pOSPkt->len; +} + + +void wlan_802_11_to_802_3_packet( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN PUCHAR pHeader802_3, + IN UCHAR FromWhichBSSID, + IN UCHAR *TPID) +{ + struct sk_buff *pOSPkt; + + ASSERT(pRxBlk->pRxPacket); + ASSERT(pHeader802_3); + + pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); + + pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); + pOSPkt->data = pRxBlk->pData; + pOSPkt->len = pRxBlk->DataSize; + pOSPkt->tail = pOSPkt->data + pOSPkt->len; + + // + // copy 802.3 header + // + // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3); +#endif // CONFIG_STA_SUPPORT // + } + + + +void announce_802_3_packet( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket) +{ + + struct sk_buff *pRxPkt; +#ifdef INF_AMAZON_PPA + int ret = 0; + unsigned int ppa_flags = 0; /* reserved for now */ +#endif // INF_AMAZON_PPA // + + + ASSERT(pPacket); + + MEM_DBG_PKT_FREE_INC(pAd); + + pRxPkt = RTPKT_TO_OSPKT(pPacket); + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + /* Push up the protocol stack */ +#ifdef IKANOS_VX_1X0 + IKANOS_DataFrameRx(pAd, pRxPkt->dev, pRxPkt, pRxPkt->len); +#else + +// mark for bridge fast path, 2009/06/22 +// pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); + +#ifdef INF_AMAZON_PPA + if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE ) + { + pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); + + memset(pRxPkt->head,0,pRxPkt->data-pRxPkt->head-14); + DBGPRINT(RT_DEBUG_TRACE, ("ppa_hook_directpath_send_fn rx :ret:%d headroom:%d dev:%s pktlen:%d<===\n",ret,skb_headroom(pRxPkt) + ,pRxPkt->dev->name,pRxPkt->len)); + hex_dump("rx packet", pRxPkt->data, 32); + ret = ppa_hook_directpath_send_fn(pAd->g_if_id, pRxPkt, pRxPkt->len, ppa_flags); + pRxPkt=NULL; + return; + + } +#endif // INF_AMAZON_PPA // + +//#ifdef CONFIG_5VT_ENHANCE +// *(int*)(pRxPkt->cb) = BRIDGE_TAG; +//#endif + + { + + pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev); + netif_rx(pRxPkt); + } + +#endif // IKANOS_VX_1X0 // +} + + +PRTMP_SCATTER_GATHER_LIST +rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg) +{ + sg->NumberOfElements = 1; + sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket); + sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket); + return (sg); +} + +void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen) +{ +#ifdef DBG + unsigned char *pt; + int x; + + if (RTDebugLevel < RT_DEBUG_TRACE) + return; + + pt = pSrcBufVA; + printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen); + for (x=0; x<SrcBufLen; x++) + { + if (x % 16 == 0) + printk("0x%04x : ", x); + printk("%02x ", ((unsigned char)pt[x])); + if (x%16 == 15) printk("\n"); + } + printk("\n"); +#endif // DBG // +} + +#ifdef SYSTEM_LOG_SUPPORT +/* + ======================================================================== + + Routine Description: + Send log message through wireless event + + Support standard iw_event with IWEVCUSTOM. It is used below. + + iwreq_data.data.flags is used to store event_flag that is defined by user. + iwreq_data.data.length is the length of the event log. + + The format of the event log is composed of the entry's MAC address and + the desired log message (refer to pWirelessEventText). + + ex: 11:22:33:44:55:66 has associated successfully + + p.s. The requirement of Wireless Extension is v15 or newer. + + ======================================================================== +*/ +VOID RTMPSendWirelessEvent( + IN PRTMP_ADAPTER pAd, + IN USHORT Event_flag, + IN PUCHAR pAddr, + IN UCHAR BssIdx, + IN CHAR Rssi) +{ + PSTRING pBuf = NULL, pBufPtr = NULL; + USHORT event, type, BufLen; + UCHAR event_table_len = 0; + + if (pAd->CommonCfg.bWirelessEvent == FALSE) + return; + +#if WIRELESS_EXT >= 15 + + 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 // + } + + 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) + { + //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) + 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 // + else + pBufPtr += sprintf(pBufPtr, "%s", "unknown event"); + + pBufPtr[pBufPtr - pBuf] = '\0'; + BufLen = pBufPtr - pBuf; + + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen); + //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __FUNCTION__, pBuf)); + + kfree(pBuf); + } + else + DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __FUNCTION__)); +#else + DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __FUNCTION__)); +#endif /* WIRELESS_EXT >= 15 */ +} +#endif // SYSTEM_LOG_SUPPORT // + + + +#ifdef CONFIG_STA_SUPPORT +void send_monitor_packets( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk, + IN CHAR (*RTMPMaxRssi)( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi0, + IN CHAR Rssi1, + IN CHAR Rssi2), + IN CHAR (*ConvertToRssi)( + IN PRTMP_ADAPTER pAd, + IN CHAR Rssi, + IN UCHAR RssiNumber)) +{ + struct sk_buff *pOSPkt; + wlan_ng_prism2_header *ph; + int rate_index = 0; + USHORT header_len = 0; + UCHAR temp_header[40] = {0}; + + u_int32_t ralinkrate[256] = {2,4,11,22, 12,18,24,36,48,72,96, 108, 109, 110, 111, 112, 13, 26, 39, 52,78,104, 117, 130, 26, 52, 78,104, 156, 208, 234, 260, 27, 54,81,108,162, 216, 243, 270, // Last 38 + 54, 108, 162, 216, 324, 432, 486, 540, 14, 29, 43, 57, 87, 115, 130, 144, 29, 59,87,115, 173, 230,260, 288, 30, 60,90,120,180,240,270,300,60,120,180,240,360,480,540,600, 0,1,2,3,4,5,6,7,8,9,10, + 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80}; + + + MEM_DBG_PKT_FREE_INC(pAd); + + ASSERT(pRxBlk->pRxPacket); + if (pRxBlk->DataSize < 10) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __FUNCTION__, pRxBlk->DataSize)); + goto err_free_sk_buff; + } + + if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%d)\n", __FUNCTION__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header))); + goto err_free_sk_buff; + } + + pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); + pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0); + if (pRxBlk->pHeader->FC.Type == BTYPE_DATA) + { + pRxBlk->DataSize -= LENGTH_802_11; + if ((pRxBlk->pHeader->FC.ToDs == 1) && + (pRxBlk->pHeader->FC.FrDs == 1)) + header_len = LENGTH_802_11_WITH_ADDR4; + else + header_len = LENGTH_802_11; + + // QOS + if (pRxBlk->pHeader->FC.SubType & 0x08) + { + header_len += 2; + // Data skip QOS contorl field + pRxBlk->DataSize -=2; + } + + // Order bit: A-Ralink or HTC+ + if (pRxBlk->pHeader->FC.Order) + { + header_len += 4; + // Data skip HTC contorl field + pRxBlk->DataSize -= 4; + } + + // Copy Header + if (header_len <= 40) + NdisMoveMemory(temp_header, pRxBlk->pData, header_len); + + // skip HW padding + if (pRxBlk->RxD.L2PAD) + pRxBlk->pData += (header_len + 2); + else + pRxBlk->pData += header_len; + } //end if + + + if (pRxBlk->DataSize < pOSPkt->len) { + skb_trim(pOSPkt,pRxBlk->DataSize); + } else { + skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len)); + } //end if + + if ((pRxBlk->pData - pOSPkt->data) > 0) { + skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data)); + skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data)); + } //end if + + if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) { + if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) { + DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __FUNCTION__)); + goto err_free_sk_buff; + } //end if + } //end if + + if (header_len > 0) + NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len); + + ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header)); + NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header)); + + ph->msgcode = DIDmsg_lnxind_wlansniffrm; + ph->msglen = sizeof(wlan_ng_prism2_header); + strcpy((PSTRING) ph->devname, (PSTRING) pAd->net_dev->name); + + ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime; + ph->hosttime.status = 0; + ph->hosttime.len = 4; + ph->hosttime.data = jiffies; + + ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime; + ph->mactime.status = 0; + ph->mactime.len = 0; + ph->mactime.data = 0; + + ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx; + ph->istx.status = 0; + ph->istx.len = 0; + ph->istx.data = 0; + + ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel; + ph->channel.status = 0; + ph->channel.len = 4; + + ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel; + + ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi; + ph->rssi.status = 0; + ph->rssi.len = 4; + ph->rssi.data = (u_int32_t)RTMPMaxRssi(pAd, ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0, RSSI_0), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI1, RSSI_1), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2, RSSI_2));; + + ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal; + ph->signal.status = 0; + ph->signal.len = 4; + ph->signal.data = 0; //rssi + noise; + + ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise; + ph->noise.status = 0; + ph->noise.len = 4; + ph->noise.data = 0; + +#ifdef DOT11_N_SUPPORT + if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX) + { + rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS); + } + else +#endif // DOT11_N_SUPPORT // + if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM) + rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4; + else + rate_index = (UCHAR)(pRxBlk->pRxWI->MCS); + if (rate_index < 0) + rate_index = 0; + if (rate_index > 255) + rate_index = 255; + + ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate; + ph->rate.status = 0; + ph->rate.len = 4; + ph->rate.data = ralinkrate[rate_index]; + + ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen; + ph->frmlen.status = 0; + ph->frmlen.len = 4; + ph->frmlen.data = (u_int32_t)pRxBlk->DataSize; + + + pOSPkt->pkt_type = PACKET_OTHERHOST; + pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev); + pOSPkt->ip_summed = CHECKSUM_NONE; + netif_rx(pOSPkt); + + return; + +err_free_sk_buff: + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + +} +#endif // CONFIG_STA_SUPPORT // + + + + +/******************************************************************************* + + File open/close related functions. + + *******************************************************************************/ +RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode) +{ + struct file *filePtr; + + filePtr = filp_open(pPath, flag, 0); + if (IS_ERR(filePtr)) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s(): Error %ld opening %s\n", __FUNCTION__, -PTR_ERR(filePtr), pPath)); + } + + return (RTMP_OS_FD)filePtr; +} + +int RtmpOSFileClose(RTMP_OS_FD osfd) +{ + filp_close(osfd, NULL); + return 0; +} + + +void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset) +{ + osfd->f_pos = offset; +} + + +int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen) +{ + // The object must have a read method + if (osfd->f_op && osfd->f_op->read) + { + return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos); + } + else + { + DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n")); + return -1; + } +} + + +int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen) +{ + return osfd->f_op->write(osfd, pDataPtr, (size_t)writeLen, &osfd->f_pos); +} + + +void RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfo, BOOLEAN bSet) +{ + if (bSet) + { + // Save uid and gid used for filesystem access. + // Set user and group to 0 (root) +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) + pOSFSInfo->fsuid= current->fsuid; + pOSFSInfo->fsgid = current->fsgid; + current->fsuid = current->fsgid = 0; +#else + pOSFSInfo->fsuid = current_fsuid(); + pOSFSInfo->fsgid = current_fsgid(); +#endif + pOSFSInfo->fs = get_fs(); + set_fs(KERNEL_DS); + } + else + { + set_fs(pOSFSInfo->fs); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) + current->fsuid = pOSFSInfo->fsuid; + current->fsgid = pOSFSInfo->fsgid; +#endif + } +} + + + +/******************************************************************************* + + Task create/management/kill related functions. + + *******************************************************************************/ +NDIS_STATUS RtmpOSTaskKill( + IN RTMP_OS_TASK *pTask) +{ + RTMP_ADAPTER *pAd; + int ret = NDIS_STATUS_FAILURE; + + pAd = (RTMP_ADAPTER *)pTask->priv; + +#ifdef KTHREAD_SUPPORT + if (pTask->kthread_task) + { + kthread_stop(pTask->kthread_task); + ret = NDIS_STATUS_SUCCESS; + } +#else + CHECK_PID_LEGALITY(pTask->taskPID) + { + DBGPRINT(RT_DEBUG_TRACE, + ("Terminate the task(%s) with pid(%d)!\n", pTask->taskName, GET_PID_NUMBER(pTask->taskPID))); + mb(); + pTask->task_killed = 1; + mb(); + ret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1); + if (ret) + { + printk(KERN_WARNING "kill task(%s) with pid(%d) failed(retVal=%d)!\n", + pTask->taskName, GET_PID_NUMBER(pTask->taskPID), ret); + } + else + { + wait_for_completion(&pTask->taskComplete); + pTask->taskPID = THREAD_PID_INIT_VALUE; + pTask->task_killed = 0; + RTMP_SEM_EVENT_DESTORY(&pTask->taskSema); + ret = NDIS_STATUS_SUCCESS; + } + } +#endif + + return ret; + +} + + +INT RtmpOSTaskNotifyToExit( + IN RTMP_OS_TASK *pTask) +{ + +#ifndef KTHREAD_SUPPORT + complete_and_exit(&pTask->taskComplete, 0); +#endif + + return 0; +} + + +void RtmpOSTaskCustomize( + IN RTMP_OS_TASK *pTask) +{ + +#ifndef KTHREAD_SUPPORT + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + daemonize((PSTRING)&pTask->taskName[0]/*"%s",pAd->net_dev->name*/); + + allow_signal(SIGTERM); + allow_signal(SIGKILL); + current->flags |= PF_NOFREEZE; +#else + unsigned long flags; + + daemonize(); + reparent_to_init(); + strcpy(current->comm, &pTask->taskName[0]); + + siginitsetinv(¤t->blocked, sigmask(SIGTERM) | sigmask(SIGKILL)); + + /* Allow interception of SIGKILL only + * Don't allow other signals to interrupt the transmission */ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22) + spin_lock_irqsave(¤t->sigmask_lock, flags); + flush_signals(current); + recalc_sigpending(current); + spin_unlock_irqrestore(¤t->sigmask_lock, flags); +#endif +#endif + + RTMP_GET_OS_PID(pTask->taskPID, current->pid); + + /* signal that we've started the thread */ + complete(&pTask->taskComplete); + +#endif +} + + +NDIS_STATUS RtmpOSTaskAttach( + IN RTMP_OS_TASK *pTask, + IN RTMP_OS_TASK_CALLBACK fn, + IN ULONG arg) +{ + NDIS_STATUS status = NDIS_STATUS_SUCCESS; +#ifndef KTHREAD_SUPPORT + pid_t pid_number = -1; +#endif // KTHREAD_SUPPORT // + +#ifdef KTHREAD_SUPPORT + pTask->task_killed = 0; + pTask->kthread_task = NULL; + pTask->kthread_task = kthread_run(fn, (void *)arg, pTask->taskName); + if (IS_ERR(pTask->kthread_task)) + status = NDIS_STATUS_FAILURE; +#else + pid_number = kernel_thread(fn, (void *)arg, RTMP_OS_MGMT_TASK_FLAGS); + if (pid_number < 0) + { + DBGPRINT (RT_DEBUG_ERROR, ("Attach task(%s) failed!\n", pTask->taskName)); + status = NDIS_STATUS_FAILURE; + } + else + { + // Wait for the thread to start + wait_for_completion(&pTask->taskComplete); + status = NDIS_STATUS_SUCCESS; + } +#endif + return status; +} + + +NDIS_STATUS RtmpOSTaskInit( + IN RTMP_OS_TASK *pTask, + IN PSTRING pTaskName, + IN VOID *pPriv) +{ + int len; + + ASSERT(pTask); + +#ifndef KTHREAD_SUPPORT + NdisZeroMemory((PUCHAR)(pTask), sizeof(RTMP_OS_TASK)); +#endif + + len = strlen(pTaskName); + len = len > (RTMP_OS_TASK_NAME_LEN -1) ? (RTMP_OS_TASK_NAME_LEN-1) : len; + NdisMoveMemory(&pTask->taskName[0], pTaskName, len); + pTask->priv = pPriv; + +#ifndef KTHREAD_SUPPORT + RTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema)); + pTask->taskPID = THREAD_PID_INIT_VALUE; + + init_completion (&pTask->taskComplete); +#endif + + return NDIS_STATUS_SUCCESS; +} + + +void RTMP_IndicateMediaState( + IN PRTMP_ADAPTER pAd) +{ + 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); + } +} + + +#if LINUX_VERSION_CODE <= 0x20402 // Red Hat 7.1 +//static struct net_device *alloc_netdev(int sizeof_priv, const char *mask, void (*setup)(struct net_device *)) //sample +struct net_device *alloc_netdev( + int sizeof_priv, + const char *mask, + void (*setup)(struct net_device *)) +{ + struct net_device *dev; + INT alloc_size; + + + /* ensure 32-byte alignment of the private area */ + alloc_size = sizeof (*dev) + sizeof_priv + 31; + + dev = (struct net_device *) kmalloc(alloc_size, GFP_KERNEL); + if (dev == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, + ("alloc_netdev: Unable to allocate device memory.\n")); + return NULL; + } + + memset(dev, 0, alloc_size); + + if (sizeof_priv) + dev->priv = (void *) (((long)(dev + 1) + 31) & ~31); + + setup(dev); + strcpy(dev->name, mask); + + return dev; +} +#endif // LINUX_VERSION_CODE // + + +int RtmpOSWrielessEventSend( + IN RTMP_ADAPTER *pAd, + IN UINT32 eventType, + IN INT flags, + IN PUCHAR pSrcMac, + IN PUCHAR pData, + IN UINT32 dataLen) +{ + union iwreq_data wrqu; + + memset(&wrqu, 0, sizeof(wrqu)); + + if (flags > -1) + wrqu.data.flags = flags; + + if (pSrcMac) + memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN); + + if ((pData!= NULL) && (dataLen > 0)) + wrqu.data.length = dataLen; + + wireless_send_event(pAd->net_dev, eventType, &wrqu, (char *)pData); + return 0; +} + + +int RtmpOSNetDevAddrSet( + IN PNET_DEV pNetDev, + IN PUCHAR pMacAddr) +{ + struct net_device *net_dev; + RTMP_ADAPTER *pAd; + + net_dev = pNetDev; + GET_PAD_FROM_NET_DEV(pAd, net_dev); + +#ifdef CONFIG_STA_SUPPORT + // work-around for the SuSE due to it has it's own interface name management system. + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + NdisZeroMemory(pAd->StaCfg.dev_name, 16); + NdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name, strlen(net_dev->name)); + } +#endif // CONFIG_STA_SUPPORT // + + NdisMoveMemory(net_dev->dev_addr, pMacAddr, 6); + + return 0; +} + + + +/* + * Assign the network dev name for created Ralink WiFi interface. + */ +static int RtmpOSNetDevRequestName( + IN RTMP_ADAPTER *pAd, + IN PNET_DEV dev, + IN PSTRING pPrefixStr, + IN INT devIdx) +{ + PNET_DEV existNetDev; + STRING suffixName[IFNAMSIZ]; + STRING desiredName[IFNAMSIZ]; + int ifNameIdx, prefixLen, slotNameLen; + int Status; + + + prefixLen = strlen(pPrefixStr); + ASSERT((prefixLen < IFNAMSIZ)); + + for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++) + { + memset(suffixName, 0, IFNAMSIZ); + memset(desiredName, 0, IFNAMSIZ); + strncpy(&desiredName[0], pPrefixStr, prefixLen); + +#ifdef MULTIPLE_CARD_SUPPORT + if (pAd->MC_RowID >= 0) + sprintf(suffixName, "%02d_%d", pAd->MC_RowID, ifNameIdx); + else +#endif // MULTIPLE_CARD_SUPPORT // + sprintf(suffixName, "%d", ifNameIdx); + + slotNameLen = strlen(suffixName); + ASSERT(((slotNameLen + prefixLen) < IFNAMSIZ)); + strcat(desiredName, suffixName); + + existNetDev = RtmpOSNetDevGetByName(dev, &desiredName[0]); + if (existNetDev == NULL) + break; + else + RtmpOSNetDeviceRefPut(existNetDev); + } + + if(ifNameIdx < 32) + { +#ifdef HOSTAPD_SUPPORT + pAd->IoctlIF=ifNameIdx; +#endif//HOSTAPD_SUPPORT// + strcpy(&dev->name[0], &desiredName[0]); + Status = NDIS_STATUS_SUCCESS; + } + else + { + DBGPRINT(RT_DEBUG_ERROR, + ("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n", pPrefixStr)); + Status = NDIS_STATUS_FAILURE; + } + + return Status; +} + + +void RtmpOSNetDevClose( + IN PNET_DEV pNetDev) +{ + dev_close(pNetDev); +} + + +void RtmpOSNetDevFree(PNET_DEV pNetDev) +{ + ASSERT(pNetDev); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + free_netdev(pNetDev); +#else + kfree(pNetDev); +#endif +} + + +INT RtmpOSNetDevAlloc( + IN PNET_DEV *new_dev_p, + IN UINT32 privDataSize) +{ + // assign it as null first. + *new_dev_p = NULL; + + DBGPRINT(RT_DEBUG_TRACE, ("Allocate a net device with private data size=%d!\n", privDataSize)); +#if LINUX_VERSION_CODE <= 0x20402 // Red Hat 7.1 + *new_dev_p = alloc_netdev(privDataSize, "eth%d", ether_setup); +#else + *new_dev_p = alloc_etherdev(privDataSize); +#endif // LINUX_VERSION_CODE // + + if (*new_dev_p) + return NDIS_STATUS_SUCCESS; + else + return NDIS_STATUS_FAILURE; +} + + +PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName) +{ + PNET_DEV pTargetNetDev = NULL; + + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26) + pTargetNetDev = dev_get_by_name(dev_net(pNetDev), pDevName); +#else + ASSERT(pNetDev); + pTargetNetDev = dev_get_by_name(pNetDev->nd_net, pDevName); +#endif +#else + pTargetNetDev = dev_get_by_name(pDevName); +#endif // KERNEL_VERSION(2,6,24) // + +#else + int devNameLen; + + devNameLen = strlen(pDevName); + ASSERT((devNameLen <= IFNAMSIZ)); + + for(pTargetNetDev=dev_base; pTargetNetDev!=NULL; pTargetNetDev=pTargetNetDev->next) + { + if (strncmp(pTargetNetDev->name, pDevName, devNameLen) == 0) + break; + } +#endif // KERNEL_VERSION(2,5,0) // + + return pTargetNetDev; +} + + +void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + /* + every time dev_get_by_name is called, and it has returned a valid struct + net_device*, dev_put should be called afterwards, because otherwise the + machine hangs when the device is unregistered (since dev->refcnt > 1). + */ + if(pNetDev) + dev_put(pNetDev); +#endif // LINUX_VERSION_CODE // +} + + +INT RtmpOSNetDevDestory( + IN RTMP_ADAPTER *pAd, + IN PNET_DEV pNetDev) +{ + + // TODO: Need to fix this + printk("WARNING: This function(%s) not implement yet!!!\n", __FUNCTION__); + return 0; +} + + +void RtmpOSNetDevDetach(PNET_DEV pNetDev) +{ + unregister_netdev(pNetDev); +} + + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) +static void RALINK_ET_DrvInfoGet( + IN struct net_device *pDev, + IN struct ethtool_drvinfo *pInfo) +{ + strcpy(pInfo->driver, "RALINK WLAN"); + +#ifdef CONFIG_STA_SUPPORT + strcpy(pInfo->version, STA_DRIVER_VERSION); +#endif // CONFIG_STA_SUPPORT // + + sprintf(pInfo->bus_info, "CSR 0x%lx", pDev->base_addr); +} + +static struct ethtool_ops RALINK_Ethtool_Ops = { + .get_drvinfo = RALINK_ET_DrvInfoGet, +}; + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) +static struct net_device_ops RALINK_Netdev_Ops = { + .ndo_open = NULL, + .ndo_stop = NULL, + .ndo_start_xmit = NULL, + .ndo_get_stats = NULL, + .ndo_set_multicast_list = NULL, + .ndo_do_ioctl = NULL, + .ndo_tx_timeout = NULL, + .ndo_change_mtu = NULL, + .ndo_set_mac_address = NULL, + .ndo_validate_addr = NULL, + }; +#endif +#endif + +int RtmpOSNetDevAttach( + IN PNET_DEV pNetDev, + IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook) +{ + int ret, rtnl_locked = FALSE; + + DBGPRINT(RT_DEBUG_TRACE, ("RtmpOSNetDevAttach()--->\n")); + // If we need hook some callback function to the net device structrue, now do it. + if (pDevOpHook) + { + PRTMP_ADAPTER pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, pNetDev); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) + RALINK_Netdev_Ops.ndo_open = pDevOpHook->open; + RALINK_Netdev_Ops.ndo_stop = pDevOpHook->stop; + RALINK_Netdev_Ops.ndo_start_xmit = (HARD_START_XMIT_FUNC)(pDevOpHook->xmit); + RALINK_Netdev_Ops.ndo_do_ioctl = pDevOpHook->ioctl; +#else + pNetDev->open = pDevOpHook->open; + pNetDev->stop = pDevOpHook->stop; + pNetDev->hard_start_xmit = (HARD_START_XMIT_FUNC)(pDevOpHook->xmit); + pNetDev->do_ioctl = pDevOpHook->ioctl; +#endif + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,18) + pNetDev->ethtool_ops = &RALINK_Ethtool_Ops; +#endif + + /* if you don't implement get_stats, just leave the callback function as NULL, a dummy + function will make kernel panic. + */ + if (pDevOpHook->get_stats) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) + RALINK_Netdev_Ops.ndo_get_stats = pDevOpHook->get_stats; +#else + pNetDev->get_stats = pDevOpHook->get_stats; +#endif + + /* OS specific flags, here we used to indicate if we are virtual interface */ + pNetDev->priv_flags = pDevOpHook->priv_flags; + +#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12) +// pNetDev->get_wireless_stats = rt28xx_get_wireless_stats; + pNetDev->get_wireless_stats = pDevOpHook->get_wstats; +#endif + +#ifdef CONFIG_STA_SUPPORT +#if WIRELESS_EXT >= 12 + if (pAd->OpMode == OPMODE_STA) + { +// pNetDev->wireless_handlers = &rt28xx_iw_handler_def; + pNetDev->wireless_handlers = pDevOpHook->iw_handler; + } +#endif //WIRELESS_EXT >= 12 +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_APSTA_MIXED_SUPPORT +#if WIRELESS_EXT >= 12 + if (pAd->OpMode == OPMODE_AP) + { +// pNetDev->wireless_handlers = &rt28xx_ap_iw_handler_def; + pNetDev->wireless_handlers = pDevOpHook->iw_handler; + } +#endif //WIRELESS_EXT >= 12 +#endif // CONFIG_APSTA_MIXED_SUPPORT // + + // copy the net device mac address to the net_device structure. + NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0], MAC_ADDR_LEN); + + rtnl_locked = pDevOpHook->needProtcted; + +#ifdef RT_CFG80211_SUPPORT + /* + In 2.6.32, cfg80211 register must be "before" register_netdevice(); + We can not put the register in rt28xx_open(); + Or you will suffer NULL pointer in list_add of + cfg80211_netdev_notifier_call(). + */ + RT_CFG80211_REGISTER(pAd, pAd->pCfgDev, pNetDev); +#endif // RT_CFG80211_SUPPORT // + } + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31) + RALINK_Netdev_Ops.ndo_validate_addr = NULL; + pNetDev->netdev_ops = &RALINK_Netdev_Ops; +#else + pNetDev->validate_addr = NULL; +#endif +#endif + + if (rtnl_locked) + ret = register_netdevice(pNetDev); + else + ret = register_netdev(pNetDev); + + DBGPRINT(RT_DEBUG_TRACE, ("<---RtmpOSNetDevAttach(), ret=%d\n", ret)); + if (ret == 0) + return NDIS_STATUS_SUCCESS; + else + return NDIS_STATUS_FAILURE; +} + + +PNET_DEV RtmpOSNetDevCreate( + IN RTMP_ADAPTER *pAd, + IN INT devType, + IN INT devNum, + IN INT privMemSize, + IN PSTRING pNamePrefix) +{ + struct net_device *pNetDev = NULL; + int status; + + + /* allocate a new network device */ + status = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize*/); + if (status != NDIS_STATUS_SUCCESS) + { + /* allocation fail, exit */ + DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (%s)...\n", pNamePrefix)); + return NULL; + } + + + /* find a available interface name, max 32 interfaces */ + status = RtmpOSNetDevRequestName(pAd, pNetDev, pNamePrefix, devNum); + if (status != NDIS_STATUS_SUCCESS) + { + /* error! no any available ra name can be used! */ + DBGPRINT(RT_DEBUG_ERROR, ("Assign interface name (%s with suffix 0~32) failed...\n", pNamePrefix)); + RtmpOSNetDevFree(pNetDev); + + return NULL; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("The name of the new %s interface is %s...\n", pNamePrefix, pNetDev->name)); + } + + return pNetDev; +} + + +// OS_ABL_SUPPORT +// not yet support MBSS +PNET_DEV get_netdev_from_bssid( + IN PRTMP_ADAPTER pAd, + IN UCHAR FromWhichBSSID) +{ + PNET_DEV dev_p = NULL; + + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + dev_p = pAd->net_dev; + } +#endif // CONFIG_STA_SUPPORT // + + ASSERT(dev_p); + return dev_p; /* return one of MBSS */ +} + + + +/* +======================================================================== +Routine Description: + Allocate memory for adapter control block. + +Arguments: + pAd Pointer to our adapter + +Return Value: + NDIS_STATUS_SUCCESS + NDIS_STATUS_FAILURE + NDIS_STATUS_RESOURCES + +Note: +======================================================================== +*/ +NDIS_STATUS AdapterBlockAllocateMemory( + IN PVOID handle, + OUT PVOID *ppAd) +{ + + *ppAd = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); //pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr); + + if (*ppAd) + { + NdisZeroMemory(*ppAd, sizeof(RTMP_ADAPTER)); + ((PRTMP_ADAPTER)*ppAd)->OS_Cookie = handle; + return (NDIS_STATUS_SUCCESS); + } else { + return (NDIS_STATUS_FAILURE); + } +} + + +/* export utility function symbol list */ +#ifdef OS_ABL_SUPPORT + +EXPORT_SYMBOL(RTDebugLevel); +EXPORT_SYMBOL(RALINK_OUI); + + +EXPORT_SYMBOL(RtmpOSTaskNotifyToExit); + +EXPORT_SYMBOL(RTMPFreeNdisPacket); +EXPORT_SYMBOL(AdapterBlockAllocateMemory); +EXPORT_SYMBOL(RTMP_IndicateMediaState); + +EXPORT_SYMBOL(RTMP_SetPeriodicTimer); +EXPORT_SYMBOL(RTMP_OS_Add_Timer); +EXPORT_SYMBOL(RTMP_OS_Mod_Timer); +EXPORT_SYMBOL(RTMP_OS_Del_Timer); +EXPORT_SYMBOL(RTMP_OS_Init_Timer); + +EXPORT_SYMBOL(os_alloc_mem); +EXPORT_SYMBOL(os_free_mem); + +EXPORT_SYMBOL(ExpandPacket); +EXPORT_SYMBOL(ClonePacket); +EXPORT_SYMBOL(RTMP_AllocateFragPacketBuffer); +EXPORT_SYMBOL(announce_802_3_packet); +EXPORT_SYMBOL(Sniff2BytesFromNdisBuffer); +EXPORT_SYMBOL(RtmpOSNetPktAlloc); +EXPORT_SYMBOL(duplicate_pkt); +EXPORT_SYMBOL(duplicate_pkt_with_TKIP_MIC); +EXPORT_SYMBOL(DuplicatePacket); +EXPORT_SYMBOL(wlan_802_11_to_802_3_packet); +EXPORT_SYMBOL(RTMPAllocateNdisPacket); +EXPORT_SYMBOL(update_os_packet_info); +EXPORT_SYMBOL(RTMP_QueryPacketInfo); + +EXPORT_SYMBOL(RtmpOSNetDevCreate); +EXPORT_SYMBOL(RtmpOSNetDevAddrSet); +EXPORT_SYMBOL(RtmpOSNetDevClose); +EXPORT_SYMBOL(RtmpOSNetDevAttach); +EXPORT_SYMBOL(RtmpOSNetDevDetach); +EXPORT_SYMBOL(RtmpOSNetDevFree); + +EXPORT_SYMBOL(RtmpOSFileOpen); +EXPORT_SYMBOL(RtmpOSFSInfoChange); +EXPORT_SYMBOL(RtmpOSFileWrite); +EXPORT_SYMBOL(RtmpOSFileRead); +EXPORT_SYMBOL(RtmpOSFileClose); +EXPORT_SYMBOL(RtmpOSFileSeek); + +EXPORT_SYMBOL(RtmpOSTaskInit); +EXPORT_SYMBOL(RtmpOSTaskAttach); +EXPORT_SYMBOL(RtmpOSTaskCustomize); +EXPORT_SYMBOL(RtmpOSTaskKill); + +EXPORT_SYMBOL(get_netdev_from_bssid); +EXPORT_SYMBOL(hex_dump); +EXPORT_SYMBOL(RTMPFreeAdapter); +EXPORT_SYMBOL(RTMP_GetCurrentSystemTime); +EXPORT_SYMBOL(RTMPSendWirelessEvent); +EXPORT_SYMBOL(RTMPusecDelay); +EXPORT_SYMBOL(RtmpOSWrielessEventSend); + + +#ifdef CONFIG_STA_SUPPORT +EXPORT_SYMBOL(send_monitor_packets); +#endif // CONFIG_STA_SUPPORT // + +#ifdef RTMP_MAC_PCI +EXPORT_SYMBOL(RTMP_AllocateMgmtDescMemory); +EXPORT_SYMBOL(RTMP_AllocateRxPacketBuffer); +EXPORT_SYMBOL(RTMP_FreeDescMemory); +EXPORT_SYMBOL(RTMP_AllocateTxDescMemory); +EXPORT_SYMBOL(linux_pci_unmap_single); +EXPORT_SYMBOL(RTMP_AllocateFirstTxBuffer); +EXPORT_SYMBOL(linux_pci_map_single); +EXPORT_SYMBOL(RTMP_AllocateRxDescMemory); +EXPORT_SYMBOL(RTMP_FreeFirstTxBuffer); +#endif // RTMP_MAC_PCI // + + + +#endif // OS_ABL_SUPPORT // diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_linux.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_linux.o new file mode 100644 index 0000000000000000000000000000000000000000..fc883197432d64df016f0aee386bbbc033a50c43 GIT binary patch literal 21561 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 V2QS;oD~T^jEY3zx_nFD53;+T92NnPT literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_main_dev.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_main_dev.c new file mode 100644 index 000000000..5e3058179 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_main_dev.c @@ -0,0 +1,1004 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt_main_dev.c + + Abstract: + Create and register network interface. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#include "rt_config.h" + + +#ifdef CONFIG_APSTA_MIXED_SUPPORT +UINT32 CW_MAX_IN_BITS; +#endif // CONFIG_APSTA_MIXED_SUPPORT // + +/*---------------------------------------------------------------------*/ +/* Private Variables Used */ +/*---------------------------------------------------------------------*/ + +PSTRING mac = ""; // default 00:00:00:00:00:00 +PSTRING hostname = ""; // default CMPC +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,12) +MODULE_PARM (mac, "s"); +#else +module_param (mac, charp, 0); +#endif +MODULE_PARM_DESC (mac, "rt28xx: wireless mac addr"); + +#ifdef OS_ABL_SUPPORT +UCHAR ZERO_MAC_ADDR[MAC_ADDR_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#endif // OS_ABL_SUPPORT // + + +/*---------------------------------------------------------------------*/ +/* Prototypes of Functions Used */ +/*---------------------------------------------------------------------*/ + +// public function prototype +int rt28xx_close(IN struct net_device *net_dev); +int rt28xx_open(struct net_device *net_dev); + +// private function prototype +static INT rt28xx_send_packets(IN struct sk_buff *skb_p, IN struct net_device *net_dev); + + +static struct net_device_stats *RT28xx_get_ether_stats( + IN struct net_device *net_dev); + +/* +======================================================================== +Routine Description: + Close raxx interface. + +Arguments: + *net_dev the raxx interface pointer + +Return Value: + 0 Open OK + otherwise Open Fail + +Note: + 1. if open fail, kernel will not call the close function. + 2. Free memory for + (1) Mlme Memory Handler: MlmeHalt() + (2) TX & RX: RTMPFreeTxRxRingMemory() + (3) BA Reordering: ba_reordering_resource_release() +======================================================================== +*/ +int MainVirtualIF_close(IN struct net_device *net_dev) +{ + RTMP_ADAPTER *pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + // Sanity check for pAd + if (pAd == NULL) + return 0; // close ok + + netif_carrier_off(pAd->net_dev); + netif_stop_queue(pAd->net_dev); + + + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + BOOLEAN Cancelled; +#ifdef QOS_DLS_SUPPORT + // send DLS-TEAR_DOWN message, + if (pAd->CommonCfg.bDLSCapable) + { + UCHAR i; + + // tear down local dls table entry + for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + } + } + + // tear down peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + } + } + RTMP_MLME_HANDLER(pAd); + } +#endif // QOS_DLS_SUPPORT // + + if (INFRA_ON(pAd) && + (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))) + { + MLME_DISASSOC_REQ_STRUCT DisReq; + MLME_QUEUE_ELEM *MsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); + + if (MsgElem) + { + COPY_MAC_ADDR(DisReq.Addr, pAd->CommonCfg.Bssid); + DisReq.Reason = REASON_DEAUTH_STA_LEAVING; + + MsgElem->Machine = ASSOC_STATE_MACHINE; + MsgElem->MsgType = MT2_MLME_DISASSOC_REQ; + MsgElem->MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT); + NdisMoveMemory(MsgElem->Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT)); + + // Prevent to connect AP again in STAMlmePeriodicExec + pAd->MlmeAux.AutoReconnectSsidLen= 32; + NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; + MlmeDisassocReqAction(pAd, MsgElem); + kfree(MsgElem); + } + + RTMPusecDelay(1000); + } + + RTMPCancelTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, &Cancelled); + RTMPCancelTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, &Cancelled); + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + // send wireless event to wpa_supplicant for infroming interface down. + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_INTERFACE_DOWN, NULL, NULL, 0); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + + if (pAd->StaCfg.pWpsProbeReqIe) + { + kfree(pAd->StaCfg.pWpsProbeReqIe); + pAd->StaCfg.pWpsProbeReqIe = NULL; + pAd->StaCfg.WpsProbeReqIeLen = 0; + } + + if (pAd->StaCfg.pWpaAssocIe) + { + kfree(pAd->StaCfg.pWpaAssocIe); + pAd->StaCfg.pWpaAssocIe = NULL; + pAd->StaCfg.WpaAssocIeLen = 0; + } +#endif // WPA_SUPPLICANT_SUPPORT // + + + } +#endif // CONFIG_STA_SUPPORT // + + VIRTUAL_IF_DOWN(pAd); + + RT_MOD_DEC_USE_COUNT(); + + return 0; // close ok +} + +/* +======================================================================== +Routine Description: + Open raxx interface. + +Arguments: + *net_dev the raxx interface pointer + +Return Value: + 0 Open OK + otherwise Open Fail + +Note: + 1. if open fail, kernel will not call the close function. + 2. Free memory for + (1) Mlme Memory Handler: MlmeHalt() + (2) TX & RX: RTMPFreeTxRxRingMemory() + (3) BA Reordering: ba_reordering_resource_release() +======================================================================== +*/ +int MainVirtualIF_open(IN struct net_device *net_dev) +{ + RTMP_ADAPTER *pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + // Sanity check for pAd + if (pAd == NULL) + return 0; // close ok + + if (VIRTUAL_IF_UP(pAd) != 0) + return -1; + + // increase MODULE use count + RT_MOD_INC_USE_COUNT(); + + netif_start_queue(net_dev); + netif_carrier_on(net_dev); + netif_wake_queue(net_dev); + + return 0; +} + +/* +======================================================================== +Routine Description: + Close raxx interface. + +Arguments: + *net_dev the raxx interface pointer + +Return Value: + 0 Open OK + otherwise Open Fail + +Note: + 1. if open fail, kernel will not call the close function. + 2. Free memory for + (1) Mlme Memory Handler: MlmeHalt() + (2) TX & RX: RTMPFreeTxRxRingMemory() + (3) BA Reordering: ba_reordering_resource_release() +======================================================================== +*/ +int rt28xx_close(IN PNET_DEV dev) +{ + struct net_device * net_dev = (struct net_device *)dev; + RTMP_ADAPTER *pAd = NULL; + BOOLEAN Cancelled; + UINT32 i = 0; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + DBGPRINT(RT_DEBUG_TRACE, ("===> rt28xx_close\n")); + + Cancelled = FALSE; + // Sanity check for pAd + if (pAd == NULL) + return 0; // close ok + + + +#ifdef WDS_SUPPORT + WdsDown(pAd); +#endif // WDS_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef PCIE_PS_SUPPORT + RTMPPCIeLinkCtrlValueRestore(pAd, RESTORE_CLOSE); +#endif // PCIE_PS_SUPPORT // + + // If dirver doesn't wake up firmware here, + // NICLoadFirmware will hang forever when interface is up again. + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { + AsicForceWakeup(pAd, TRUE); + } + + + MlmeRadioOff(pAd); +#ifdef RTMP_MAC_PCI + pAd->bPCIclkOff = FALSE; +#endif // RTMP_MAC_PCI // + } +#endif // CONFIG_STA_SUPPORT // + + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); + + for (i = 0 ; i < NUM_OF_TX_RING; i++) + { + while (pAd->DeQueueRunning[i] == TRUE) + { + DBGPRINT(RT_DEBUG_TRACE, ("Waiting for TxQueue[%d] done..........\n", i)); + RTMPusecDelay(1000); + } + } + + + + // Stop Mlme state machine + MlmeHalt(pAd); + + // Close net tasklets + RtmpNetTaskExit(pAd); + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + MacTableReset(pAd); + } +#endif // CONFIG_STA_SUPPORT // + + + MeasureReqTabExit(pAd); + TpcReqTabExit(pAd); + + + // Close kernel threads + RtmpMgmtTaskExit(pAd); + +#ifdef RTMP_MAC_PCI + { + BOOLEAN brc; + // ULONG Value; + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) + { + RTMP_ASIC_INTERRUPT_DISABLE(pAd); + } + + // Receive packets to clear DMA index after disable interrupt. + //RTMPHandleRxDoneInterrupt(pAd); + // put to radio off to save power when driver unload. After radiooff, can't write /read register. So need to finish all + // register access before Radio off. + + + brc=RT28xxPciAsicRadioOff(pAd, RTMP_HALT, 0); + +//In solution 3 of 3090F, the bPCIclkOff will be set to TRUE after calling RT28xxPciAsicRadioOff +#ifdef PCIE_PS_SUPPORT + pAd->bPCIclkOff = FALSE; +#endif // PCIE_PS_SUPPORT // + + if (brc==FALSE) + { + DBGPRINT(RT_DEBUG_ERROR,("%s call RT28xxPciAsicRadioOff fail !!\n", __FUNCTION__)); + } + } + + +/* + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) + { + RTMP_ASIC_INTERRUPT_DISABLE(pAd); + } + + // Disable Rx, register value supposed will remain after reset + NICIssueReset(pAd); +*/ +#endif // RTMP_MAC_PCI // + + // Free IRQ + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { +#ifdef RTMP_MAC_PCI + // Deregister interrupt function + RtmpOSIRQRelease(net_dev); +#endif // RTMP_MAC_PCI // + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); + } + + // Free Ring or USB buffers + RTMPFreeTxRxRingMemory(pAd); + + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); + +#ifdef DOT11_N_SUPPORT + // Free BA reorder resource + ba_reordering_resource_release(pAd); +#endif // DOT11_N_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_START_UP); + +/*+++Modify by woody to solve the bulk fail+++*/ +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { +#ifdef RT35xx + if (IS_RT3572(pAd)) + { + RT30xxWriteRFRegister(pAd, RF_R08, 0x00); + AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02); + } +#endif // RT35xx // + } +#endif // CONFIG_STA_SUPPORT // + +#ifdef VENDOR_FEATURE2_SUPPORT + printk("Number of Packet Allocated = %d\n", pAd->NumOfPktAlloc); + printk("Number of Packet Freed = %d\n", pAd->NumOfPktFree); +#endif // VENDOR_FEATURE2_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("<=== rt28xx_close\n")); + return 0; // close ok +} /* End of rt28xx_close */ + + +/* +======================================================================== +Routine Description: + Open raxx interface. + +Arguments: + *net_dev the raxx interface pointer + +Return Value: + 0 Open OK + otherwise Open Fail + +Note: +======================================================================== +*/ +int rt28xx_open(IN PNET_DEV dev) +{ + struct net_device * net_dev = (struct net_device *)dev; + PRTMP_ADAPTER pAd = NULL; + int retval = 0; + //POS_COOKIE pObj; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + // Sanity check for pAd + if (pAd == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -1; + } + +#ifdef CONFIG_APSTA_MIXED_SUPPORT + if (pAd->OpMode == OPMODE_AP) + { + CW_MAX_IN_BITS = 6; + } + else if (pAd->OpMode == OPMODE_STA) + { + CW_MAX_IN_BITS = 10; + } +#endif // CONFIG_APSTA_MIXED_SUPPORT // + +#if WIRELESS_EXT >= 12 + if (net_dev->priv_flags == INT_MAIN) + { +#ifdef CONFIG_APSTA_MIXED_SUPPORT + if (pAd->OpMode == OPMODE_AP) + net_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_ap_iw_handler_def; +#endif // CONFIG_APSTA_MIXED_SUPPORT // +#ifdef CONFIG_STA_SUPPORT + if (pAd->OpMode == OPMODE_STA) + net_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_iw_handler_def; +#endif // CONFIG_STA_SUPPORT // + } +#endif // WIRELESS_EXT >= 12 // + + // Request interrupt service routine for PCI device + // register the interrupt routine with the os + RtmpOSIRQRequest(net_dev); + + + // Init IRQ parameters stored in pAd + RTMP_IRQ_INIT(pAd); + + // Chip & other init + if (rt28xx_init(pAd, mac, hostname) == FALSE) + goto err; + +#ifdef RT_CFG80211_SUPPORT + RT_CFG80211_REINIT(pAd); + RT_CFG80211_CRDA_REG_RULE_APPLY(pAd); +#endif // RT_CFG80211_SUPPORT // + +#ifdef CONFIG_STA_SUPPORT +#endif // CONFIG_STA_SUPPORT // + + // Enable Interrupt + RTMP_IRQ_ENABLE(pAd); + + // Now Enable RxTx + RTMPEnableRxTx(pAd); + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP); + + { + UINT32 reg = 0; + RTMP_IO_READ32(pAd, 0x1300, ®); // clear garbage interrupts + printk("0x1300 = %08x\n", reg); + } + + { +// u32 reg; +// UINT8 byte; +// u16 tmp; + +// RTMP_IO_READ32(pAd, XIFS_TIME_CFG, ®); + +// tmp = 0x0805; +// reg = (reg & 0xffff0000) | tmp; +// RTMP_IO_WRITE32(pAd, XIFS_TIME_CFG, reg); + + } + + +#ifdef CONFIG_STA_SUPPORT +#ifdef PCIE_PS_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + RTMPInitPCIeLinkCtrlValue(pAd); +#endif // PCIE_PS_SUPPORT // + + +#endif // CONFIG_STA_SUPPORT // + + +#ifdef VENDOR_FEATURE2_SUPPORT + printk("Number of Packet Allocated in open = %d\n", pAd->NumOfPktAlloc); + printk("Number of Packet Freed in open = %d\n", pAd->NumOfPktFree); +#endif // VENDOR_FEATURE2_SUPPORT // + + return (retval); + +err: +//+++Add by shiang, move from rt28xx_init() to here. + RtmpOSIRQRelease(net_dev); +//---Add by shiang, move from rt28xx_init() to here. + return (-1); +} /* End of rt28xx_open */ + + +PNET_DEV RtmpPhyNetDevInit( + IN RTMP_ADAPTER *pAd, + IN RTMP_OS_NETDEV_OP_HOOK *pNetDevHook) +{ + struct net_device *net_dev = NULL; +// NDIS_STATUS Status; + + net_dev = RtmpOSNetDevCreate(pAd, INT_MAIN, 0, sizeof(PRTMP_ADAPTER), INF_MAIN_DEV_NAME); + if (net_dev == NULL) + { + printk("RtmpPhyNetDevInit(): creation failed for main physical net device!\n"); + return NULL; + } + + NdisZeroMemory((unsigned char *)pNetDevHook, sizeof(RTMP_OS_NETDEV_OP_HOOK)); + pNetDevHook->open = MainVirtualIF_open; + pNetDevHook->stop = MainVirtualIF_close; + pNetDevHook->xmit = rt28xx_send_packets; +#ifdef IKANOS_VX_1X0 + pNetDevHook->xmit = IKANOS_DataFramesTx; +#endif // IKANOS_VX_1X0 // + pNetDevHook->ioctl = rt28xx_ioctl; + pNetDevHook->priv_flags = INT_MAIN; + pNetDevHook->get_stats = RT28xx_get_ether_stats; + + pNetDevHook->needProtcted = FALSE; + +#if (WIRELESS_EXT < 21) && (WIRELESS_EXT >= 12) + pNetDevHook->get_wstats = rt28xx_get_wireless_stats; +#endif + +#ifdef CONFIG_STA_SUPPORT +#if WIRELESS_EXT >= 12 + if (pAd->OpMode == OPMODE_STA) + { + pNetDevHook->iw_handler = (void *)&rt28xx_iw_handler_def; + } +#endif //WIRELESS_EXT >= 12 +#endif // CONFIG_STA_SUPPORT // + +#ifdef CONFIG_APSTA_MIXED_SUPPORT +#if WIRELESS_EXT >= 12 + if (pAd->OpMode == OPMODE_AP) + { + pNetDevHook->iw_handler = &rt28xx_ap_iw_handler_def; + } +#endif //WIRELESS_EXT >= 12 +#endif // CONFIG_APSTA_MIXED_SUPPORT // + + RTMP_OS_NETDEV_SET_PRIV(net_dev, pAd); + pAd->net_dev = net_dev; + + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24) + SET_MODULE_OWNER(net_dev); +#endif + + netif_stop_queue(net_dev); + + return net_dev; + +} + + +/* +======================================================================== +Routine Description: + The entry point for Linux kernel sent packet to our driver. + +Arguments: + sk_buff *skb the pointer refer to a sk_buffer. + +Return Value: + 0 + +Note: + This function is the entry point of Tx Path for Os delivery packet to + our driver. You only can put OS-depened & STA/AP common handle procedures + in here. +======================================================================== +*/ +int rt28xx_packet_xmit(struct sk_buff *skb) +{ + struct net_device *net_dev = skb->dev; + PRTMP_ADAPTER pAd = NULL; + int status = 0; + PNDIS_PACKET pPacket = (PNDIS_PACKET) skb; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + /* 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 // + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + // Drop send request since we are in monitor mode + if (MONITOR_ON(pAd)) + { + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + goto done; + } + } +#endif // CONFIG_STA_SUPPORT // + + // EapolStart size is 18 + if (skb->len < 14) + { + //printk("bad packet size: %d\n", pkt->len); + hex_dump("bad packet", skb->data, skb->len); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + goto done; + } + + + + RTMP_SET_PACKET_5VT(pPacket, 0); +// MiniportMMRequest(pAd, pkt->data, pkt->len); +#ifdef CONFIG_5VT_ENHANCE + if (*(int*)(skb->cb) == BRIDGE_TAG) { + RTMP_SET_PACKET_5VT(pPacket, 1); + } +#endif + + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + + STASendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1); + } + +#endif // CONFIG_STA_SUPPORT // + + status = 0; +done: + + return status; +} + + +/* +======================================================================== +Routine Description: + Send a packet to WLAN. + +Arguments: + skb_p points to our adapter + dev_p which WLAN network interface + +Return Value: + 0: transmit successfully + otherwise: transmit fail + +Note: +======================================================================== +*/ +static int rt28xx_send_packets( + IN struct sk_buff *skb_p, + IN struct net_device *net_dev) +{ + RTMP_ADAPTER *pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + if (!(RTMP_OS_NETDEV_STATE_RUNNING(net_dev))) + { + RELEASE_NDIS_PACKET(pAd, (PNDIS_PACKET)skb_p, NDIS_STATUS_FAILURE); + return 0; + } + + NdisZeroMemory((PUCHAR)&skb_p->cb[CB_OFF], 15); + RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID); + + MEM_DBG_PKT_ALLOC_INC(pAd); + + return rt28xx_packet_xmit(skb_p); +} + + +#if WIRELESS_EXT >= 12 +// This function will be called when query /proc +struct iw_statistics *rt28xx_get_wireless_stats( + IN struct net_device *net_dev) +{ + PRTMP_ADAPTER pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + + DBGPRINT(RT_DEBUG_TRACE, ("rt28xx_get_wireless_stats --->\n")); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + return NULL; + + pAd->iw_stats.status = 0; // Status - device dependent for now + + // link quality +#ifdef CONFIG_STA_SUPPORT + if (pAd->OpMode == OPMODE_STA) + pAd->iw_stats.qual.qual = ((pAd->Mlme.ChannelQuality * 12)/10 + 10); +#endif // CONFIG_STA_SUPPORT // + + if(pAd->iw_stats.qual.qual > 100) + pAd->iw_stats.qual.qual = 100; + +#ifdef CONFIG_STA_SUPPORT + if (pAd->OpMode == OPMODE_STA) + { + pAd->iw_stats.qual.level = + RTMPMaxRssi(pAd, pAd->StaCfg.RssiSample.LastRssi0, + pAd->StaCfg.RssiSample.LastRssi1, + pAd->StaCfg.RssiSample.LastRssi2); + } +#endif // CONFIG_STA_SUPPORT // + + pAd->iw_stats.qual.noise = pAd->BbpWriteLatch[66]; // noise level (dBm) + + pAd->iw_stats.qual.noise += 256 - 143; + pAd->iw_stats.qual.updated = 1; // Flags to know if updated +#ifdef IW_QUAL_DBM + pAd->iw_stats.qual.updated |= IW_QUAL_DBM; // Level + Noise are dBm +#endif // IW_QUAL_DBM // + + pAd->iw_stats.discard.nwid = 0; // Rx : Wrong nwid/essid + pAd->iw_stats.miss.beacon = 0; // Missed beacons/superframe + + DBGPRINT(RT_DEBUG_TRACE, ("<--- rt28xx_get_wireless_stats\n")); + return &pAd->iw_stats; +} +#endif // WIRELESS_EXT // + + +void tbtt_tasklet(unsigned long data) +{ +//#define MAX_TX_IN_TBTT (16) + +} + +INT rt28xx_ioctl( + IN PNET_DEV net_dev, + IN OUT struct ifreq *rq, + IN INT cmd) +{ + RTMP_ADAPTER *pAd = NULL; + INT ret = 0; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + if (pAd == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + ret = rt28xx_sta_ioctl(net_dev, rq, cmd); + } +#endif // CONFIG_STA_SUPPORT // + + return ret; +} + + +/* + ======================================================================== + + Routine Description: + return ethernet statistics counter + + Arguments: + net_dev Pointer to net_device + + Return Value: + net_device_stats* + + Note: + + ======================================================================== +*/ +static struct net_device_stats *RT28xx_get_ether_stats( + IN struct net_device *net_dev) +{ + RTMP_ADAPTER *pAd = NULL; + + if (net_dev) + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + if (pAd) + { + + pAd->stats.rx_packets = pAd->WlanCounters.ReceivedFragmentCount.QuadPart; + pAd->stats.tx_packets = pAd->WlanCounters.TransmittedFragmentCount.QuadPart; + + pAd->stats.rx_bytes = pAd->RalinkCounters.ReceivedByteCount; + pAd->stats.tx_bytes = pAd->RalinkCounters.TransmittedByteCount; + + pAd->stats.rx_errors = pAd->Counters8023.RxErrors; + pAd->stats.tx_errors = pAd->Counters8023.TxErrors; + + pAd->stats.rx_dropped = 0; + pAd->stats.tx_dropped = 0; + + pAd->stats.multicast = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart; // multicast packets received + pAd->stats.collisions = pAd->Counters8023.OneCollision + pAd->Counters8023.MoreCollisions; // Collision packets + + pAd->stats.rx_length_errors = 0; + pAd->stats.rx_over_errors = pAd->Counters8023.RxNoBuffer; // receiver ring buff overflow + pAd->stats.rx_crc_errors = 0;//pAd->WlanCounters.FCSErrorCount; // recved pkt with crc error + pAd->stats.rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors; // recv'd frame alignment error + pAd->stats.rx_fifo_errors = pAd->Counters8023.RxNoBuffer; // recv'r fifo overrun + pAd->stats.rx_missed_errors = 0; // receiver missed packet + + // detailed tx_errors + pAd->stats.tx_aborted_errors = 0; + pAd->stats.tx_carrier_errors = 0; + pAd->stats.tx_fifo_errors = 0; + pAd->stats.tx_heartbeat_errors = 0; + pAd->stats.tx_window_errors = 0; + + // for cslip etc + pAd->stats.rx_compressed = 0; + pAd->stats.tx_compressed = 0; + + return &pAd->stats; + } + else + return NULL; +} + + +BOOLEAN RtmpPhyNetDevExit( + IN RTMP_ADAPTER *pAd, + IN PNET_DEV net_dev) +{ + + + +#ifdef INF_AMAZON_PPA + if (ppa_hook_directpath_register_dev_fn && pAd->PPAEnable==TRUE) + { + UINT status; + status=ppa_hook_directpath_register_dev_fn(&pAd->g_if_id, pAd->net_dev, NULL, PPA_F_DIRECTPATH_DEREGISTER); + printk("unregister PPA:g_if_id=%d status=%d\n",pAd->g_if_id,status); + } + kfree(pAd->pDirectpathCb); +#endif // INF_AMAZON_PPA // + + // Unregister network device + if (net_dev != NULL) + { + printk("RtmpOSNetDevDetach(): RtmpOSNetDeviceDetach(), dev->name=%s!\n", net_dev->name); + RtmpOSNetDevDetach(net_dev); + } + + return TRUE; + +} + + +/******************************************************************************* + + Device IRQ related functions. + + *******************************************************************************/ +int RtmpOSIRQRequest(IN PNET_DEV pNetDev) +{ + struct net_device *net_dev = NULL; + PRTMP_ADAPTER pAd = NULL; + int retval = 0; + + net_dev = pNetDev; + + GET_PAD_FROM_NET_DEV(pAd, pNetDev); + + ASSERT(pAd); + +#ifdef RTMP_PCI_SUPPORT + if (pAd->infType == RTMP_DEV_INF_PCI || pAd->infType == RTMP_DEV_INF_PCIE) + { + POS_COOKIE _pObj = (POS_COOKIE)(pAd->OS_Cookie); + RTMP_MSI_ENABLE(pAd); + retval = request_irq(_pObj->pci_dev->irq, rt2860_interrupt, SA_SHIRQ, (net_dev)->name, (net_dev)); + if (retval != 0) + printk("RT2860: request_irq ERROR(%d)\n", retval); + } +#endif // RTMP_PCI_SUPPORT // + + + return retval; + +} + + +int RtmpOSIRQRelease(IN PNET_DEV pNetDev) +{ + struct net_device *net_dev = pNetDev; + PRTMP_ADAPTER pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + ASSERT(pAd); + +#ifdef RTMP_PCI_SUPPORT + if (pAd->infType == RTMP_DEV_INF_PCI || pAd->infType == RTMP_DEV_INF_PCIE) + { + POS_COOKIE pObj = (POS_COOKIE)(pAd->OS_Cookie); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + synchronize_irq(pObj->pci_dev->irq); +#endif + free_irq(pObj->pci_dev->irq, (net_dev)); + RTMP_MSI_DISABLE(pAd); + } +#endif // RTMP_PCI_SUPPORT // + + + return 0; +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_main_dev.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_main_dev.o new file mode 100644 index 0000000000000000000000000000000000000000..a91f05d1c544a94980f14513ce7e016f6529182d GIT binary patch literal 8520 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 literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_pci_rbus.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_pci_rbus.c new file mode 100644 index 000000000..466966e3a --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_pci_rbus.c @@ -0,0 +1,928 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt_pci_rbus.c + + Abstract: + Create and register network interface. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ + +#include <rt_config.h> +#include <linux/pci.h> + + +IRQ_HANDLE_TYPE +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) +rt2860_interrupt(int irq, void *dev_instance); +#else +rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs); +#endif + + +static void rx_done_tasklet(unsigned long data); +static void mgmt_dma_done_tasklet(unsigned long data); +static void ac0_dma_done_tasklet(unsigned long data); +static void ac1_dma_done_tasklet(unsigned long data); +static void ac2_dma_done_tasklet(unsigned long data); +static void ac3_dma_done_tasklet(unsigned long data); +static void hcca_dma_done_tasklet(unsigned long data); +static void fifo_statistic_full_tasklet(unsigned long data); + + + +/*---------------------------------------------------------------------*/ +/* Symbol & Macro Definitions */ +/*---------------------------------------------------------------------*/ +#define RT2860_INT_RX_DLY (1<<0) // bit 0 +#define RT2860_INT_TX_DLY (1<<1) // bit 1 +#define RT2860_INT_RX_DONE (1<<2) // bit 2 +#define RT2860_INT_AC0_DMA_DONE (1<<3) // bit 3 +#define RT2860_INT_AC1_DMA_DONE (1<<4) // bit 4 +#define RT2860_INT_AC2_DMA_DONE (1<<5) // bit 5 +#define RT2860_INT_AC3_DMA_DONE (1<<6) // bit 6 +#define RT2860_INT_HCCA_DMA_DONE (1<<7) // bit 7 +#define RT2860_INT_MGMT_DONE (1<<8) // bit 8 +#ifdef TONE_RADAR_DETECT_SUPPORT +#define RT2860_INT_TONE_RADAR (1<<20) // bit 20 +#endif // TONE_RADAR_DETECT_SUPPORT // + +#define INT_RX RT2860_INT_RX_DONE + +#define INT_AC0_DLY (RT2860_INT_AC0_DMA_DONE) //| RT2860_INT_TX_DLY) +#define INT_AC1_DLY (RT2860_INT_AC1_DMA_DONE) //| RT2860_INT_TX_DLY) +#define INT_AC2_DLY (RT2860_INT_AC2_DMA_DONE) //| RT2860_INT_TX_DLY) +#define INT_AC3_DLY (RT2860_INT_AC3_DMA_DONE) //| RT2860_INT_TX_DLY) +#define INT_HCCA_DLY (RT2860_INT_HCCA_DMA_DONE) //| RT2860_INT_TX_DLY) +#define INT_MGMT_DLY RT2860_INT_MGMT_DONE +#ifdef TONE_RADAR_DETECT_SUPPORT +#define INT_TONE_RADAR (RT2860_INT_TONE_RADAR) +#endif // TONE_RADAR_DETECT_SUPPORT // + + +/*************************************************************************** + * + * Interface-depended memory allocation/Free related procedures. + * Mainly for Hardware TxDesc/RxDesc/MgmtDesc, DMA Memory for TxData/RxData, etc., + * + **************************************************************************/ + + + +VOID Invalid_Remaining_Packet( + IN PRTMP_ADAPTER pAd, + IN ULONG VirtualAddress) +{ + NDIS_PHYSICAL_ADDRESS PhysicalAddress; + + PhysicalAddress = PCI_MAP_SINGLE(pAd, (void *)(VirtualAddress+1600), RX_BUFFER_NORMSIZE-1600, -1, PCI_DMA_FROMDEVICE); +} + + +NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER *pAd) +{ + POS_COOKIE pObj; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (unsigned long)pAd); + tasklet_init(&pObj->mgmt_dma_done_task, mgmt_dma_done_tasklet, (unsigned long)pAd); + tasklet_init(&pObj->ac0_dma_done_task, ac0_dma_done_tasklet, (unsigned long)pAd); + tasklet_init(&pObj->ac1_dma_done_task, ac1_dma_done_tasklet, (unsigned long)pAd); + tasklet_init(&pObj->ac2_dma_done_task, ac2_dma_done_tasklet, (unsigned long)pAd); + tasklet_init(&pObj->ac3_dma_done_task, ac3_dma_done_tasklet, (unsigned long)pAd); + tasklet_init(&pObj->hcca_dma_done_task, hcca_dma_done_tasklet, (unsigned long)pAd); + tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd); + tasklet_init(&pObj->fifo_statistic_full_task, fifo_statistic_full_tasklet, (unsigned long)pAd); + + return NDIS_STATUS_SUCCESS; +} + + +void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd) +{ + POS_COOKIE pObj; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + tasklet_kill(&pObj->rx_done_task); + tasklet_kill(&pObj->mgmt_dma_done_task); + tasklet_kill(&pObj->ac0_dma_done_task); + tasklet_kill(&pObj->ac1_dma_done_task); + tasklet_kill(&pObj->ac2_dma_done_task); + tasklet_kill(&pObj->ac3_dma_done_task); + tasklet_kill(&pObj->hcca_dma_done_task); + tasklet_kill(&pObj->tbtt_task); + tasklet_kill(&pObj->fifo_statistic_full_task); +} + + +NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER *pAd) +{ + RTMP_OS_TASK *pTask; + NDIS_STATUS status; + + + /* Creat Command Thread */ + pTask = &pAd->cmdQTask; + RtmpOSTaskInit(pTask, "RtmpCmdQTask", pAd); + status = RtmpOSTaskAttach(pTask, RTPCICmdThread, (ULONG)pTask); + if (status == NDIS_STATUS_FAILURE) + { + printk (KERN_WARNING "%s: unable to start RTPCICmdThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev)); + return NDIS_STATUS_FAILURE; + } + + + 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; + + /* Terminate cmdQ thread */ + pTask = &pAd->cmdQTask; +#ifdef KTHREAD_SUPPORT + if (pTask->kthread_task) +#else + CHECK_PID_LEGALITY(pTask->taskPID) +#endif + { + NdisAcquireSpinLock(&pAd->CmdQLock); + pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED; + NdisReleaseSpinLock(&pAd->CmdQLock); + + //RTUSBCMDUp(pAd); + 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)); + } + pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN; + } + + + return; +} + + +static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode) +{ + u32 regValue; + + pAd->int_disable_mask &= ~(mode); + regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask); + //if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { + RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 1:enable + } + //else + // DBGPRINT(RT_DEBUG_TRACE, ("fOP_STATUS_DOZE !\n")); + + if (regValue != 0) + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE); +} + + +static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode) +{ + u32 regValue; + + pAd->int_disable_mask |= mode; + regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask); + RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 0: disable + + if (regValue == 0) + { + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE); + } +} + + +/*************************************************************************** + * + * tasklet related procedures. + * + **************************************************************************/ +static void mgmt_dma_done_tasklet(unsigned long data) +{ + unsigned long flags; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; + INT_SOURCE_CSR_STRUC IntSource; + POS_COOKIE pObj; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + +// printk("mgmt_dma_done_process\n"); + IntSource.word = 0; + IntSource.field.MgmtDmaDone = 1; + pAd->int_pending &= ~INT_MGMT_DLY; + + RTMPHandleMgmtRingDmaDoneInterrupt(pAd); + + // if you use RTMP_SEM_LOCK, sometimes kernel will hang up, no any + // bug report output + RTMP_INT_LOCK(&pAd->irq_lock, flags); + /* + * double check to avoid lose of interrupts + */ + if (pAd->int_pending & INT_MGMT_DLY) + { + tasklet_hi_schedule(&pObj->mgmt_dma_done_task); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + return; + } + + /* enable TxDataInt again */ + rt2860_int_enable(pAd, INT_MGMT_DLY); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); +} + + +static void rx_done_tasklet(unsigned long data) +{ + unsigned long flags; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; + BOOLEAN bReschedule = 0; + POS_COOKIE pObj; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + +#ifdef UAPSD_AP_SUPPORT + UAPSD_TIMING_RECORD(pAd, UAPSD_TIMING_RECORD_TASKLET); +#endif // UAPSD_AP_SUPPORT // + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + pAd->int_pending &= ~(INT_RX); +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + bReschedule = STARxDoneInterruptHandle(pAd, 0); +#endif // CONFIG_STA_SUPPORT // + +#ifdef UAPSD_AP_SUPPORT + UAPSD_TIMING_RECORD_STOP(); +#endif // UAPSD_AP_SUPPORT // + + RTMP_INT_LOCK(&pAd->irq_lock, flags); + /* + * double check to avoid rotting packet + */ + if (pAd->int_pending & INT_RX || bReschedule) + { + tasklet_hi_schedule(&pObj->rx_done_task); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + return; + } + + /* enable RxINT again */ + rt2860_int_enable(pAd, INT_RX); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + +} + + +void fifo_statistic_full_tasklet(unsigned long data) +{ + unsigned long flags; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; + POS_COOKIE pObj; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + pAd->int_pending &= ~(FifoStaFullInt); + NICUpdateFifoStaCounters(pAd); + + RTMP_INT_LOCK(&pAd->irq_lock, flags); + /* + * double check to avoid rotting packet + */ + if (pAd->int_pending & FifoStaFullInt) + { + tasklet_hi_schedule(&pObj->fifo_statistic_full_task); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + return; + } + + /* enable RxINT again */ + + rt2860_int_enable(pAd, FifoStaFullInt); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + +} + + +static void hcca_dma_done_tasklet(unsigned long data) +{ + unsigned long flags; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; + INT_SOURCE_CSR_STRUC IntSource; + POS_COOKIE pObj; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + + IntSource.word = 0; + IntSource.field.HccaDmaDone = 1; + pAd->int_pending &= ~INT_HCCA_DLY; + + RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource); + + RTMP_INT_LOCK(&pAd->irq_lock, flags); + /* + * double check to avoid lose of interrupts + */ + if (pAd->int_pending & INT_HCCA_DLY) + { + tasklet_hi_schedule(&pObj->hcca_dma_done_task); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + return; + } + + /* enable TxDataInt again */ + rt2860_int_enable(pAd, INT_HCCA_DLY); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); +} + + +static void ac3_dma_done_tasklet(unsigned long data) +{ + unsigned long flags; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; + INT_SOURCE_CSR_STRUC IntSource; + POS_COOKIE pObj; + BOOLEAN bReschedule = 0; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + +// printk("ac0_dma_done_process\n"); + IntSource.word = 0; + IntSource.field.Ac3DmaDone = 1; + pAd->int_pending &= ~INT_AC3_DLY; + + bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource); + + RTMP_INT_LOCK(&pAd->irq_lock, flags); + /* + * double check to avoid lose of interrupts + */ + if ((pAd->int_pending & INT_AC3_DLY) || bReschedule) + { + tasklet_hi_schedule(&pObj->ac3_dma_done_task); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + return; + } + + /* enable TxDataInt again */ + rt2860_int_enable(pAd, INT_AC3_DLY); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); +} + + +static void ac2_dma_done_tasklet(unsigned long data) +{ + unsigned long flags; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; + INT_SOURCE_CSR_STRUC IntSource; + POS_COOKIE pObj; + BOOLEAN bReschedule = 0; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + IntSource.word = 0; + IntSource.field.Ac2DmaDone = 1; + pAd->int_pending &= ~INT_AC2_DLY; + + bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource); + + RTMP_INT_LOCK(&pAd->irq_lock, flags); + + /* + * double check to avoid lose of interrupts + */ + if ((pAd->int_pending & INT_AC2_DLY) || bReschedule) + { + tasklet_hi_schedule(&pObj->ac2_dma_done_task); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + return; + } + + /* enable TxDataInt again */ + rt2860_int_enable(pAd, INT_AC2_DLY); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); +} + + +static void ac1_dma_done_tasklet(unsigned long data) +{ + unsigned long flags; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; + INT_SOURCE_CSR_STRUC IntSource; + POS_COOKIE pObj; + BOOLEAN bReschedule = 0; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + +// printk("ac0_dma_done_process\n"); + IntSource.word = 0; + IntSource.field.Ac1DmaDone = 1; + pAd->int_pending &= ~INT_AC1_DLY; + + bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource); + + RTMP_INT_LOCK(&pAd->irq_lock, flags); + /* + * double check to avoid lose of interrupts + */ + if ((pAd->int_pending & INT_AC1_DLY) || bReschedule) + { + tasklet_hi_schedule(&pObj->ac1_dma_done_task); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + return; + } + + /* enable TxDataInt again */ + rt2860_int_enable(pAd, INT_AC1_DLY); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); +} + + +static void ac0_dma_done_tasklet(unsigned long data) +{ + unsigned long flags; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data; + INT_SOURCE_CSR_STRUC IntSource; + POS_COOKIE pObj; + BOOLEAN bReschedule = 0; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + pObj = (POS_COOKIE) pAd->OS_Cookie; + +// printk("ac0_dma_done_process\n"); + IntSource.word = 0; + IntSource.field.Ac0DmaDone = 1; + pAd->int_pending &= ~INT_AC0_DLY; + +// RTMPHandleMgmtRingDmaDoneInterrupt(pAd); + bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource); + + RTMP_INT_LOCK(&pAd->irq_lock, flags); + /* + * double check to avoid lose of interrupts + */ + if ((pAd->int_pending & INT_AC0_DLY) || bReschedule) + { + tasklet_hi_schedule(&pObj->ac0_dma_done_task); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); + return; + } + + /* enable TxDataInt again */ + rt2860_int_enable(pAd, INT_AC0_DLY); + RTMP_INT_UNLOCK(&pAd->irq_lock, flags); +} + + + + +/*************************************************************************** + * + * interrupt handler related procedures. + * + **************************************************************************/ +int print_int_count; + +IRQ_HANDLE_TYPE +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)) +rt2860_interrupt(int irq, void *dev_instance) +#else +rt2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs) +#endif +{ + struct net_device *net_dev = (struct net_device *) dev_instance; + PRTMP_ADAPTER pAd = NULL; + INT_SOURCE_CSR_STRUC IntSource; + POS_COOKIE pObj; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + pObj = (POS_COOKIE) pAd->OS_Cookie; + + + /* Note 03312008: we can not return here before + RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word); + RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); + Or kernel will panic after ifconfig ra0 down sometimes */ + + + // + // Inital the Interrupt source. + // + IntSource.word = 0x00000000L; +// McuIntSource.word = 0x00000000L; + + // + // Get the interrupt sources & saved to local variable + // + //RTMP_IO_READ32(pAd, where, &McuIntSource.word); + //RTMP_IO_WRITE32(pAd, , McuIntSource.word); + + // + // Flag fOP_STATUS_DOZE On, means ASIC put to sleep, elase means ASICK WakeUp + // And at the same time, clock maybe turned off that say there is no DMA service. + // when ASIC get to sleep. + // To prevent system hang on power saving. + // We need to check it before handle the INT_SOURCE_CSR, ASIC must be wake up. + // + // RT2661 => when ASIC is sleeping, MAC register cannot be read and written. + // RT2860 => when ASIC is sleeping, MAC register can be read and written. +// if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { + RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word); + RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); // write 1 to clear + } +// else +// DBGPRINT(RT_DEBUG_TRACE, (">>>fOP_STATUS_DOZE<<<\n")); + +// RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IsrAfterClear); +// RTMP_IO_READ32(pAd, MCU_INT_SOURCE_CSR, &McuIsrAfterClear); +// DBGPRINT(RT_DEBUG_INFO, ("====> RTMPHandleInterrupt(ISR=%08x,Mcu ISR=%08x, After clear ISR=%08x, MCU ISR=%08x)\n", +// IntSource.word, McuIntSource.word, IsrAfterClear, McuIsrAfterClear)); + + // Do nothing if Reset in progress + if (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |fRTMP_ADAPTER_HALT_IN_PROGRESS))) + { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + return IRQ_HANDLED; +#else + return; +#endif + } + + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) + { + return; + } + + // + // Handle interrupt, walk through all bits + // Should start from highest priority interrupt + // The priority can be adjust by altering processing if statement + // + +#ifdef DBG + +#endif + + + pAd->bPCIclkOff = FALSE; + + // If required spinlock, each interrupt service routine has to acquire + // and release itself. + // + + // Do nothing if NIC doesn't exist + if (IntSource.word == 0xffffffff) + { + RTMP_SET_FLAG(pAd, (fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS)); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + return IRQ_HANDLED; +#else + return; +#endif + } + + if (IntSource.word & TxCoherent) + { + DBGPRINT(RT_DEBUG_ERROR, (">>>TxCoherent<<<\n")); + RTMPHandleRxCoherentInterrupt(pAd); + } + + if (IntSource.word & RxCoherent) + { + DBGPRINT(RT_DEBUG_ERROR, (">>>RxCoherent<<<\n")); + RTMPHandleRxCoherentInterrupt(pAd); + } + + if (IntSource.word & FifoStaFullInt) + { + if ((pAd->int_disable_mask & FifoStaFullInt) == 0) + { + /* mask FifoStaFullInt */ + rt2860_int_disable(pAd, FifoStaFullInt); + tasklet_hi_schedule(&pObj->fifo_statistic_full_task); + } + pAd->int_pending |= FifoStaFullInt; + } + + if (IntSource.word & INT_MGMT_DLY) + { + if ((pAd->int_disable_mask & INT_MGMT_DLY) ==0 ) + { + rt2860_int_disable(pAd, INT_MGMT_DLY); + tasklet_hi_schedule(&pObj->mgmt_dma_done_task); + } + pAd->int_pending |= INT_MGMT_DLY ; + } + + if (IntSource.word & INT_RX) + { + if ((pAd->int_disable_mask & INT_RX) == 0) + { + + /* mask RxINT */ + rt2860_int_disable(pAd, INT_RX); + tasklet_hi_schedule(&pObj->rx_done_task); + } + pAd->int_pending |= INT_RX; + } + + if (IntSource.word & INT_HCCA_DLY) + { + + if ((pAd->int_disable_mask & INT_HCCA_DLY) == 0) + { + /* mask TxDataInt */ + rt2860_int_disable(pAd, INT_HCCA_DLY); + tasklet_hi_schedule(&pObj->hcca_dma_done_task); + } + pAd->int_pending |= INT_HCCA_DLY; + } + + if (IntSource.word & INT_AC3_DLY) + { + + if ((pAd->int_disable_mask & INT_AC3_DLY) == 0) + { + /* mask TxDataInt */ + rt2860_int_disable(pAd, INT_AC3_DLY); + tasklet_hi_schedule(&pObj->ac3_dma_done_task); + } + pAd->int_pending |= INT_AC3_DLY; + } + + if (IntSource.word & INT_AC2_DLY) + { + + if ((pAd->int_disable_mask & INT_AC2_DLY) == 0) + { + /* mask TxDataInt */ + rt2860_int_disable(pAd, INT_AC2_DLY); + tasklet_hi_schedule(&pObj->ac2_dma_done_task); + } + pAd->int_pending |= INT_AC2_DLY; + } + + if (IntSource.word & INT_AC1_DLY) + { + + pAd->int_pending |= INT_AC1_DLY; + + if ((pAd->int_disable_mask & INT_AC1_DLY) == 0) + { + /* mask TxDataInt */ + rt2860_int_disable(pAd, INT_AC1_DLY); + tasklet_hi_schedule(&pObj->ac1_dma_done_task); + } + + } + + if (IntSource.word & INT_AC0_DLY) + { + +/* + if (IntSource.word & 0x2) { + u32 reg; + RTMP_IO_READ32(pAd, DELAY_INT_CFG, ®); + printk("IntSource.word = %08x, DELAY_REG = %08x\n", IntSource.word, reg); + } +*/ + pAd->int_pending |= INT_AC0_DLY; + + if ((pAd->int_disable_mask & INT_AC0_DLY) == 0) + { + /* mask TxDataInt */ + rt2860_int_disable(pAd, INT_AC0_DLY); + tasklet_hi_schedule(&pObj->ac0_dma_done_task); + } + + } + + + if (IntSource.word & PreTBTTInt) + { + RTMPHandlePreTBTTInterrupt(pAd); + } + + if (IntSource.word & TBTTInt) + { + RTMPHandleTBTTInterrupt(pAd); + } + + + + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + if (IntSource.word & AutoWakeupInt) + RTMPHandleTwakeupInterrupt(pAd); + } +#endif // CONFIG_STA_SUPPORT // + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) + return IRQ_HANDLED; +#endif + +} + + + +/* +======================================================================== +Routine Description: + PCI command kernel thread. + +Arguments: + *Context the pAd, driver control block pointer + +Return Value: + 0 close the thread + +Note: +======================================================================== +*/ +INT RTPCICmdThread( + IN ULONG Context) +{ + RTMP_ADAPTER *pAd; + RTMP_OS_TASK *pTask; + int status; + status = 0; + + pTask = (RTMP_OS_TASK *)Context; + pAd = (PRTMP_ADAPTER)pTask->priv; + + RtmpOSTaskCustomize(pTask); + + NdisAcquireSpinLock(&pAd->CmdQLock); + pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING; + NdisReleaseSpinLock(&pAd->CmdQLock); + + while (pAd && pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING) + { +#ifdef KTHREAD_SUPPORT + RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask); +#else + /* lock the device pointers */ + RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status); + + if (status != 0) + { + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS); + break; + } +#endif + + if (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_STOPED) + break; + + if (!pAd->PM_FlgSuspend) + CMDHandler(pAd); + } + + if (pAd && !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,( "<---RTPCICmdThread\n")); + +#ifndef KTHREAD_SUPPORT + pTask->taskPID = THREAD_PID_INIT_VALUE; + complete_and_exit (&pTask->taskComplete, 0); +#endif + return 0; + +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_pci_rbus.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_pci_rbus.o new file mode 100644 index 0000000000000000000000000000000000000000..c1be6707b47b268f54c144fb9278956b3fb191f6 GIT binary patch literal 7739 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 literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_profile.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_profile.c new file mode 100644 index 000000000..3029b07c9 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_profile.c @@ -0,0 +1,102 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rt_profile.c + + Abstract: + + Revision History: + Who When What + --------- ---------- ---------------------------------------------- + */ + +#include "rt_config.h" + + +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; + + buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG); + if(buffer == NULL) + return NDIS_STATUS_FAILURE; + memset(buffer, 0x00, MAX_INI_BUFFER_SIZE); + + { + +#ifdef CONFIG_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + src = STA_PROFILE_PATH; + } +#endif // CONFIG_STA_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); + } + + kfree(buffer); + + return (retval); + +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_profile.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_profile.o new file mode 100644 index 0000000000000000000000000000000000000000..944fe56cffd2db027ada63e0e6cc18233a796d4b GIT binary patch literal 2109 zcmb<-^>JflWMqH=Mh0dE1doB?1rtQZ1Wai#@G)?MSui5B^J#ckaPu357k~c$|G!It zfq|jZ^~sJ6><kQGk#1fV1_p+1(=F@_46P?S5A(NfV_;xty}b`)NlD#K1{MZ}&ijT3 zKCkYreX$E9*!csj(eR|<r5zw!z&u-q5C8vn9^-EZ>E6j8z`)RX3oOxkpw6Y+^$C>M z`2i}}d8|ZeAxL-Y0shvt3=9ll`#OIZUIHuVyaA?~k0^A0h>nYoJv^aX6s-DE$(~LZ z6^`RBDj;Vw9A{C{V1WAM^`dTD0g&7O^S9Xi|Np<6z0>tU^KlliBS9KKeup}((?sQe z=!0(d)&rfc4@z&n<oW;qf3q#f1_u6?!vFvOgVck#U}qg?Q30{RPI?&uk>vmd1w<C% z79W^fUK;)X|9^shYDuzwcxF**PHJ(neo%<9ftf*Yh$Difmy%e*z`zicnwX-HmYI{P zprl%?q>z@FnUk8Lky=#boS%|vtD2&z$i?8ClV6-lNRfX*Y959fMJ|xz!GycBvz3BI zXi{ljNvVQ~o{65Zu1P7FXQ~O|Gcf2CSLT)^CNbz0mlQ$h3>d2@HAk-`wW5SUuP8qy zu_O_s#8A%!m21eLSCpC)AD^3?Uz%4EpOc@=0P<!cgI-c`F@s)Seo3mHyI-hoaY<rw zHiKSrer|4R9w-z*t|W}*85qFnpAD+ifq{Xc1{4=iJ}3o%n9>Xk44fba6icu&Fx+5Z zVBmr32PGd41_lOIDBlRGZVw{^Lm`w6qCo0E#)I+~h=!@tWny5E04acCkQ@lRL(PL` zO9l@n22d7)szR`x(cJfem4N}|9+3N386fIF{1B*l%uo}2U<O0^AoqcoQ4A3Mgw(}D z&4cMfHxJ|oka_t~bp{{~0|Ns{9XJ<2`5<*5EXcsX0J9S$Rlvl+Pyu2<F-Q%F38Imm z{)3f)p@5NrftP`S0hBgD?g7OeD9(`0%V1|<xC$}=ib3Xpm>@k&{0t1@Aa{x}Fvu`4 zFfj2kFerie!VC<cVu4YNfguzmF2ukP2NGvuU`Ph>1sND>K(q)0Ll=nVVqlmEqD2`P z=77|3Gcard@r4)|c7kXg28L5m@mnC8iGkrElzs-17hqs`2jUAeFfcPRFo23{9T3gU zz+ercnHU({K{PW1gAXGE1Csy)LmG(B#K4dXrHi2AAipt!0tLjtfl+G!Q1~N<7>ExF zO@wA<22hGZ=CdO>;P?ZjG=vZ{O3ne9#|6%FFcmBeAOG{gI1CJ+(w;#bjStE%Fd<O9 zT0uG0j0_Ay42%qcP(FwP$tQsrPz>T{LfIe+#4i9bpcurjhq6Hwh(8I$fMO7TIg|~e zKzvZW1Y(0Qh<^;kfMO7zp{OLjpeP?y3hN~^1cmqp1gDk+Km-C3ixP8FOHzx98G=Gw zQj<#4eNxL(a~QJIic(X-YC$D9LX}5;el|mPZfb6Pa$<5uYJ6f2s1$@0hztcqnRzAI z3_&Hi1^&TqnK`MTLL0^n_RLGmcg{%6OHXBpk1r`oOinGx&&(@{&(4Jyg3t!C5~eLP QCly>jFhG?->@8*h05iRN5&!@I literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_rbus_pci_util.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_rbus_pci_util.c new file mode 100644 index 000000000..db7add7f7 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_rbus_pci_util.c @@ -0,0 +1,248 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtusb_bulk.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs + +*/ + +#include "rt_config.h" + + +// Function for TxDesc Memory allocation. +void RTMP_AllocateTxDescMemory( + IN PRTMP_ADAPTER pAd, + IN UINT Index, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) +{ + POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; + + *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); + +} + + +// Function for MgmtDesc Memory allocation. +void RTMP_AllocateMgmtDescMemory( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) +{ + POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; + + *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); + +} + + +// Function for RxDesc Memory allocation. +void RTMP_AllocateRxDescMemory( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) +{ + POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; + + *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); + +} + + +// Function for free allocated Desc Memory. +void RTMP_FreeDescMemory( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress) +{ + POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; + + pci_free_consistent(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress); +} + + +// Function for TxData DMA Memory allocation. +void RTMP_AllocateFirstTxBuffer( + IN PRTMP_ADAPTER pAd, + IN UINT Index, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) +{ + POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; + + *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); +} + + +void RTMP_FreeFirstTxBuffer( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + IN PVOID VirtualAddress, + IN NDIS_PHYSICAL_ADDRESS PhysicalAddress) +{ + POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; + + pci_free_consistent(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress); +} + + +/* + * FUNCTION: Allocate a common buffer for DMA + * ARGUMENTS: + * AdapterHandle: AdapterHandle + * Length: Number of bytes to allocate + * Cached: Whether or not the memory can be cached + * VirtualAddress: Pointer to memory is returned here + * PhysicalAddress: Physical address corresponding to virtual address + */ +void RTMP_AllocateSharedMemory( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) +{ + POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie; + + *VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress); +} + + +/* + * FUNCTION: Allocate a packet buffer for DMA + * ARGUMENTS: + * AdapterHandle: AdapterHandle + * Length: Number of bytes to allocate + * Cached: Whether or not the memory can be cached + * VirtualAddress: Pointer to memory is returned here + * PhysicalAddress: Physical address corresponding to virtual address + * Notes: + * Cached is ignored: always cached memory + */ +PNDIS_PACKET RTMP_AllocateRxPacketBuffer( + IN PRTMP_ADAPTER pAd, + IN ULONG Length, + IN BOOLEAN Cached, + OUT PVOID *VirtualAddress, + OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress) +{ + struct sk_buff *pkt; + +// pkt = dev_alloc_skb(Length); + DEV_ALLOC_SKB(pAd, pkt, Length); + + if (pkt == NULL) { + DBGPRINT(RT_DEBUG_ERROR, ("can't allocate rx %ld size packet\n",Length)); + } + + if (pkt) { + RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); + *VirtualAddress = (PVOID) pkt->data; +//#ifdef CONFIG_5VT_ENHANCE +// *PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, 1600, PCI_DMA_FROMDEVICE); +//#else + *PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1, PCI_DMA_FROMDEVICE); +//#endif + } else { + *VirtualAddress = (PVOID) NULL; + *PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL; + } + + return (PNDIS_PACKET) pkt; +} + +/* + * invaild or writeback cache + * and convert virtual address to physical address + */ +dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx, int direction) +{ + PRTMP_ADAPTER pAd; + POS_COOKIE pObj; + + /* + ------ Porting Information ------ + > For Tx Alloc: + mgmt packets => sd_idx = 0 + SwIdx: pAd->MgmtRing.TxCpuIdx + pTxD : pAd->MgmtRing.Cell[SwIdx].AllocVa; + + data packets => sd_idx = 1 + TxIdx : pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx + QueIdx: pTxBlk->QueIdx + pTxD : pAd->TxRing[pTxBlk->QueIdx].Cell[TxIdx].AllocVa; + + > For Rx Alloc: + sd_idx = -1 + */ + + pAd = (PRTMP_ADAPTER)handle; + pObj = (POS_COOKIE)pAd->OS_Cookie; + + if (sd_idx == 1) + { + PTX_BLK pTxBlk; + pTxBlk = (PTX_BLK)ptr; + return pci_map_single(pObj->pci_dev, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen, direction); + } + else + { + return pci_map_single(pObj->pci_dev, ptr, size, direction); + } + +} + +void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int direction) +{ + PRTMP_ADAPTER pAd; + POS_COOKIE pObj; + + pAd=(PRTMP_ADAPTER)handle; + pObj = (POS_COOKIE)pAd->OS_Cookie; + + if (size > 0) + pci_unmap_single(pObj->pci_dev, dma_addr, size, direction); + +} + +/* End of rt_usb_util.c */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_rbus_pci_util.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/rt_rbus_pci_util.o new file mode 100644 index 0000000000000000000000000000000000000000..26a17d3d756129fa4f4f694da2fc63a24647959c GIT binary patch literal 3896 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 BA@~3Q literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/sta_ioctl.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/sta_ioctl.c new file mode 100644 index 000000000..a7e2f0202 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/sta_ioctl.c @@ -0,0 +1,6143 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + sta_ioctl.c + + Abstract: + IOCTL related subroutines + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Rory Chen 01-03-2003 created + Rory Chen 02-14-2005 modify to support RT61 +*/ + +#include "rt_config.h" + +#ifdef DBG +extern ULONG RTDebugLevel; +#endif + +#define NR_WEP_KEYS 4 +#define WEP_SMALL_KEY_LEN (40/8) +#define WEP_LARGE_KEY_LEN (104/8) + +#define GROUP_KEY_NO 4 + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) +#define IWE_STREAM_ADD_EVENT(_A, _B, _C, _D, _E) iwe_stream_add_event(_A, _B, _C, _D, _E) +#define IWE_STREAM_ADD_POINT(_A, _B, _C, _D, _E) iwe_stream_add_point(_A, _B, _C, _D, _E) +#define IWE_STREAM_ADD_VALUE(_A, _B, _C, _D, _E, _F) iwe_stream_add_value(_A, _B, _C, _D, _E, _F) +#else +#define IWE_STREAM_ADD_EVENT(_A, _B, _C, _D, _E) iwe_stream_add_event(_B, _C, _D, _E) +#define IWE_STREAM_ADD_POINT(_A, _B, _C, _D, _E) iwe_stream_add_point(_B, _C, _D, _E) +#define IWE_STREAM_ADD_VALUE(_A, _B, _C, _D, _E, _F) iwe_stream_add_value(_B, _C, _D, _E, _F) +#endif + +extern UCHAR CipherWpa2Template[]; + +typedef struct GNU_PACKED _RT_VERSION_INFO{ + UCHAR DriverVersionW; + UCHAR DriverVersionX; + UCHAR DriverVersionY; + UCHAR DriverVersionZ; + UINT DriverBuildYear; + UINT DriverBuildMonth; + UINT DriverBuildDay; +} RT_VERSION_INFO, *PRT_VERSION_INFO; + +struct iw_priv_args privtab[] = { +{ RTPRIV_IOCTL_SET, + IW_PRIV_TYPE_CHAR | 1024, 0, + "set"}, + +{ RTPRIV_IOCTL_SHOW, IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, + ""}, +/* --- sub-ioctls definitions --- */ + { SHOW_CONN_STATUS, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "connStatus" }, + { SHOW_DRVIER_VERION, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "driverVer" }, + { SHOW_BA_INFO, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "bainfo" }, + { SHOW_DESC_INFO, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "descinfo" }, + { RAIO_OFF, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "radio_off" }, + { RAIO_ON, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "radio_on" }, +#ifdef QOS_DLS_SUPPORT + { SHOW_DLS_ENTRY_INFO, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "dlsentryinfo" }, +#endif // QOS_DLS_SUPPORT // + { SHOW_CFG_VALUE, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "show" }, + { SHOW_ADHOC_ENTRY_INFO, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, "adhocEntry" }, +/* --- sub-ioctls relations --- */ + +#ifdef DBG +{ RTPRIV_IOCTL_BBP, + IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, + "bbp"}, +{ RTPRIV_IOCTL_MAC, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, + "mac"}, +#ifdef RTMP_RF_RW_SUPPORT +{ RTPRIV_IOCTL_RF, + IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, + "rf"}, +#endif // RTMP_RF_RW_SUPPORT // +{ RTPRIV_IOCTL_E2P, + IW_PRIV_TYPE_CHAR | 1024, IW_PRIV_TYPE_CHAR | 1024, + "e2p"}, +#endif /* DBG */ + +{ RTPRIV_IOCTL_STATISTICS, + 0, IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_MASK, + "stat"}, +{ RTPRIV_IOCTL_GSITESURVEY, + 0, IW_PRIV_TYPE_CHAR | 1024, + "get_site_survey"}, + +}; + +static __s32 ralinkrate[] = + {2, 4, 11, 22, // CCK + 12, 18, 24, 36, 48, 72, 96, 108, // OFDM + 13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78, 104, 156, 208, 234, 260, // 20MHz, 800ns GI, MCS: 0 ~ 15 + 39, 78, 117, 156, 234, 312, 351, 390, // 20MHz, 800ns GI, MCS: 16 ~ 23 + 27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540, // 40MHz, 800ns GI, MCS: 0 ~ 15 + 81, 162, 243, 324, 486, 648, 729, 810, // 40MHz, 800ns GI, MCS: 16 ~ 23 + 14, 29, 43, 57, 87, 115, 130, 144, 29, 59, 87, 115, 173, 230, 260, 288, // 20MHz, 400ns GI, MCS: 0 ~ 15 + 43, 87, 130, 173, 260, 317, 390, 433, // 20MHz, 400ns GI, MCS: 16 ~ 23 + 30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600, // 40MHz, 400ns GI, MCS: 0 ~ 15 + 90, 180, 270, 360, 540, 720, 810, 900}; // 40MHz, 400ns GI, MCS: 16 ~ 23 + + + + + + +/* +This is required for LinEX2004/kernel2.6.7 to provide iwlist scanning function +*/ + +int +rt_ioctl_giwname(struct net_device *dev, + struct iw_request_info *info, + char *name, char *extra) +{ + strncpy(name, "Ralink STA", IFNAMSIZ); + return 0; +} + +int rt_ioctl_siwfreq(struct net_device *dev, + struct iw_request_info *info, + struct iw_freq *freq, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + int chan = -1; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + + if (freq->e > 1) + return -EINVAL; + + if((freq->e == 0) && (freq->m <= 1000)) + chan = freq->m; // Setting by channel number + else + MAP_KHZ_TO_CHANNEL_ID( (freq->m /100) , chan); // Setting by frequency - search the table , like 2.412G, 2.422G, + + if (ChannelSanity(pAdapter, chan) == TRUE) + { + pAdapter->CommonCfg.Channel = chan; + DBGPRINT(RT_DEBUG_ERROR, ("==>rt_ioctl_siwfreq::SIOCSIWFREQ[cmd=0x%x] (Channel=%d)\n", SIOCSIWFREQ, pAdapter->CommonCfg.Channel)); + } + else + return -EINVAL; + + return 0; +} + + +int rt_ioctl_giwfreq(struct net_device *dev, + struct iw_request_info *info, + struct iw_freq *freq, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + UCHAR ch; + ULONG m = 2412000; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + ch = pAdapter->CommonCfg.Channel; + + DBGPRINT(RT_DEBUG_TRACE,("==>rt_ioctl_giwfreq %d\n", ch)); + + MAP_CHANNEL_ID_TO_KHZ(ch, m); + freq->m = m * 100; + freq->e = 1; + freq->i = 0; + + return 0; +} + + +int rt_ioctl_siwmode(struct net_device *dev, + struct iw_request_info *info, + __u32 *mode, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + switch (*mode) + { + case IW_MODE_ADHOC: + Set_NetworkType_Proc(pAdapter, "Adhoc"); + break; + case IW_MODE_INFRA: + Set_NetworkType_Proc(pAdapter, "Infra"); + break; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,20)) + case IW_MODE_MONITOR: + Set_NetworkType_Proc(pAdapter, "Monitor"); + break; +#endif + default: + DBGPRINT(RT_DEBUG_TRACE, ("===>rt_ioctl_siwmode::SIOCSIWMODE (unknown %d)\n", *mode)); + return -EINVAL; + } + + // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key + pAdapter->StaCfg.WpaState = SS_NOTUSE; + + return 0; +} + + +int rt_ioctl_giwmode(struct net_device *dev, + struct iw_request_info *info, + __u32 *mode, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (ADHOC_ON(pAdapter)) + *mode = IW_MODE_ADHOC; + else if (INFRA_ON(pAdapter)) + *mode = IW_MODE_INFRA; +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,20)) + else if (MONITOR_ON(pAdapter)) + { + *mode = IW_MODE_MONITOR; + } +#endif + else + *mode = IW_MODE_AUTO; + + DBGPRINT(RT_DEBUG_TRACE, ("==>rt_ioctl_giwmode(mode=%d)\n", *mode)); + return 0; +} + +int rt_ioctl_siwsens(struct net_device *dev, + struct iw_request_info *info, + char *name, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + return 0; +} + +int rt_ioctl_giwsens(struct net_device *dev, + struct iw_request_info *info, + char *name, char *extra) +{ + return 0; +} + +int rt_ioctl_giwrange(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + struct iw_range *range = (struct iw_range *) extra; + u16 val; + int i; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE ,("===>rt_ioctl_giwrange\n")); + data->length = sizeof(struct iw_range); + memset(range, 0, sizeof(struct iw_range)); + + range->txpower_capa = IW_TXPOW_DBM; + + if (INFRA_ON(pAdapter)||ADHOC_ON(pAdapter)) + { + range->min_pmp = 1 * 1024; + range->max_pmp = 65535 * 1024; + range->min_pmt = 1 * 1024; + range->max_pmt = 1000 * 1024; + range->pmp_flags = IW_POWER_PERIOD; + range->pmt_flags = IW_POWER_TIMEOUT; + range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | + IW_POWER_UNICAST_R | IW_POWER_ALL_R; + } + + range->we_version_compiled = WIRELESS_EXT; + range->we_version_source = 14; + + range->retry_capa = IW_RETRY_LIMIT; + range->retry_flags = IW_RETRY_LIMIT; + range->min_retry = 0; + range->max_retry = 255; + + range->num_channels = pAdapter->ChannelListNum; + + val = 0; + for (i = 1; i <= range->num_channels; i++) + { + u32 m = 2412000; + range->freq[val].i = pAdapter->ChannelList[i-1].Channel; + MAP_CHANNEL_ID_TO_KHZ(pAdapter->ChannelList[i-1].Channel, m); + range->freq[val].m = m * 100; /* OS_HZ */ + + range->freq[val].e = 1; + val++; + if (val == IW_MAX_FREQUENCIES) + break; + } + range->num_frequency = val; + + range->max_qual.qual = 100; /* what is correct max? This was not + * documented exactly. At least + * 69 has been observed. */ + range->max_qual.level = 0; /* dB */ + range->max_qual.noise = 0; /* dB */ + + /* What would be suitable values for "average/typical" qual? */ + range->avg_qual.qual = 20; + range->avg_qual.level = -60; + range->avg_qual.noise = -95; + range->sensitivity = 3; + + range->max_encoding_tokens = NR_WEP_KEYS; + range->num_encoding_sizes = 2; + range->encoding_size[0] = 5; + range->encoding_size[1] = 13; + + range->min_rts = 0; + range->max_rts = 2347; + range->min_frag = 256; + range->max_frag = 2346; + +#if WIRELESS_EXT > 17 + /* IW_ENC_CAPA_* bit field */ + range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | + IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; +#endif + + return 0; +} + +int rt_ioctl_siwap(struct net_device *dev, + struct iw_request_info *info, + struct sockaddr *ap_addr, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + NDIS_802_11_MAC_ADDRESS Bssid; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAdapter); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + + if (NdisCmpMemory(ZERO_MAC_ADDR, ap_addr->sa_data, MAC_ADDR_LEN) == 0) + return 0; + + // tell CNTL state machine to call NdisMSetInformationComplete() after completing + // this request, because this request is initiated by NDIS. + pAdapter->MlmeAux.CurrReqIsFromNdis = FALSE; + // Prevent to connect AP again in STAMlmePeriodicExec + pAdapter->MlmeAux.AutoReconnectSsidLen= 32; + + memset(Bssid, 0, MAC_ADDR_LEN); + memcpy(Bssid, ap_addr->sa_data, MAC_ADDR_LEN); + MlmeEnqueue(pAdapter, + MLME_CNTL_STATE_MACHINE, + OID_802_11_BSSID, + sizeof(NDIS_802_11_MAC_ADDRESS), + (VOID *)&Bssid, 0); + + DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCSIWAP %02x:%02x:%02x:%02x:%02x:%02x\n", + Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5])); + + return 0; +} + +int rt_ioctl_giwap(struct net_device *dev, + struct iw_request_info *info, + struct sockaddr *ap_addr, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (INFRA_ON(pAdapter) || ADHOC_ON(pAdapter)) + { + ap_addr->sa_family = ARPHRD_ETHER; + memcpy(ap_addr->sa_data, &pAdapter->CommonCfg.Bssid, ETH_ALEN); + } +#ifdef WPA_SUPPLICANT_SUPPORT + // Add for RT2870 + else if (pAdapter->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) + { + ap_addr->sa_family = ARPHRD_ETHER; + memcpy(ap_addr->sa_data, &pAdapter->MlmeAux.Bssid, ETH_ALEN); + } +#endif // WPA_SUPPLICANT_SUPPORT // + else + { + DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIWAP(=EMPTY)\n")); + return -ENOTCONN; + } + + return 0; +} + +/* + * Units are in db above the noise floor. That means the + * rssi values reported in the tx/rx descriptors in the + * driver are the SNR expressed in db. + * + * If you assume that the noise floor is -95, which is an + * excellent assumption 99.5 % of the time, then you can + * derive the absolute signal level (i.e. -95 + rssi). + * There are some other slight factors to take into account + * depending on whether the rssi measurement is from 11b, + * 11g, or 11a. These differences are at most 2db and + * can be documented. + * + * NB: various calculations are based on the orinoco/wavelan + * drivers for compatibility + */ +static void set_quality(PRTMP_ADAPTER pAdapter, + struct iw_quality *iq, + PBSS_ENTRY pBssEntry) +{ + __u8 ChannelQuality; + + // Normalize Rssi + if (pBssEntry->Rssi >= -50) + ChannelQuality = 100; + else if (pBssEntry->Rssi >= -80) // between -50 ~ -80dbm + ChannelQuality = (__u8)(24 + ((pBssEntry->Rssi + 80) * 26)/10); + else if (pBssEntry->Rssi >= -90) // between -80 ~ -90dbm + ChannelQuality = (__u8)((pBssEntry->Rssi + 90) * 26)/10; + else + ChannelQuality = 0; + + iq->qual = (__u8)ChannelQuality; + + iq->level = (__u8)(pBssEntry->Rssi); + + if (pBssEntry->Rssi >= -70) + iq->noise = -92; + else + iq->noise = pBssEntry->Rssi - pBssEntry->MinSNR; + + iq->updated = pAdapter->iw_stats.qual.updated; +} + +int rt_ioctl_iwaplist(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + + struct sockaddr addr[IW_MAX_AP]; + struct iw_quality qual[IW_MAX_AP]; + int i; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + data->length = 0; + return 0; + //return -ENETDOWN; + } + + for (i = 0; i <IW_MAX_AP ; i++) + { + if (i >= pAdapter->ScanTab.BssNr) + break; + addr[i].sa_family = ARPHRD_ETHER; + memcpy(addr[i].sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN); + set_quality(pAdapter, &qual[i], &pAdapter->ScanTab.BssEntry[i]); + } + data->length = i; + memcpy(extra, &addr, i*sizeof(addr[0])); + data->flags = 1; /* signal quality present (sort of) */ + memcpy(extra + i*sizeof(addr[0]), &qual, i*sizeof(qual[i])); + + return 0; +} + +#if defined(SIOCGIWSCAN) || defined(RT_CFG80211_SUPPORT) +int rt_ioctl_siwscan(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + int Status = NDIS_STATUS_SUCCESS; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (MONITOR_ON(pAdapter)) + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n")); + return -EINVAL; + } + + //Baron 2010/01/28 + if (OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED) && ((pAdapter->RalinkCounters.LastOneSecTotalTxCount > 50) || (pAdapter->RalinkCounters.LastOneSecRxOkDataCnt > 50))) + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! rt_ioctl_siwscan set::OID_802_11_BSSID_LIST_SCAN\n")); + return NDIS_STATUS_SUCCESS; + } + +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAdapter->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE) + { + pAdapter->StaCfg.WpaSupplicantScanCount++; + } +#endif // WPA_SUPPLICANT_SUPPORT // + + pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE; + do{ +#ifdef WPA_SUPPLICANT_SUPPORT + if (((pAdapter->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE) && + (pAdapter->StaCfg.WpaSupplicantScanCount > 3)) + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! WpaSupplicantScanCount > 3\n")); + Status = NDIS_STATUS_SUCCESS; + break; + } +#endif // WPA_SUPPLICANT_SUPPORT // + + if ((OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) && + ((pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || + (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) && + (pAdapter->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n")); + Status = NDIS_STATUS_SUCCESS; + break; + } + + if (pAdapter->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAdapter); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + + // Reset allowed scan retries + pAdapter->StaCfg.ScanCnt = 0; + + NdisGetSystemUpTime(&pAdapter->StaCfg.LastScanTime); + + MlmeEnqueue(pAdapter, + MLME_CNTL_STATE_MACHINE, + OID_802_11_BSSID_LIST_SCAN, + 0, + NULL, 0); + + Status = NDIS_STATUS_SUCCESS; + RTMP_MLME_HANDLER(pAdapter); + }while(0); + return NDIS_STATUS_SUCCESS; +} + +int rt_ioctl_giwscan(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + int i=0; + PSTRING current_ev = extra, previous_ev = extra; + PSTRING end_buf; + PSTRING current_val; + STRING custom[MAX_CUSTOM_LEN] = {0}; +#ifndef IWEVGENIE + unsigned char idx; +#endif // IWEVGENIE // + struct iw_event iwe; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + /* + * Still scanning, indicate the caller should try again. + */ + pAdapter->StaCfg.bScanReqIsFromWebUI = TRUE; + return -EAGAIN; + } + + +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAdapter->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE) + { + pAdapter->StaCfg.WpaSupplicantScanCount = 0; + } +#endif // WPA_SUPPLICANT_SUPPORT // + + if (pAdapter->ScanTab.BssNr == 0) + { + data->length = 0; + return 0; + } + +#if WIRELESS_EXT >= 17 + if (data->length > 0) + end_buf = extra + data->length; + else + end_buf = extra + IW_SCAN_MAX_DATA; +#else + end_buf = extra + IW_SCAN_MAX_DATA; +#endif + + for (i = 0; i < pAdapter->ScanTab.BssNr; i++) + { + if (current_ev >= end_buf) + { +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + } + + //MAC address + //================================ + memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = SIOCGIWAP; + iwe.u.ap_addr.sa_family = ARPHRD_ETHER; + memcpy(iwe.u.ap_addr.sa_data, &pAdapter->ScanTab.BssEntry[i].Bssid, ETH_ALEN); + + previous_ev = current_ev; + current_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + + /* + Protocol: + it will show scanned AP's WirelessMode . + it might be + 802.11a + 802.11a/n + 802.11g/n + 802.11b/g/n + 802.11g + 802.11b/g + */ + memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = SIOCGIWNAME; + + + { + PBSS_ENTRY pBssEntry=&pAdapter->ScanTab.BssEntry[i]; + BOOLEAN isGonly=FALSE; + int rateCnt=0; + + if (pBssEntry->Channel>14) + { + if (pBssEntry->HtCapabilityLen!=0) + strcpy(iwe.u.name,"802.11a/n"); + else + strcpy(iwe.u.name,"802.11a"); + } + else + { + /* + if one of non B mode rate is set supported rate . it mean G only. + */ + for (rateCnt=0;rateCnt<pBssEntry->SupRateLen;rateCnt++) + { + /* + 6Mbps(140) 9Mbps(146) and >=12Mbps(152) are supported rate , it mean G only. + */ + if (pBssEntry->SupRate[rateCnt]==140 || pBssEntry->SupRate[rateCnt]==146 || pBssEntry->SupRate[rateCnt]>=152) + isGonly=TRUE; + } + + for (rateCnt=0;rateCnt<pBssEntry->ExtRateLen;rateCnt++) + { + if (pBssEntry->ExtRate[rateCnt]==140 || pBssEntry->ExtRate[rateCnt]==146 || pBssEntry->ExtRate[rateCnt]>=152) + isGonly=TRUE; + } + + + if (pBssEntry->HtCapabilityLen!=0) + { + if (isGonly==TRUE) + strcpy(iwe.u.name,"802.11g/n"); + else + strcpy(iwe.u.name,"802.11b/g/n"); + } + else + { + if (isGonly==TRUE) + strcpy(iwe.u.name,"802.11g"); + else + { + if (pBssEntry->SupRateLen==4 && pBssEntry->ExtRateLen==0) + strcpy(iwe.u.name,"802.11b"); + else + strcpy(iwe.u.name,"802.11b/g"); + } + } + } + } + + previous_ev = current_ev; + current_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_ADDR_LEN); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + + //ESSID + //================================ + memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = SIOCGIWESSID; + iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].SsidLen; + iwe.u.data.flags = 1; + + previous_ev = current_ev; + current_ev = IWE_STREAM_ADD_POINT(info, current_ev,end_buf, &iwe, (PSTRING) pAdapter->ScanTab.BssEntry[i].Ssid); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + + //Network Type + //================================ + memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = SIOCGIWMODE; + if (pAdapter->ScanTab.BssEntry[i].BssType == Ndis802_11IBSS) + { + iwe.u.mode = IW_MODE_ADHOC; + } + else if (pAdapter->ScanTab.BssEntry[i].BssType == Ndis802_11Infrastructure) + { + iwe.u.mode = IW_MODE_INFRA; + } + else + { + iwe.u.mode = IW_MODE_AUTO; + } + iwe.len = IW_EV_UINT_LEN; + + previous_ev = current_ev; + current_ev = IWE_STREAM_ADD_EVENT(info, current_ev, end_buf, &iwe, IW_EV_UINT_LEN); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + + //Channel and Frequency + //================================ + memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = SIOCGIWFREQ; + { + UCHAR ch = pAdapter->ScanTab.BssEntry[i].Channel; + ULONG m = 0; + MAP_CHANNEL_ID_TO_KHZ(ch, m); + iwe.u.freq.m = m * 100; + iwe.u.freq.e = 1; + iwe.u.freq.i = 0; + previous_ev = current_ev; + current_ev = IWE_STREAM_ADD_EVENT(info, current_ev,end_buf, &iwe, IW_EV_FREQ_LEN); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + } + + //Add quality statistics + //================================ + memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = IWEVQUAL; + iwe.u.qual.level = 0; + iwe.u.qual.noise = 0; + set_quality(pAdapter, &iwe.u.qual, &pAdapter->ScanTab.BssEntry[i]); + current_ev = IWE_STREAM_ADD_EVENT(info, current_ev, end_buf, &iwe, IW_EV_QUAL_LEN); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + + //Encyption key + //================================ + memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = SIOCGIWENCODE; + if (CAP_IS_PRIVACY_ON (pAdapter->ScanTab.BssEntry[i].CapabilityInfo )) + iwe.u.data.flags =IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; + else + iwe.u.data.flags = IW_ENCODE_DISABLED; + + previous_ev = current_ev; + current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf,&iwe, (char *)pAdapter->SharedKey[BSS0][(iwe.u.data.flags & IW_ENCODE_INDEX)-1].Key); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + + //Bit Rate + //================================ + if (pAdapter->ScanTab.BssEntry[i].SupRateLen) + { + UCHAR tmpRate = pAdapter->ScanTab.BssEntry[i].SupRate[pAdapter->ScanTab.BssEntry[i].SupRateLen-1]; + memset(&iwe, 0, sizeof(iwe)); + iwe.cmd = SIOCGIWRATE; + current_val = current_ev + IW_EV_LCP_LEN; + if (tmpRate == 0x82) + iwe.u.bitrate.value = 1 * 1000000; + else if (tmpRate == 0x84) + iwe.u.bitrate.value = 2 * 1000000; + else if (tmpRate == 0x8B) + iwe.u.bitrate.value = 5.5 * 1000000; + else if (tmpRate == 0x96) + iwe.u.bitrate.value = 11 * 1000000; + else + iwe.u.bitrate.value = (tmpRate/2) * 1000000; + + if (pAdapter->ScanTab.BssEntry[i].ExtRateLen) + { + UCHAR tmpSupRate =(pAdapter->ScanTab.BssEntry[i].SupRate[pAdapter->ScanTab.BssEntry[i].SupRateLen-1]& 0x7f); + UCHAR tmpExtRate =(pAdapter->ScanTab.BssEntry[i].ExtRate[pAdapter->ScanTab.BssEntry[i].ExtRateLen-1]& 0x7f); + iwe.u.bitrate.value = (tmpSupRate > tmpExtRate) ? (tmpSupRate)*500000 : (tmpExtRate)*500000; + } + + if (tmpRate == 0x6c && pAdapter->ScanTab.BssEntry[i].HtCapabilityLen > 0) + { + int rate_count = sizeof(ralinkrate)/sizeof(__s32); + HT_CAP_INFO capInfo = pAdapter->ScanTab.BssEntry[i].HtCapability.HtCapInfo; + int shortGI = capInfo.ChannelWidth ? capInfo.ShortGIfor40 : capInfo.ShortGIfor20; + int maxMCS = pAdapter->ScanTab.BssEntry[i].HtCapability.MCSSet[1] ? 15 : 7; + int rate_index = 12 + ((UCHAR)capInfo.ChannelWidth * 24) + ((UCHAR)shortGI *48) + ((UCHAR)maxMCS); + if (rate_index < 0) + rate_index = 0; + if (rate_index > rate_count) + rate_index = rate_count; + iwe.u.bitrate.value = ralinkrate[rate_index] * 500000; + } + + iwe.u.bitrate.disabled = 0; + current_val = IWE_STREAM_ADD_VALUE(info, current_ev, + current_val, end_buf, &iwe, + IW_EV_PARAM_LEN); + + if((current_val-current_ev)>IW_EV_LCP_LEN) + current_ev = current_val; + else +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + } + +#ifdef IWEVGENIE + //WPA IE + if (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen > 0) + { + memset(&iwe, 0, sizeof(iwe)); + memset(&custom[0], 0, MAX_CUSTOM_LEN); + memcpy(custom, &(pAdapter->ScanTab.BssEntry[i].WpaIE.IE[0]), + pAdapter->ScanTab.BssEntry[i].WpaIE.IELen); + iwe.cmd = IWEVGENIE; + iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].WpaIE.IELen; + current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + } + + //WPA2 IE + if (pAdapter->ScanTab.BssEntry[i].RsnIE.IELen > 0) + { + memset(&iwe, 0, sizeof(iwe)); + memset(&custom[0], 0, MAX_CUSTOM_LEN); + memcpy(custom, &(pAdapter->ScanTab.BssEntry[i].RsnIE.IE[0]), + pAdapter->ScanTab.BssEntry[i].RsnIE.IELen); + iwe.cmd = IWEVGENIE; + iwe.u.data.length = pAdapter->ScanTab.BssEntry[i].RsnIE.IELen; + current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + } +#else + //WPA IE + //================================ + if (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen > 0) + { + NdisZeroMemory(&iwe, sizeof(iwe)); + memset(&custom[0], 0, MAX_CUSTOM_LEN); + iwe.cmd = IWEVCUSTOM; + iwe.u.data.length = (pAdapter->ScanTab.BssEntry[i].WpaIE.IELen * 2) + 7; + NdisMoveMemory(custom, "wpa_ie=", 7); + for (idx = 0; idx < pAdapter->ScanTab.BssEntry[i].WpaIE.IELen; idx++) + sprintf(custom, "%s%02x", custom, pAdapter->ScanTab.BssEntry[i].WpaIE.IE[idx]); + previous_ev = current_ev; + current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + } + + //WPA2 IE + if (pAdapter->ScanTab.BssEntry[i].RsnIE.IELen > 0) + { + NdisZeroMemory(&iwe, sizeof(iwe)); + memset(&custom[0], 0, MAX_CUSTOM_LEN); + iwe.cmd = IWEVCUSTOM; + iwe.u.data.length = (pAdapter->ScanTab.BssEntry[i].RsnIE.IELen * 2) + 7; + NdisMoveMemory(custom, "rsn_ie=", 7); + for (idx = 0; idx < pAdapter->ScanTab.BssEntry[i].RsnIE.IELen; idx++) + sprintf(custom, "%s%02x", custom, pAdapter->ScanTab.BssEntry[i].RsnIE.IE[idx]); + previous_ev = current_ev; + current_ev = IWE_STREAM_ADD_POINT(info, current_ev, end_buf, &iwe, custom); + if (current_ev == previous_ev) +#if WIRELESS_EXT >= 17 + return -E2BIG; +#else + break; +#endif + } +#endif // IWEVGENIE // + } + + data->length = current_ev - extra; + pAdapter->StaCfg.bScanReqIsFromWebUI = FALSE; + DBGPRINT(RT_DEBUG_ERROR ,("===>rt_ioctl_giwscan. %d(%d) BSS returned, data->length = %d\n",i , pAdapter->ScanTab.BssNr, data->length)); + return 0; +} +#endif + +int rt_ioctl_siwessid(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *essid) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (data->flags) + { + PSTRING pSsidString = NULL; + + // Includes null character. + if (data->length > (IW_ESSID_MAX_SIZE + 1)) + return -E2BIG; + + pSsidString = kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG); + if (pSsidString) + { + NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1); + NdisMoveMemory(pSsidString, essid, data->length); + if (Set_SSID_Proc(pAdapter, pSsidString) == FALSE) + return -EINVAL; + } + else + return -ENOMEM; + } + else + { + // ANY ssid + if (Set_SSID_Proc(pAdapter, "") == FALSE) + return -EINVAL; + } + return 0; +} + +int rt_ioctl_giwessid(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *essid) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + data->flags = 1; + if (MONITOR_ON(pAdapter)) + { + data->length = 0; + return 0; + } + + if (OPSTATUS_TEST_FLAG(pAdapter, fOP_STATUS_MEDIA_STATE_CONNECTED)) + { + DBGPRINT(RT_DEBUG_TRACE ,("MediaState is connected\n")); + data->length = pAdapter->CommonCfg.SsidLen; + memcpy(essid, pAdapter->CommonCfg.Ssid, pAdapter->CommonCfg.SsidLen); + } + else + {//the ANY ssid was specified + data->length = 0; + DBGPRINT(RT_DEBUG_TRACE ,("MediaState is not connected, ess\n")); + } + + return 0; + +} + +int rt_ioctl_siwnickn(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *nickname) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE ,("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (data->length > IW_ESSID_MAX_SIZE) + return -EINVAL; + + memset(pAdapter->nickname, 0, IW_ESSID_MAX_SIZE + 1); + memcpy(pAdapter->nickname, nickname, data->length); + + + return 0; +} + +int rt_ioctl_giwnickn(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *data, char *nickname) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + data->length = 0; + return -ENETDOWN; + } + + if (data->length > strlen((PSTRING) pAdapter->nickname) + 1) + data->length = strlen((PSTRING) pAdapter->nickname) + 1; + if (data->length > 0) { + memcpy(nickname, pAdapter->nickname, data->length-1); + nickname[data->length-1] = '\0'; + } + return 0; +} + +int rt_ioctl_siwrts(struct net_device *dev, + struct iw_request_info *info, + struct iw_param *rts, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + u16 val; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (rts->disabled) + val = MAX_RTS_THRESHOLD; + else if (rts->value < 0 || rts->value > MAX_RTS_THRESHOLD) + return -EINVAL; + else if (rts->value == 0) + val = MAX_RTS_THRESHOLD; + else + val = rts->value; + + if (val != pAdapter->CommonCfg.RtsThreshold) + pAdapter->CommonCfg.RtsThreshold = val; + + return 0; +} + +int rt_ioctl_giwrts(struct net_device *dev, + struct iw_request_info *info, + struct iw_param *rts, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + rts->value = pAdapter->CommonCfg.RtsThreshold; + rts->disabled = (rts->value == MAX_RTS_THRESHOLD); + rts->fixed = 1; + + return 0; +} + +int rt_ioctl_siwfrag(struct net_device *dev, + struct iw_request_info *info, + struct iw_param *frag, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + u16 val; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (frag->disabled) + val = MAX_FRAG_THRESHOLD; + else if (frag->value >= MIN_FRAG_THRESHOLD || frag->value <= MAX_FRAG_THRESHOLD) + val = __cpu_to_le16(frag->value & ~0x1); /* even numbers only */ + else if (frag->value == 0) + val = MAX_FRAG_THRESHOLD; + else + return -EINVAL; + + pAdapter->CommonCfg.FragmentThreshold = val; + return 0; +} + +int rt_ioctl_giwfrag(struct net_device *dev, + struct iw_request_info *info, + struct iw_param *frag, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + frag->value = pAdapter->CommonCfg.FragmentThreshold; + frag->disabled = (frag->value == MAX_FRAG_THRESHOLD); + frag->fixed = 1; + + return 0; +} + +#define MAX_WEP_KEY_SIZE 13 +#define MIN_WEP_KEY_SIZE 5 +int rt_ioctl_siwencode(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *erq, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if ((erq->length == 0) && + (erq->flags & IW_ENCODE_DISABLED)) + { + pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled; + pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled; + pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled; + pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; + goto done; + } + else if (erq->flags & IW_ENCODE_RESTRICTED || erq->flags & IW_ENCODE_OPEN) + { + //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAdapter); + pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled; + pAdapter->StaCfg.GroupCipher = Ndis802_11WEPEnabled; + pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled; + pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; + if (erq->flags & IW_ENCODE_RESTRICTED) + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared; + else + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; + } + + if (erq->length > 0) + { + int keyIdx = (erq->flags & IW_ENCODE_INDEX) - 1; + /* Check the size of the key */ + if (erq->length > MAX_WEP_KEY_SIZE) + { + return -EINVAL; + } + /* Check key index */ + if ((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS)) + { + DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::Wrong keyIdx=%d! Using default key instead (%d)\n", + keyIdx, pAdapter->StaCfg.DefaultKeyId)); + + //Using default key + keyIdx = pAdapter->StaCfg.DefaultKeyId; + } + else + pAdapter->StaCfg.DefaultKeyId = keyIdx; + + NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, 16); + + if (erq->length == MAX_WEP_KEY_SIZE) + { + pAdapter->SharedKey[BSS0][keyIdx].KeyLen = MAX_WEP_KEY_SIZE; + pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP128; + } + else if (erq->length == MIN_WEP_KEY_SIZE) + { + pAdapter->SharedKey[BSS0][keyIdx].KeyLen = MIN_WEP_KEY_SIZE; + pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP64; + } + else + /* Disable the key */ + pAdapter->SharedKey[BSS0][keyIdx].KeyLen = 0; + + /* Check if the key is not marked as invalid */ + if(!(erq->flags & IW_ENCODE_NOKEY)) + { + /* Copy the key in the driver */ + NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, extra, erq->length); + } + } + else + { + /* Do we want to just set the transmit key index ? */ + int index = (erq->flags & IW_ENCODE_INDEX) - 1; + if ((index >= 0) && (index < 4)) + { + pAdapter->StaCfg.DefaultKeyId = index; + } + else + /* Don't complain if only change the mode */ + if(!erq->flags & IW_ENCODE_MODE) + { + return -EINVAL; + } + } + +done: + DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::erq->flags=%x\n",erq->flags)); + DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::AuthMode=%x\n",pAdapter->StaCfg.AuthMode)); + DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::DefaultKeyId=%x, KeyLen = %d\n",pAdapter->StaCfg.DefaultKeyId , pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].KeyLen)); + DBGPRINT(RT_DEBUG_TRACE ,("==>rt_ioctl_siwencode::WepStatus=%x\n",pAdapter->StaCfg.WepStatus)); + return 0; +} + +int +rt_ioctl_giwencode(struct net_device *dev, + struct iw_request_info *info, + struct iw_point *erq, char *key) +{ + int kid; + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + kid = erq->flags & IW_ENCODE_INDEX; + DBGPRINT(RT_DEBUG_TRACE, ("===>rt_ioctl_giwencode %d\n", erq->flags & IW_ENCODE_INDEX)); + + if (pAdapter->StaCfg.WepStatus == Ndis802_11WEPDisabled) + { + erq->length = 0; + erq->flags = IW_ENCODE_DISABLED; + } + else if ((kid > 0) && (kid <=4)) + { + // copy wep key + erq->flags = kid ; /* NB: base 1 */ + if (erq->length > pAdapter->SharedKey[BSS0][kid-1].KeyLen) + erq->length = pAdapter->SharedKey[BSS0][kid-1].KeyLen; + memcpy(key, pAdapter->SharedKey[BSS0][kid-1].Key, erq->length); + //if ((kid == pAdapter->PortCfg.DefaultKeyId)) + //erq->flags |= IW_ENCODE_ENABLED; /* XXX */ + if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared) + erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */ + else + erq->flags |= IW_ENCODE_OPEN; /* XXX */ + + } + else if (kid == 0) + { + if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared) + erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */ + else + erq->flags |= IW_ENCODE_OPEN; /* XXX */ + erq->length = pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].KeyLen; + memcpy(key, pAdapter->SharedKey[BSS0][pAdapter->StaCfg.DefaultKeyId].Key, erq->length); + // copy default key ID + if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared) + erq->flags |= IW_ENCODE_RESTRICTED; /* XXX */ + else + erq->flags |= IW_ENCODE_OPEN; /* XXX */ + erq->flags = pAdapter->StaCfg.DefaultKeyId + 1; /* NB: base 1 */ + erq->flags |= IW_ENCODE_ENABLED; /* XXX */ + } + + return 0; + +} + + +static int +rt_private_get_statistics(struct net_device *dev, struct iw_request_info *info, + struct iw_point *wrq, char *extra) +{ + INT Status = 0; + PRTMP_ADAPTER pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (extra == NULL) + { + wrq->length = 0; + return -EIO; + } + + memset(extra, 0x00, IW_PRIV_SIZE_MASK); + sprintf(extra, "\n\n"); + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + { + sprintf(extra+strlen(extra), "Tx success = %ld\n", (ULONG)pAd->ate.TxDoneCount); + //sprintf(extra+strlen(extra), "Tx success without retry = %ld\n", (ULONG)pAd->ate.TxDoneCount); + } + else +#endif // RALINK_ATE // + { + sprintf(extra+strlen(extra), "Tx success = %lu\n", (ULONG)pAd->WlanCounters.TransmittedFragmentCount.u.LowPart); + } + sprintf(extra+strlen(extra), "Tx retry count = %lu\n", (ULONG)pAd->WlanCounters.RetryCount.u.LowPart); + sprintf(extra+strlen(extra), "Tx fail to Rcv ACK after retry = %lu\n", (ULONG)pAd->WlanCounters.FailedCount.u.LowPart); + sprintf(extra+strlen(extra), "RTS Success Rcv CTS = %lu\n", (ULONG)pAd->WlanCounters.RTSSuccessCount.u.LowPart); + sprintf(extra+strlen(extra), "RTS Fail Rcv CTS = %lu\n", (ULONG)pAd->WlanCounters.RTSFailureCount.u.LowPart); + + sprintf(extra+strlen(extra), "Rx success = %lu\n", (ULONG)pAd->WlanCounters.ReceivedFragmentCount.QuadPart); + sprintf(extra+strlen(extra), "Rx with CRC = %lu\n", (ULONG)pAd->WlanCounters.FCSErrorCount.u.LowPart); + sprintf(extra+strlen(extra), "Rx drop due to out of resource = %lu\n", (ULONG)pAd->Counters8023.RxNoBuffer); + sprintf(extra+strlen(extra), "Rx duplicate frame = %lu\n", (ULONG)pAd->WlanCounters.FrameDuplicateCount.u.LowPart); + + sprintf(extra+strlen(extra), "False CCA (one second) = %lu\n", (ULONG)pAd->RalinkCounters.OneSecFalseCCACnt); + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + { + if (pAd->ate.RxAntennaSel == 0) + { + sprintf(extra+strlen(extra), "RSSI-A = %ld\n", (LONG)(pAd->ate.LastRssi0 - pAd->BbpRssiToDbmDelta)); + sprintf(extra+strlen(extra), "RSSI-B (if available) = %ld\n", (LONG)(pAd->ate.LastRssi1 - pAd->BbpRssiToDbmDelta)); + sprintf(extra+strlen(extra), "RSSI-C (if available) = %ld\n\n", (LONG)(pAd->ate.LastRssi2 - pAd->BbpRssiToDbmDelta)); + } + else + { + sprintf(extra+strlen(extra), "RSSI = %ld\n", (LONG)(pAd->ate.LastRssi0 - pAd->BbpRssiToDbmDelta)); + } + } + else +#endif // RALINK_ATE // + { + sprintf(extra+strlen(extra), "RSSI-A = %ld\n", (LONG)(pAd->StaCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta)); + sprintf(extra+strlen(extra), "RSSI-B (if available) = %ld\n", (LONG)(pAd->StaCfg.RssiSample.LastRssi1 - pAd->BbpRssiToDbmDelta)); + sprintf(extra+strlen(extra), "RSSI-C (if available) = %ld\n\n", (LONG)(pAd->StaCfg.RssiSample.LastRssi2 - pAd->BbpRssiToDbmDelta)); + } +#ifdef WPA_SUPPLICANT_SUPPORT + sprintf(extra+strlen(extra), "WpaSupplicantUP = %d\n\n", pAd->StaCfg.WpaSupplicantUP); +#endif // WPA_SUPPLICANT_SUPPORT // + + + + // display pin code + sprintf(extra+strlen(extra), "RT2860 Linux STA PinCode\t%08u\n", GenerateWpsPinCode(pAd, BSS0)); + + wrq->length = strlen(extra) + 1; // 1: size of '\0' + DBGPRINT(RT_DEBUG_TRACE, ("<== rt_private_get_statistics, wrq->length = %d\n", wrq->length)); + + return Status; +} + +#ifdef DOT11_N_SUPPORT +void getBaInfo( + IN PRTMP_ADAPTER pAd, + IN PSTRING pOutBuf) +{ + INT i, j; + BA_ORI_ENTRY *pOriBAEntry; + BA_REC_ENTRY *pRecBAEntry; + + for (i=0; i<MAX_LEN_OF_MAC_TABLE; i++) + { + PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; + if (((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry) || IS_ENTRY_TDLS(pEntry)) && (pEntry->Sst == SST_ASSOC)) + || IS_ENTRY_WDS(pEntry) || IS_ENTRY_MESH(pEntry)) + { + sprintf(pOutBuf, "%s\n%02X:%02X:%02X:%02X:%02X:%02X (Aid = %d) (AP) -\n", + pOutBuf, + pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], + pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5], pEntry->Aid); + + sprintf(pOutBuf, "%s[Recipient]\n", pOutBuf); + for (j=0; j < NUM_OF_TID; j++) + { + if (pEntry->BARecWcidArray[j] != 0) + { + pRecBAEntry =&pAd->BATable.BARecEntry[pEntry->BARecWcidArray[j]]; + sprintf(pOutBuf, "%sTID=%d, BAWinSize=%d, LastIndSeq=%d, ReorderingPkts=%d\n", pOutBuf, j, pRecBAEntry->BAWinSize, pRecBAEntry->LastIndSeq, pRecBAEntry->list.qlen); + } + } + sprintf(pOutBuf, "%s\n", pOutBuf); + + sprintf(pOutBuf, "%s[Originator]\n", pOutBuf); + for (j=0; j < NUM_OF_TID; j++) + { + if (pEntry->BAOriWcidArray[j] != 0) + { + pOriBAEntry =&pAd->BATable.BAOriEntry[pEntry->BAOriWcidArray[j]]; + sprintf(pOutBuf, "%sTID=%d, BAWinSize=%d, StartSeq=%d, CurTxSeq=%d\n", pOutBuf, j, pOriBAEntry->BAWinSize, pOriBAEntry->Sequence, pEntry->TxSeq[j]); + } + } + sprintf(pOutBuf, "%s\n\n", pOutBuf); + } + if (strlen(pOutBuf) > (IW_PRIV_SIZE_MASK - 30)) + break; + } + + return; +} +#endif // DOT11_N_SUPPORT // + +static int +rt_private_show(struct net_device *dev, struct iw_request_info *info, + struct iw_point *wrq, PSTRING extra) +{ + INT Status = 0; + PRTMP_ADAPTER pAd; + POS_COOKIE pObj; + u32 subcmd = wrq->flags; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + if (pAd == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + pObj = (POS_COOKIE) pAd->OS_Cookie; + if (extra == NULL) + { + wrq->length = 0; + return -EIO; + } + memset(extra, 0x00, IW_PRIV_SIZE_MASK); + + { + pObj->ioctl_if_type = INT_MAIN; + pObj->ioctl_if = MAIN_MBSSID; + } + + switch(subcmd) + { + + case SHOW_CONN_STATUS: + if (MONITOR_ON(pAd)) + { +#ifdef DOT11_N_SUPPORT + if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED && + pAd->CommonCfg.RegTransmitSetting.field.BW) + sprintf(extra, "Monitor Mode(CentralChannel %d)\n", pAd->CommonCfg.CentralChannel); + else +#endif // DOT11_N_SUPPORT // + sprintf(extra, "Monitor Mode(Channel %d)\n", pAd->CommonCfg.Channel); + } + else + { + if (pAd->IndicateMediaState == NdisMediaStateConnected) + { + if (INFRA_ON(pAd)) + { + sprintf(extra, "Connected(AP: %s[%02X:%02X:%02X:%02X:%02X:%02X])\n", + pAd->CommonCfg.Ssid, + pAd->CommonCfg.Bssid[0], + pAd->CommonCfg.Bssid[1], + pAd->CommonCfg.Bssid[2], + pAd->CommonCfg.Bssid[3], + pAd->CommonCfg.Bssid[4], + pAd->CommonCfg.Bssid[5]); + DBGPRINT(RT_DEBUG_TRACE ,("Ssid=%s ,Ssidlen = %d\n",pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen)); + } + else if (ADHOC_ON(pAd)) + sprintf(extra, "Connected\n"); + } + else + { + sprintf(extra, "Disconnected\n"); + DBGPRINT(RT_DEBUG_TRACE ,("ConnStatus is not connected\n")); + } + } + wrq->length = strlen(extra) + 1; // 1: size of '\0' + break; + case SHOW_DRVIER_VERION: + sprintf(extra, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ ); + wrq->length = strlen(extra) + 1; // 1: size of '\0' + break; +#ifdef DOT11_N_SUPPORT + case SHOW_BA_INFO: + getBaInfo(pAd, extra); + wrq->length = strlen(extra) + 1; // 1: size of '\0' + break; +#endif // DOT11_N_SUPPORT // + case SHOW_DESC_INFO: + { + Show_DescInfo_Proc(pAd, NULL); + wrq->length = 0; // 1: size of '\0' + } + break; + case RAIO_OFF: + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAd); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + } + pAd->StaCfg.bSwRadio = FALSE; + if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) + { + pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio); + if (pAd->StaCfg.bRadio == FALSE) + { + MlmeRadioOff(pAd); + // Update extra information + pAd->ExtraInfo = SW_RADIO_OFF; + } + } + sprintf(extra, "Radio Off\n"); + wrq->length = strlen(extra) + 1; // 1: size of '\0' + break; + case RAIO_ON: + pAd->StaCfg.bSwRadio = TRUE; + //if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) + { + pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio); + if (pAd->StaCfg.bRadio == TRUE) + { + MlmeRadioOn(pAd); + // Update extra information + pAd->ExtraInfo = EXTRA_INFO_CLEAR; + } + } + sprintf(extra, "Radio On\n"); + wrq->length = strlen(extra) + 1; // 1: size of '\0' + break; + + +#ifdef QOS_DLS_SUPPORT + case SHOW_DLS_ENTRY_INFO: + { + Set_DlsEntryInfo_Display_Proc(pAd, NULL); + wrq->length = 0; // 1: size of '\0' + } + break; +#endif // QOS_DLS_SUPPORT // + + + case SHOW_CFG_VALUE: + { + Status = RTMPShowCfgValue(pAd, (PSTRING) wrq->pointer, extra); + if (Status == 0) + wrq->length = strlen(extra) + 1; // 1: size of '\0' + } + break; + case SHOW_ADHOC_ENTRY_INFO: + Show_Adhoc_MacTable_Proc(pAd, extra); + wrq->length = strlen(extra) + 1; // 1: size of '\0' + break; + + default: + DBGPRINT(RT_DEBUG_TRACE, ("%s - unknow subcmd = %d\n", __FUNCTION__, subcmd)); + break; + } + + return Status; +} + +#ifdef SIOCSIWMLME +int rt_ioctl_siwmlme(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, + char *extra) +{ + PRTMP_ADAPTER pAd = NULL; + struct iw_mlme *pMlme = (struct iw_mlme *)wrqu->data.pointer; + MLME_QUEUE_ELEM MsgElem; + MLME_DISASSOC_REQ_STRUCT DisAssocReq; + MLME_DEAUTH_REQ_STRUCT DeAuthReq; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + DBGPRINT(RT_DEBUG_TRACE, ("====> %s\n", __FUNCTION__)); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (pMlme == NULL) + return -EINVAL; + + switch(pMlme->cmd) + { +#ifdef IW_MLME_DEAUTH + case IW_MLME_DEAUTH: + DBGPRINT(RT_DEBUG_TRACE, ("====> %s - IW_MLME_DEAUTH\n", __FUNCTION__)); + COPY_MAC_ADDR(DeAuthReq.Addr, pAd->CommonCfg.Bssid); + DeAuthReq.Reason = pMlme->reason_code; + MsgElem.MsgLen = sizeof(MLME_DEAUTH_REQ_STRUCT); + NdisMoveMemory(MsgElem.Msg, &DeAuthReq, sizeof(MLME_DEAUTH_REQ_STRUCT)); + MlmeDeauthReqAction(pAd, &MsgElem); + if (INFRA_ON(pAd)) + { + LinkDown(pAd, FALSE); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + } + break; +#endif // IW_MLME_DEAUTH // +#ifdef IW_MLME_DISASSOC + case IW_MLME_DISASSOC: + DBGPRINT(RT_DEBUG_TRACE, ("====> %s - IW_MLME_DISASSOC\n", __FUNCTION__)); + COPY_MAC_ADDR(DisAssocReq.Addr, pAd->CommonCfg.Bssid); + DisAssocReq.Reason = pMlme->reason_code; + + MsgElem.Machine = ASSOC_STATE_MACHINE; + MsgElem.MsgType = MT2_MLME_DISASSOC_REQ; + MsgElem.MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT); + NdisMoveMemory(MsgElem.Msg, &DisAssocReq, sizeof(MLME_DISASSOC_REQ_STRUCT)); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; + MlmeDisassocReqAction(pAd, &MsgElem); + break; +#endif // IW_MLME_DISASSOC // + default: + DBGPRINT(RT_DEBUG_TRACE, ("====> %s - Unknow Command\n", __FUNCTION__)); + break; + } + + return 0; +} +#endif // SIOCSIWMLME // + +#if WIRELESS_EXT > 17 +int rt_ioctl_siwauth(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + struct iw_param *param = &wrqu->param; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + switch (param->flags & IW_AUTH_INDEX) { + case IW_AUTH_WPA_VERSION: + if (param->value == IW_AUTH_WPA_VERSION_WPA) + { + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK; + if (pAdapter->StaCfg.BssType == BSS_ADHOC) + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPANone; + } + else if (param->value == IW_AUTH_WPA_VERSION_WPA2) + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK; + + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n", __FUNCTION__, param->value)); + break; + case IW_AUTH_CIPHER_PAIRWISE: + if (param->value == IW_AUTH_CIPHER_NONE) + { + pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled; + pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; + pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled; + } + else if (param->value == IW_AUTH_CIPHER_WEP40 || + param->value == IW_AUTH_CIPHER_WEP104) + { + pAdapter->StaCfg.WepStatus = Ndis802_11WEPEnabled; + pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; + pAdapter->StaCfg.PairCipher = Ndis802_11WEPEnabled; +#ifdef WPA_SUPPLICANT_SUPPORT + pAdapter->StaCfg.IEEE8021X = FALSE; +#endif // WPA_SUPPLICANT_SUPPORT // + } + else if (param->value == IW_AUTH_CIPHER_TKIP) + { + pAdapter->StaCfg.WepStatus = Ndis802_11Encryption2Enabled; + pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; + pAdapter->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; + } + else if (param->value == IW_AUTH_CIPHER_CCMP) + { + pAdapter->StaCfg.WepStatus = Ndis802_11Encryption3Enabled; + pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; + pAdapter->StaCfg.PairCipher = Ndis802_11Encryption3Enabled; + } + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_CIPHER_PAIRWISE - param->value = %d!\n", __FUNCTION__, param->value)); + break; + case IW_AUTH_CIPHER_GROUP: + if (param->value == IW_AUTH_CIPHER_NONE) + { + pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled; + } + else if (param->value == IW_AUTH_CIPHER_WEP40) + { + pAdapter->StaCfg.GroupCipher = Ndis802_11GroupWEP40Enabled; + } + else if (param->value == IW_AUTH_CIPHER_WEP104) + { + pAdapter->StaCfg.GroupCipher = Ndis802_11GroupWEP104Enabled; + } + else if (param->value == IW_AUTH_CIPHER_TKIP) + { + pAdapter->StaCfg.GroupCipher = Ndis802_11Encryption2Enabled; + } + else if (param->value == IW_AUTH_CIPHER_CCMP) + { + pAdapter->StaCfg.GroupCipher = Ndis802_11Encryption3Enabled; + } + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_CIPHER_GROUP - param->value = %d!\n", __FUNCTION__, param->value)); + break; + case IW_AUTH_KEY_MGMT: + if (param->value == IW_AUTH_KEY_MGMT_802_1X) + { + if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) + { + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA; +#ifdef WPA_SUPPLICANT_SUPPORT + pAdapter->StaCfg.IEEE8021X = FALSE; +#endif // WPA_SUPPLICANT_SUPPORT // + } + else if (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) + { + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeWPA2; +#ifdef WPA_SUPPLICANT_SUPPORT + pAdapter->StaCfg.IEEE8021X = FALSE; +#endif // WPA_SUPPLICANT_SUPPORT // + } +#ifdef WPA_SUPPLICANT_SUPPORT + else + // WEP 1x + pAdapter->StaCfg.IEEE8021X = TRUE; +#endif // WPA_SUPPLICANT_SUPPORT // + } + else if (param->value == 0) + { + //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAdapter); + } + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_KEY_MGMT - param->value = %d!\n", __FUNCTION__, param->value)); + break; + case IW_AUTH_RX_UNENCRYPTED_EAPOL: + break; + case IW_AUTH_PRIVACY_INVOKED: + /*if (param->value == 0) + { + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; + pAdapter->StaCfg.WepStatus = Ndis802_11WEPDisabled; + pAdapter->StaCfg.OrigWepStatus = pAdapter->StaCfg.WepStatus; + pAdapter->StaCfg.PairCipher = Ndis802_11WEPDisabled; + pAdapter->StaCfg.GroupCipher = Ndis802_11WEPDisabled; + }*/ + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_PRIVACY_INVOKED - param->value = %d!\n", __FUNCTION__, param->value)); + break; + case IW_AUTH_DROP_UNENCRYPTED: + if (param->value != 0) + pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; + else + { + //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAdapter); + } + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_WPA_VERSION - param->value = %d!\n", __FUNCTION__, param->value)); + break; + case IW_AUTH_80211_AUTH_ALG: + if (param->value & IW_AUTH_ALG_SHARED_KEY) + { + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeShared; + } + else if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) + { + pAdapter->StaCfg.AuthMode = Ndis802_11AuthModeOpen; + } + else + return -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_80211_AUTH_ALG - param->value = %d!\n", __FUNCTION__, param->value)); + break; + case IW_AUTH_WPA_ENABLED: + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_AUTH_WPA_ENABLED - Driver supports WPA!(param->value = %d)\n", __FUNCTION__, param->value)); + break; + default: + return -EOPNOTSUPP; +} + + return 0; +} + +int rt_ioctl_giwauth(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PRTMP_ADAPTER pAdapter = NULL; + struct iw_param *param = &wrqu->param; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + switch (param->flags & IW_AUTH_INDEX) { + case IW_AUTH_DROP_UNENCRYPTED: + param->value = (pAdapter->StaCfg.WepStatus == Ndis802_11WEPDisabled) ? 0 : 1; + break; + + case IW_AUTH_80211_AUTH_ALG: + param->value = (pAdapter->StaCfg.AuthMode == Ndis802_11AuthModeShared) ? IW_AUTH_ALG_SHARED_KEY : IW_AUTH_ALG_OPEN_SYSTEM; + break; + + case IW_AUTH_WPA_ENABLED: + param->value = (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) ? 1 : 0; + break; + + default: + return -EOPNOTSUPP; + } + DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_giwauth::param->value = %d!\n", param->value)); + return 0; +} + +void fnSetCipherKey( + IN PRTMP_ADAPTER pAdapter, + IN INT keyIdx, + IN UCHAR CipherAlg, + IN BOOLEAN bGTK, + IN struct iw_encode_ext *ext) +{ + NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY)); + pAdapter->SharedKey[BSS0][keyIdx].KeyLen = LEN_TK; + NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, LEN_TK); + NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].TxMic, ext->key + LEN_TK, LEN_TKIP_MIC); + NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].RxMic, ext->key + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC); + pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CipherAlg; + + // Update group key information to ASIC Shared Key Table + AsicAddSharedKeyEntry(pAdapter, + BSS0, + keyIdx, + &pAdapter->SharedKey[BSS0][keyIdx]); + + /* STA doesn't need to set WCID attribute for group key */ + // Update ASIC WCID attribute table and IVEIV table + if (!bGTK) + RTMPSetWcidSecurityInfo(pAdapter, + BSS0, + keyIdx, + pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, + BSSID_WCID, + SHAREDKEYTABLE); +} + +int rt_ioctl_siwencodeext(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, + char *extra) + { + PRTMP_ADAPTER pAdapter = NULL; + struct iw_point *encoding = &wrqu->encoding; + struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; + int keyIdx, alg = ext->alg; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (encoding->flags & IW_ENCODE_DISABLED) + { + keyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1; + // set BSSID wcid entry of the Pair-wise Key table as no-security mode + AsicRemovePairwiseKeyEntry(pAdapter, BSSID_WCID); + pAdapter->SharedKey[BSS0][keyIdx].KeyLen = 0; + pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_NONE; + AsicRemoveSharedKeyEntry(pAdapter, 0, (UCHAR)keyIdx); + NdisZeroMemory(&pAdapter->SharedKey[BSS0][keyIdx], sizeof(CIPHER_KEY)); + DBGPRINT(RT_DEBUG_TRACE, ("%s::Remove all keys!(encoding->flags = %x)\n", __FUNCTION__, encoding->flags)); + } + else + { + // Get Key Index and convet to our own defined key index + keyIdx = (encoding->flags & IW_ENCODE_INDEX) - 1; + if((keyIdx < 0) || (keyIdx >= NR_WEP_KEYS)) + return -EINVAL; + + if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) + { + pAdapter->StaCfg.DefaultKeyId = keyIdx; + DBGPRINT(RT_DEBUG_TRACE, ("%s::DefaultKeyId = %d\n", __FUNCTION__, pAdapter->StaCfg.DefaultKeyId)); + } + + switch (alg) { + case IW_ENCODE_ALG_NONE: + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_NONE\n", __FUNCTION__)); + break; + case IW_ENCODE_ALG_WEP: + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_WEP - ext->key_len = %d, keyIdx = %d\n", __FUNCTION__, ext->key_len, keyIdx)); + if (ext->key_len == MAX_WEP_KEY_SIZE) + { + pAdapter->SharedKey[BSS0][keyIdx].KeyLen = MAX_WEP_KEY_SIZE; + pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP128; + } + else if (ext->key_len == MIN_WEP_KEY_SIZE) + { + pAdapter->SharedKey[BSS0][keyIdx].KeyLen = MIN_WEP_KEY_SIZE; + pAdapter->SharedKey[BSS0][keyIdx].CipherAlg = CIPHER_WEP64; + } + else + return -EINVAL; + + NdisZeroMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, 16); + NdisMoveMemory(pAdapter->SharedKey[BSS0][keyIdx].Key, ext->key, ext->key_len); + + if (pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled || + pAdapter->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled || + pAdapter->StaCfg.GroupCipher == Ndis802_11WEPEnabled) + { + // Set Group key material to Asic + AsicAddSharedKeyEntry(pAdapter, BSS0, keyIdx, &pAdapter->SharedKey[BSS0][keyIdx]); + + RTMPAddWcidAttributeEntry(pAdapter, BSS0, keyIdx, pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, &pAdapter->MacTab.Content[BSSID_WCID]); + + /* STA doesn't need to set WCID attribute for group key */ + + // Assign pairwise key info + RTMPSetWcidSecurityInfo(pAdapter, + BSS0, + keyIdx, + pAdapter->SharedKey[BSS0][keyIdx].CipherAlg, + BSSID_WCID, + SHAREDKEYTABLE); + + STA_PORT_SECURED(pAdapter); + // Indicate Connected for GUI + pAdapter->IndicateMediaState = NdisMediaStateConnected; + } + break; + case IW_ENCODE_ALG_TKIP: + DBGPRINT(RT_DEBUG_TRACE, ("%s::IW_ENCODE_ALG_TKIP - keyIdx = %d, ext->key_len = %d\n", __FUNCTION__, keyIdx, ext->key_len)); + if (ext->key_len == 32) + { + if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) + { + fnSetCipherKey(pAdapter, keyIdx, CIPHER_TKIP, FALSE, ext); + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2) + { + //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAdapter); + pAdapter->IndicateMediaState = NdisMediaStateConnected; + } + } + else if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) + { + fnSetCipherKey(pAdapter, keyIdx, CIPHER_TKIP, TRUE, ext); + + // set 802.1x port control + //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAdapter); + pAdapter->IndicateMediaState = NdisMediaStateConnected; + } + } + else + return -EINVAL; + break; + case IW_ENCODE_ALG_CCMP: + if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) + { + fnSetCipherKey(pAdapter, keyIdx, CIPHER_AES, FALSE, ext); + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2) + //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAdapter); + pAdapter->IndicateMediaState = NdisMediaStateConnected; + } + else if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) + { + fnSetCipherKey(pAdapter, keyIdx, CIPHER_AES, TRUE, ext); + + // set 802.1x port control + //pAdapter->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAdapter); + pAdapter->IndicateMediaState = NdisMediaStateConnected; + } + break; + default: + return -EINVAL; + } + } + + return 0; +} + +int +rt_ioctl_giwencodeext(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PRTMP_ADAPTER pAd = NULL; + PCHAR pKey = NULL; + struct iw_point *encoding = &wrqu->encoding; + struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; + int idx, max_key_len; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + DBGPRINT(RT_DEBUG_TRACE ,("===> rt_ioctl_giwencodeext\n")); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + max_key_len = encoding->length - sizeof(*ext); + if (max_key_len < 0) + return -EINVAL; + + idx = encoding->flags & IW_ENCODE_INDEX; + if (idx) + { + if (idx < 1 || idx > 4) + return -EINVAL; + idx--; + + if ((pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || + (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)) + { + if (idx != pAd->StaCfg.DefaultKeyId) + { + ext->key_len = 0; + return 0; + } + } + } + else + idx = pAd->StaCfg.DefaultKeyId; + + encoding->flags = idx + 1; + memset(ext, 0, sizeof(*ext)); + + ext->key_len = 0; + switch(pAd->StaCfg.WepStatus) { + case Ndis802_11WEPDisabled: + ext->alg = IW_ENCODE_ALG_NONE; + encoding->flags |= IW_ENCODE_DISABLED; + break; + case Ndis802_11WEPEnabled: + ext->alg = IW_ENCODE_ALG_WEP; + if (pAd->SharedKey[BSS0][idx].KeyLen > max_key_len) + return -E2BIG; + else + { + ext->key_len = pAd->SharedKey[BSS0][idx].KeyLen; + pKey = (PCHAR)&(pAd->SharedKey[BSS0][idx].Key[0]); + } + break; + case Ndis802_11Encryption2Enabled: + case Ndis802_11Encryption3Enabled: + if (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) + ext->alg = IW_ENCODE_ALG_TKIP; + else + ext->alg = IW_ENCODE_ALG_CCMP; + + if (max_key_len < 32) + return -E2BIG; + else + { + ext->key_len = 32; + pKey = (PCHAR)&pAd->StaCfg.PMK[0]; + } + break; + default: + return -EINVAL; + } + + if (ext->key_len && pKey) + { + encoding->flags |= IW_ENCODE_ENABLED; + memcpy(ext->key, pKey, ext->key_len); + } + + return 0; +} + +#ifdef SIOCSIWGENIE +int rt_ioctl_siwgenie(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PRTMP_ADAPTER pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) + { + DBGPRINT(RT_DEBUG_TRACE ,("===> rt_ioctl_siwgenie\n")); + pAd->StaCfg.bRSN_IE_FromWpaSupplicant = FALSE; + if ((wrqu->data.length == 0) || + (extra == NULL)) + { + return -EINVAL; + } + else if (wrqu->data.length) + { + if (pAd->StaCfg.pWpaAssocIe) + { + kfree(pAd->StaCfg.pWpaAssocIe); + pAd->StaCfg.pWpaAssocIe = NULL; + } + pAd->StaCfg.pWpaAssocIe = kmalloc(wrqu->data.length, MEM_ALLOC_FLAG); + if (pAd->StaCfg.pWpaAssocIe) + { + pAd->StaCfg.WpaAssocIeLen = wrqu->data.length; + NdisMoveMemory(pAd->StaCfg.pWpaAssocIe, extra, pAd->StaCfg.WpaAssocIeLen); + pAd->StaCfg.bRSN_IE_FromWpaSupplicant = TRUE; + } + else + pAd->StaCfg.WpaAssocIeLen = 0; + } + return 0; + } + else +#endif // WPA_SUPPLICANT_SUPPORT // + return -EOPNOTSUPP; +} +#endif // SIOCSIWGENIE // + +int rt_ioctl_giwgenie(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PRTMP_ADAPTER pAd = NULL; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if ((pAd->StaCfg.RSNIE_Len == 0) || + (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)) + { + wrqu->data.length = 0; + return 0; + } + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifdef SIOCSIWGENIE + if ((pAd->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE && + (pAd->StaCfg.WpaAssocIeLen > 0)) + { + if (wrqu->data.length < pAd->StaCfg.WpaAssocIeLen) + return -E2BIG; + + wrqu->data.length = pAd->StaCfg.WpaAssocIeLen; + memcpy(extra, pAd->StaCfg.pWpaAssocIe, pAd->StaCfg.WpaAssocIeLen); + } + else +#endif // SIOCSIWGENIE // +#endif // WPA_SUPPLICANT_SUPPORT // + { + UCHAR RSNIe = IE_WPA; + + if (wrqu->data.length < (pAd->StaCfg.RSNIE_Len + 2)) // ID, Len + return -E2BIG; + wrqu->data.length = pAd->StaCfg.RSNIE_Len + 2; + + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)) + RSNIe = IE_RSN; + + extra[0] = (char)RSNIe; + extra[1] = pAd->StaCfg.RSNIE_Len; + memcpy(extra+2, &pAd->StaCfg.RSN_IE[0], pAd->StaCfg.RSNIE_Len); + } + + return 0; +} + +int rt_ioctl_siwpmksa(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, + char *extra) +{ + PRTMP_ADAPTER pAd = NULL; + struct iw_pmksa *pPmksa = (struct iw_pmksa *)wrqu->data.pointer; + INT CachedIdx = 0, idx = 0; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (pPmksa == NULL) + return -EINVAL; + + DBGPRINT(RT_DEBUG_TRACE ,("===> rt_ioctl_siwpmksa\n")); + switch(pPmksa->cmd) + { + case IW_PMKSA_FLUSH: + NdisZeroMemory(pAd->StaCfg.SavedPMK, sizeof(BSSID_INFO)*PMKID_NO); + DBGPRINT(RT_DEBUG_TRACE ,("rt_ioctl_siwpmksa - IW_PMKSA_FLUSH\n")); + break; + case IW_PMKSA_REMOVE: + for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++) + { + // compare the BSSID + if (NdisEqualMemory(pPmksa->bssid.sa_data, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN)) + { + NdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN); + NdisZeroMemory(pAd->StaCfg.SavedPMK[CachedIdx].PMKID, 16); + for (idx = CachedIdx; idx < (pAd->StaCfg.SavedPMKNum - 1); idx++) + { + NdisMoveMemory(&pAd->StaCfg.SavedPMK[idx].BSSID[0], &pAd->StaCfg.SavedPMK[idx+1].BSSID[0], MAC_ADDR_LEN); + NdisMoveMemory(&pAd->StaCfg.SavedPMK[idx].PMKID[0], &pAd->StaCfg.SavedPMK[idx+1].PMKID[0], 16); + } + pAd->StaCfg.SavedPMKNum--; + break; + } + } + + DBGPRINT(RT_DEBUG_TRACE ,("rt_ioctl_siwpmksa - IW_PMKSA_REMOVE\n")); + break; + case IW_PMKSA_ADD: + for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++) + { + // compare the BSSID + if (NdisEqualMemory(pPmksa->bssid.sa_data, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, MAC_ADDR_LEN)) + break; + } + + // Found, replace it + if (CachedIdx < PMKID_NO) + { + DBGPRINT(RT_DEBUG_OFF, ("Update PMKID, idx = %d\n", CachedIdx)); + NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].BSSID[0], pPmksa->bssid.sa_data, MAC_ADDR_LEN); + NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].PMKID[0], pPmksa->pmkid, 16); + pAd->StaCfg.SavedPMKNum++; + } + // Not found, replace the last one + else + { + // Randomly replace one + CachedIdx = (pPmksa->bssid.sa_data[5] % PMKID_NO); + DBGPRINT(RT_DEBUG_OFF, ("Update PMKID, idx = %d\n", CachedIdx)); + NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].BSSID[0], pPmksa->bssid.sa_data, MAC_ADDR_LEN); + NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx].PMKID[0], pPmksa->pmkid, 16); + } + + DBGPRINT(RT_DEBUG_TRACE ,("rt_ioctl_siwpmksa - IW_PMKSA_ADD\n")); + break; + default: + DBGPRINT(RT_DEBUG_TRACE ,("rt_ioctl_siwpmksa - Unknow Command!!\n")); + break; + } + + return 0; +} +#endif // #if WIRELESS_EXT > 17 + +#ifdef DBG +static int +rt_private_ioctl_bbp(struct net_device *dev, struct iw_request_info *info, + struct iw_point *wrq, char *extra) + { + PSTRING this_char; + PSTRING value = NULL; + UCHAR regBBP = 0; +// CHAR arg[255]={0}; + UINT32 bbpId; + UINT32 bbpValue; + BOOLEAN bIsPrintAllBBP = FALSE; + INT Status = 0; + PRTMP_ADAPTER pAdapter = NULL; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + + memset(extra, 0x00, IW_PRIV_SIZE_MASK); + + if (wrq->length > 1) //No parameters. + { + sprintf(extra, "\n"); + + //Parsing Read or Write + this_char = wrq->pointer; + DBGPRINT(RT_DEBUG_TRACE, ("this_char=%s\n", this_char)); + if (!*this_char) + goto next; + + if ((value = rtstrchr(this_char, '=')) != NULL) + *value++ = 0; + + if (!value || !*value) + { //Read + DBGPRINT(RT_DEBUG_TRACE, ("this_char=%s, value=%s\n", this_char, value)); + if (sscanf(this_char, "%d", &(bbpId)) == 1) + { + if (bbpId <= MAX_BBP_ID) + { +#ifdef RALINK_ATE + if (ATE_ON(pAdapter)) + { + ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + } + else +#endif // RALINK_ATE // + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + } + sprintf(extra+strlen(extra), "R%02d[0x%02X]:%02X\n", bbpId, bbpId, regBBP); + wrq->length = strlen(extra) + 1; // 1: size of '\0' + DBGPRINT(RT_DEBUG_TRACE, ("msg=%s\n", extra)); + } + else + {//Invalid parametes, so default printk all bbp + bIsPrintAllBBP = TRUE; + goto next; + } + } + else + { //Invalid parametes, so default printk all bbp + bIsPrintAllBBP = TRUE; + goto next; + } + } + else + { //Write + if ((sscanf(this_char, "%d", &(bbpId)) == 1) && (sscanf(value, "%x", &(bbpValue)) == 1)) + { + if (bbpId <= MAX_BBP_ID) + { +#ifdef RALINK_ATE + if (ATE_ON(pAdapter)) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, bbpId, bbpValue); + /* read it back for showing */ + ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + } + else +#endif // RALINK_ATE // + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, bbpId, bbpValue); + /* read it back for showing */ + RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + } + sprintf(extra+strlen(extra), "R%02d[0x%02X]:%02X\n", bbpId, bbpId, regBBP); + wrq->length = strlen(extra) + 1; // 1: size of '\0' + DBGPRINT(RT_DEBUG_TRACE, ("msg=%s\n", extra)); + } + else + {//Invalid parametes, so default printk all bbp + bIsPrintAllBBP = TRUE; + goto next; + } + } + else + { //Invalid parametes, so default printk all bbp + bIsPrintAllBBP = TRUE; + goto next; + } + } + } + else + bIsPrintAllBBP = TRUE; + +next: + if (bIsPrintAllBBP) + { + memset(extra, 0x00, IW_PRIV_SIZE_MASK); + sprintf(extra, "\n"); + for (bbpId = 0; bbpId <= MAX_BBP_ID; bbpId++) + { + if (strlen(extra) >= (IW_PRIV_SIZE_MASK - 20)) + break; +#ifdef RALINK_ATE + if (ATE_ON(pAdapter)) + { + ATE_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + } + else +#endif // RALINK_ATE // + RTMP_BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + sprintf(extra+strlen(extra), "R%02d[0x%02X]:%02X ", bbpId, bbpId, regBBP); + if (bbpId%5 == 4) + sprintf(extra+strlen(extra), "%03d = %02X\n", bbpId, regBBP); // edit by johnli, change display format + } + + wrq->length = strlen(extra) + 1; // 1: size of '\0' + DBGPRINT(RT_DEBUG_TRACE, ("wrq->length = %d\n", wrq->length)); + } + + DBGPRINT(RT_DEBUG_TRACE, ("<==rt_private_ioctl_bbp\n\n")); + + return Status; +} +#endif // DBG // + +int rt_ioctl_siwrate(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PRTMP_ADAPTER pAd = NULL; + UINT32 rate = wrqu->bitrate.value, fixed = wrqu->bitrate.fixed; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_siwrate::Network is down!\n")); + return -ENETDOWN; + } + + DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_siwrate::(rate = %d, fixed = %d)\n", rate, fixed)); + /* rate = -1 => auto rate + rate = X, fixed = 1 => (fixed rate X) + */ + if (rate == -1) + { + //Auto Rate + pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; + pAd->StaCfg.bAutoTxRateSwitch = TRUE; + if ((pAd->CommonCfg.PhyMode <= PHY_11G) || + (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM)) + RTMPSetDesiredRates(pAd, -1); + +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + } + else + { + if (fixed) + { + pAd->StaCfg.bAutoTxRateSwitch = FALSE; + if ((pAd->CommonCfg.PhyMode <= PHY_11G) || + (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM)) + RTMPSetDesiredRates(pAd, rate); + else + { + pAd->StaCfg.DesiredTransmitSetting.field.MCS = MCS_AUTO; +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + } + DBGPRINT(RT_DEBUG_TRACE, ("rt_ioctl_siwrate::(HtMcs=%d)\n",pAd->StaCfg.DesiredTransmitSetting.field.MCS)); + } + else + { + // TODO: rate = X, fixed = 0 => (rates <= X) + return -EOPNOTSUPP; + } + } + + return 0; +} + +int rt_ioctl_giwrate(struct net_device *dev, + struct iw_request_info *info, + union iwreq_data *wrqu, char *extra) +{ + PRTMP_ADAPTER pAd = NULL; + int rate_index = 0, rate_count = 0; + HTTRANSMIT_SETTING ht_setting; + + GET_PAD_FROM_NET_DEV(pAd, dev); + + rate_count = sizeof(ralinkrate)/sizeof(__s32); + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if ((pAd->StaCfg.bAutoTxRateSwitch == FALSE) && + (INFRA_ON(pAd)) && + ((pAd->CommonCfg.PhyMode <= PHY_11G) || (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE <= MODE_OFDM))) + ht_setting.word = pAd->StaCfg.HTPhyMode.word; + else + ht_setting.word = pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word; + +#ifdef DOT11_N_SUPPORT + if (ht_setting.field.MODE >= MODE_HTMIX) + { +// rate_index = 12 + ((UCHAR)ht_setting.field.BW *16) + ((UCHAR)ht_setting.field.ShortGI *32) + ((UCHAR)ht_setting.field.MCS); + rate_index = 12 + ((UCHAR)ht_setting.field.BW *24) + ((UCHAR)ht_setting.field.ShortGI *48) + ((UCHAR)ht_setting.field.MCS); + } + else +#endif // DOT11_N_SUPPORT // + if (ht_setting.field.MODE == MODE_OFDM) + rate_index = (UCHAR)(ht_setting.field.MCS) + 4; + else if (ht_setting.field.MODE == MODE_CCK) + rate_index = (UCHAR)(ht_setting.field.MCS); + + if (rate_index < 0) + rate_index = 0; + + if (rate_index > rate_count) + rate_index = rate_count; + + wrqu->bitrate.value = ralinkrate[rate_index] * 500000; + wrqu->bitrate.disabled = 0; + + return 0; +} + +static const iw_handler rt_handler[] = +{ + (iw_handler) NULL, /* SIOCSIWCOMMIT */ + (iw_handler) rt_ioctl_giwname, /* SIOCGIWNAME */ + (iw_handler) NULL, /* SIOCSIWNWID */ + (iw_handler) NULL, /* SIOCGIWNWID */ + (iw_handler) rt_ioctl_siwfreq, /* SIOCSIWFREQ */ + (iw_handler) rt_ioctl_giwfreq, /* SIOCGIWFREQ */ + (iw_handler) rt_ioctl_siwmode, /* SIOCSIWMODE */ + (iw_handler) rt_ioctl_giwmode, /* SIOCGIWMODE */ + (iw_handler) NULL, /* SIOCSIWSENS */ + (iw_handler) NULL, /* SIOCGIWSENS */ + (iw_handler) NULL /* not used */, /* SIOCSIWRANGE */ + (iw_handler) rt_ioctl_giwrange, /* SIOCGIWRANGE */ + (iw_handler) NULL /* not used */, /* SIOCSIWPRIV */ + (iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */ + (iw_handler) NULL /* not used */, /* SIOCSIWSTATS */ + (iw_handler) rt28xx_get_wireless_stats /* kernel code */, /* SIOCGIWSTATS */ + (iw_handler) NULL, /* SIOCSIWSPY */ + (iw_handler) NULL, /* SIOCGIWSPY */ + (iw_handler) NULL, /* SIOCSIWTHRSPY */ + (iw_handler) NULL, /* SIOCGIWTHRSPY */ + (iw_handler) rt_ioctl_siwap, /* SIOCSIWAP */ + (iw_handler) rt_ioctl_giwap, /* SIOCGIWAP */ +#ifdef SIOCSIWMLME + (iw_handler) rt_ioctl_siwmlme, /* SIOCSIWMLME */ +#else + (iw_handler) NULL, /* SIOCSIWMLME */ +#endif // SIOCSIWMLME // + (iw_handler) rt_ioctl_iwaplist, /* SIOCGIWAPLIST */ +#ifdef SIOCGIWSCAN + (iw_handler) rt_ioctl_siwscan, /* SIOCSIWSCAN */ + (iw_handler) rt_ioctl_giwscan, /* SIOCGIWSCAN */ +#else + (iw_handler) NULL, /* SIOCSIWSCAN */ + (iw_handler) NULL, /* SIOCGIWSCAN */ +#endif /* SIOCGIWSCAN */ + (iw_handler) rt_ioctl_siwessid, /* SIOCSIWESSID */ + (iw_handler) rt_ioctl_giwessid, /* SIOCGIWESSID */ + (iw_handler) rt_ioctl_siwnickn, /* SIOCSIWNICKN */ + (iw_handler) rt_ioctl_giwnickn, /* SIOCGIWNICKN */ + (iw_handler) NULL, /* -- hole -- */ + (iw_handler) NULL, /* -- hole -- */ + (iw_handler) rt_ioctl_siwrate, /* SIOCSIWRATE */ + (iw_handler) rt_ioctl_giwrate, /* SIOCGIWRATE */ + (iw_handler) rt_ioctl_siwrts, /* SIOCSIWRTS */ + (iw_handler) rt_ioctl_giwrts, /* SIOCGIWRTS */ + (iw_handler) rt_ioctl_siwfrag, /* SIOCSIWFRAG */ + (iw_handler) rt_ioctl_giwfrag, /* SIOCGIWFRAG */ + (iw_handler) NULL, /* SIOCSIWTXPOW */ + (iw_handler) NULL, /* SIOCGIWTXPOW */ + (iw_handler) NULL, /* SIOCSIWRETRY */ + (iw_handler) NULL, /* SIOCGIWRETRY */ + (iw_handler) rt_ioctl_siwencode, /* SIOCSIWENCODE */ + (iw_handler) rt_ioctl_giwencode, /* SIOCGIWENCODE */ + (iw_handler) NULL, /* SIOCSIWPOWER */ + (iw_handler) NULL, /* SIOCGIWPOWER */ + (iw_handler) NULL, /* -- hole -- */ + (iw_handler) NULL, /* -- hole -- */ +#if WIRELESS_EXT > 17 + (iw_handler) rt_ioctl_siwgenie, /* SIOCSIWGENIE */ + (iw_handler) rt_ioctl_giwgenie, /* SIOCGIWGENIE */ + (iw_handler) rt_ioctl_siwauth, /* SIOCSIWAUTH */ + (iw_handler) rt_ioctl_giwauth, /* SIOCGIWAUTH */ + (iw_handler) rt_ioctl_siwencodeext, /* SIOCSIWENCODEEXT */ + (iw_handler) rt_ioctl_giwencodeext, /* SIOCGIWENCODEEXT */ + (iw_handler) rt_ioctl_siwpmksa, /* SIOCSIWPMKSA */ +#endif +}; + +static const iw_handler rt_priv_handlers[] = { + (iw_handler) NULL, /* + 0x00 */ + (iw_handler) NULL, /* + 0x01 */ + (iw_handler) rt_ioctl_setparam, /* + 0x02 */ +#ifdef DBG + (iw_handler) rt_private_ioctl_bbp, /* + 0x03 */ +#else + (iw_handler) NULL, /* + 0x03 */ +#endif + (iw_handler) NULL, /* + 0x04 */ + (iw_handler) NULL, /* + 0x05 */ + (iw_handler) NULL, /* + 0x06 */ + (iw_handler) NULL, /* + 0x07 */ + (iw_handler) NULL, /* + 0x08 */ + (iw_handler) rt_private_get_statistics, /* + 0x09 */ + (iw_handler) NULL, /* + 0x0A */ + (iw_handler) NULL, /* + 0x0B */ + (iw_handler) NULL, /* + 0x0C */ + (iw_handler) NULL, /* + 0x0D */ + (iw_handler) NULL, /* + 0x0E */ + (iw_handler) NULL, /* + 0x0F */ + (iw_handler) NULL, /* + 0x10 */ + (iw_handler) rt_private_show, /* + 0x11 */ + (iw_handler) NULL, /* + 0x12 */ + (iw_handler) NULL, /* + 0x13 */ + (iw_handler) NULL, /* + 0x14 */ + (iw_handler) NULL, /* + 0x15 */ + (iw_handler) NULL, /* + 0x16 */ + (iw_handler) NULL, /* + 0x17 */ + (iw_handler) NULL, /* + 0x18 */ +}; + +const struct iw_handler_def rt28xx_iw_handler_def = +{ +#define N(a) (sizeof (a) / sizeof (a[0])) + .standard = (iw_handler *) rt_handler, + .num_standard = sizeof(rt_handler) / sizeof(iw_handler), + .private = (iw_handler *) rt_priv_handlers, + .num_private = N(rt_priv_handlers), + .private_args = (struct iw_priv_args *) privtab, + .num_private_args = N(privtab), +#if IW_HANDLER_VERSION >= 7 + .get_wireless_stats = rt28xx_get_wireless_stats, +#endif +}; + +INT RTMPSetInformation( + IN PRTMP_ADAPTER pAd, + IN OUT struct ifreq *rq, + IN INT cmd) +{ + struct iwreq *wrq = (struct iwreq *) rq; + NDIS_802_11_SSID Ssid; + NDIS_802_11_MAC_ADDRESS Bssid; + RT_802_11_PHY_MODE PhyMode; + RT_802_11_STA_CONFIG StaConfig; + NDIS_802_11_RATES aryRates; + RT_802_11_PREAMBLE Preamble; + NDIS_802_11_WEP_STATUS WepStatus; + NDIS_802_11_AUTHENTICATION_MODE AuthMode = Ndis802_11AuthModeMax; + NDIS_802_11_NETWORK_INFRASTRUCTURE BssType; + NDIS_802_11_RTS_THRESHOLD RtsThresh; + NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh; + NDIS_802_11_POWER_MODE PowerMode; + PNDIS_802_11_KEY pKey = NULL; + PNDIS_802_11_WEP pWepKey =NULL; + PNDIS_802_11_REMOVE_KEY pRemoveKey = NULL; + NDIS_802_11_CONFIGURATION Config, *pConfig = NULL; + NDIS_802_11_NETWORK_TYPE NetType; + ULONG Now; + UINT KeyIdx = 0; + INT Status = NDIS_STATUS_SUCCESS, MaxPhyMode = PHY_11G; + ULONG PowerTemp; + BOOLEAN RadioState; + BOOLEAN StateMachineTouched = FALSE; + PNDIS_802_11_PASSPHRASE ppassphrase = NULL; +#ifdef DOT11_N_SUPPORT + OID_SET_HT_PHYMODE HT_PhyMode; //11n ,kathy +#endif // DOT11_N_SUPPORT // +#ifdef WPA_SUPPLICANT_SUPPORT + PNDIS_802_11_PMKID pPmkId = NULL; + BOOLEAN IEEE8021xState = FALSE; + BOOLEAN IEEE8021x_required_keys = FALSE; + UCHAR wpa_supplicant_enable = 0; +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef SNMP_SUPPORT + TX_RTY_CFG_STRUC tx_rty_cfg; + ULONG ShortRetryLimit, LongRetryLimit; + UCHAR ctmp; +#endif // SNMP_SUPPORT // + + + + +#ifdef DOT11_N_SUPPORT + MaxPhyMode = PHY_11N_5G; +#endif // DOT11_N_SUPPORT // + + DBGPRINT(RT_DEBUG_TRACE, ("-->RTMPSetInformation(), 0x%08x\n", cmd&0x7FFF)); + switch(cmd & 0x7FFF) { + case RT_OID_802_11_COUNTRY_REGION: + if (wrq->u.data.length < sizeof(UCHAR)) + Status = -EINVAL; + // Only avaliable when EEPROM not programming + else if (!(pAd->CommonCfg.CountryRegion & 0x80) && !(pAd->CommonCfg.CountryRegionForABand & 0x80)) + { + ULONG Country; + UCHAR TmpPhy; + + Status = copy_from_user(&Country, wrq->u.data.pointer, wrq->u.data.length); + pAd->CommonCfg.CountryRegion = (UCHAR)(Country & 0x000000FF); + pAd->CommonCfg.CountryRegionForABand = (UCHAR)((Country >> 8) & 0x000000FF); + TmpPhy = pAd->CommonCfg.PhyMode; + pAd->CommonCfg.PhyMode = 0xff; + // Build all corresponding channel information + RTMPSetPhyMode(pAd, TmpPhy); +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_COUNTRY_REGION (A:%d B/G:%d)\n", pAd->CommonCfg.CountryRegionForABand, + pAd->CommonCfg.CountryRegion)); + } + break; + case OID_802_11_BSSID_LIST_SCAN: + Now = jiffies; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_BSSID_LIST_SCAN, TxCnt = %d \n", pAd->RalinkCounters.LastOneSecTotalTxCount)); + + if (MONITOR_ON(pAd)) + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n")); + break; + } + + //Benson add 20080527, when radio off, sta don't need to scan + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) + break; + +// if (pAd->RalinkCounters.LastOneSecTotalTxCount > 100) //Baron 2010/01/27 + //Baron 2010/01/28 + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && ((pAd->RalinkCounters.LastOneSecTotalTxCount > 50) || (pAd->RalinkCounters.LastOneSecRxOkDataCnt > 50))) + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, ignore this set::OID_802_11_BSSID_LIST_SCAN\n")); + Status = NDIS_STATUS_SUCCESS; + pAd->StaCfg.ScanCnt = 99; // Prevent auto scan triggered by this OID + break; + } + + if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) && + ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) && + (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! Link UP, Port Not Secured! ignore this set::OID_802_11_BSSID_LIST_SCAN\n")); + Status = NDIS_STATUS_SUCCESS; + pAd->StaCfg.ScanCnt = 99; // Prevent auto scan triggered by this OID + break; + } + + + if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAd); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + + // tell CNTL state machine to call NdisMSetInformationComplete() after completing + // this request, because this request is initiated by NDIS. + pAd->MlmeAux.CurrReqIsFromNdis = FALSE; + // Reset allowed scan retries + pAd->StaCfg.ScanCnt = 0; + pAd->StaCfg.LastScanTime = Now; + + pAd->StaCfg.bScanReqIsFromWebUI = TRUE; + RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_BSSID_LIST_SCAN, + 0, + NULL, 0); + + Status = NDIS_STATUS_SUCCESS; + StateMachineTouched = TRUE; + break; + case OID_802_11_SSID: + if (wrq->u.data.length != sizeof(NDIS_802_11_SSID)) + Status = -EINVAL; + else + { + PSTRING pSsidString = NULL; + Status = copy_from_user(&Ssid, wrq->u.data.pointer, wrq->u.data.length); + + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SSID (Len=%d,Ssid=%s)\n", Ssid.SsidLength, Ssid.Ssid)); + if (Ssid.SsidLength > MAX_LEN_OF_SSID) + Status = -EINVAL; + else + { + if (Ssid.SsidLength == 0) + { + Set_SSID_Proc(pAd, ""); + } + else + { + pSsidString = (PSTRING)kmalloc(MAX_LEN_OF_SSID+1, MEM_ALLOC_FLAG); + if (pSsidString) + { + NdisZeroMemory(pSsidString, MAX_LEN_OF_SSID+1); + NdisMoveMemory(pSsidString, Ssid.Ssid, Ssid.SsidLength); + Set_SSID_Proc(pAd, pSsidString); + kfree(pSsidString); + } + else + Status = -ENOMEM; + } + } + } + break; + case OID_802_11_SET_PASSPHRASE: + ppassphrase= kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); + + if(ppassphrase== NULL) + { + Status = -ENOMEM; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed!!\n")); + break; + } + else + { + Status = copy_from_user(ppassphrase, wrq->u.data.pointer, wrq->u.data.length); + + if (Status) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed (length mismatch)!!\n")); + } + else + { + if(ppassphrase->KeyLength < 8 || ppassphrase->KeyLength > 64) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_PASSPHRASE, Failed (len less than 8 or greater than 64)!!\n")); + } + else + { + // set key passphrase and length + NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64); + NdisMoveMemory(pAd->StaCfg.WpaPassPhrase, &ppassphrase->KeyMaterial, ppassphrase->KeyLength); + pAd->StaCfg.WpaPassPhraseLen = ppassphrase->KeyLength; + hex_dump("pAd->StaCfg.WpaPassPhrase", pAd->StaCfg.WpaPassPhrase, 64); + printk("WpaPassPhrase=%s\n",pAd->StaCfg.WpaPassPhrase); + } + } + } + kfree(ppassphrase); + break; + + case OID_802_11_BSSID: + if (wrq->u.data.length != sizeof(NDIS_802_11_MAC_ADDRESS)) + Status = -EINVAL; + else + { + Status = copy_from_user(&Bssid, wrq->u.data.pointer, wrq->u.data.length); + + // tell CNTL state machine to call NdisMSetInformationComplete() after completing + // this request, because this request is initiated by NDIS. + pAd->MlmeAux.CurrReqIsFromNdis = FALSE; + + // Prevent to connect AP again in STAMlmePeriodicExec + pAd->MlmeAux.AutoReconnectSsidLen= 32; + + // Reset allowed scan retries + pAd->StaCfg.ScanCnt = 0; + + if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAd); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_BSSID, + sizeof(NDIS_802_11_MAC_ADDRESS), + (VOID *)&Bssid, 0); + Status = NDIS_STATUS_SUCCESS; + StateMachineTouched = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_BSSID %02x:%02x:%02x:%02x:%02x:%02x\n", + Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5])); + } + break; + case RT_OID_802_11_RADIO: + if (wrq->u.data.length != sizeof(BOOLEAN)) + Status = -EINVAL; + else + { + Status = copy_from_user(&RadioState, wrq->u.data.pointer, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_RADIO (=%d)\n", RadioState)); + if (pAd->StaCfg.bSwRadio != RadioState) + { + pAd->StaCfg.bSwRadio = RadioState; + if (pAd->StaCfg.bRadio != (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio)) + { + pAd->StaCfg.bRadio = (pAd->StaCfg.bHwRadio && pAd->StaCfg.bSwRadio); + if (pAd->StaCfg.bRadio == TRUE) + { + MlmeRadioOn(pAd); + // Update extra information + pAd->ExtraInfo = EXTRA_INFO_CLEAR; + } + else + { + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAd); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + } + + MlmeRadioOff(pAd); + // Update extra information + pAd->ExtraInfo = SW_RADIO_OFF; + } + } + } + } + break; + case RT_OID_802_11_PHY_MODE: + if (wrq->u.data.length != sizeof(RT_802_11_PHY_MODE)) + Status = -EINVAL; + else + { + Status = copy_from_user(&PhyMode, wrq->u.data.pointer, wrq->u.data.length); + if (PhyMode <= MaxPhyMode) + { + pAd->CommonCfg.DesiredPhyMode = PhyMode; + RTMPSetPhyMode(pAd, PhyMode); +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PHY_MODE (=%d)\n", PhyMode)); + } + break; + case RT_OID_802_11_STA_CONFIG: + if (wrq->u.data.length != sizeof(RT_802_11_STA_CONFIG)) + Status = -EINVAL; + else + { + UINT32 Value; + + Status = copy_from_user(&StaConfig, wrq->u.data.pointer, wrq->u.data.length); + pAd->CommonCfg.bEnableTxBurst = StaConfig.EnableTxBurst; + pAd->CommonCfg.UseBGProtection = StaConfig.UseBGProtection; + pAd->CommonCfg.bUseShortSlotTime = 1; // 2003-10-30 always SHORT SLOT capable + if ((pAd->CommonCfg.PhyMode != StaConfig.AdhocMode) && + (StaConfig.AdhocMode <= MaxPhyMode)) + { + // allow dynamic change of "USE OFDM rate or not" in ADHOC mode + // if setting changed, need to reset current TX rate as well as BEACON frame format + if (pAd->StaCfg.BssType == BSS_ADHOC) + { + pAd->CommonCfg.PhyMode = StaConfig.AdhocMode; + RTMPSetPhyMode(pAd, PhyMode); + MlmeUpdateTxRates(pAd, FALSE, 0); + MakeIbssBeacon(pAd); // re-build BEACON frame + AsicEnableIbssSync(pAd); // copy to on-chip memory + } + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_STA_CONFIG (Burst=%d, Protection=%ld,ShortSlot=%d\n", + pAd->CommonCfg.bEnableTxBurst, + pAd->CommonCfg.UseBGProtection, + pAd->CommonCfg.bUseShortSlotTime)); + +#ifdef XLINK_SUPPORT + if (pAd->StaCfg.PSPXlink) + Value = PSPXLINK; + else +#endif // XLINK_SUPPORT // + Value = STANORMAL; + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Value); + } + break; + case OID_802_11_DESIRED_RATES: + if (wrq->u.data.length != sizeof(NDIS_802_11_RATES)) + Status = -EINVAL; + else + { + Status = copy_from_user(&aryRates, wrq->u.data.pointer, wrq->u.data.length); + NdisZeroMemory(pAd->CommonCfg.DesireRate, MAX_LEN_OF_SUPPORTED_RATES); + NdisMoveMemory(pAd->CommonCfg.DesireRate, &aryRates, sizeof(NDIS_802_11_RATES)); + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DESIRED_RATES (%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x)\n", + pAd->CommonCfg.DesireRate[0],pAd->CommonCfg.DesireRate[1], + pAd->CommonCfg.DesireRate[2],pAd->CommonCfg.DesireRate[3], + pAd->CommonCfg.DesireRate[4],pAd->CommonCfg.DesireRate[5], + pAd->CommonCfg.DesireRate[6],pAd->CommonCfg.DesireRate[7] )); + // Changing DesiredRate may affect the MAX TX rate we used to TX frames out + MlmeUpdateTxRates(pAd, FALSE, 0); + } + break; + case RT_OID_802_11_PREAMBLE: + if (wrq->u.data.length != sizeof(RT_802_11_PREAMBLE)) + Status = -EINVAL; + else + { + Status = copy_from_user(&Preamble, wrq->u.data.pointer, wrq->u.data.length); + if (Preamble == Rt802_11PreambleShort) + { + pAd->CommonCfg.TxPreamble = Preamble; + MlmeSetTxPreamble(pAd, Rt802_11PreambleShort); + } + else if ((Preamble == Rt802_11PreambleLong) || (Preamble == Rt802_11PreambleAuto)) + { + // if user wants AUTO, initialize to LONG here, then change according to AP's + // capability upon association. + pAd->CommonCfg.TxPreamble = Preamble; + MlmeSetTxPreamble(pAd, Rt802_11PreambleLong); + } + else + { + Status = -EINVAL; + break; + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_PREAMBLE (=%d)\n", Preamble)); + } + break; + case OID_802_11_WEP_STATUS: + if (wrq->u.data.length != sizeof(NDIS_802_11_WEP_STATUS)) + Status = -EINVAL; + else + { + Status = copy_from_user(&WepStatus, wrq->u.data.pointer, wrq->u.data.length); + // Since TKIP, AES, WEP are all supported. It should not have any invalid setting + if (WepStatus <= Ndis802_11Encryption3KeyAbsent) + { + if (pAd->StaCfg.WepStatus != WepStatus) + { + // Config has changed + pAd->bConfigChanged = TRUE; + } + pAd->StaCfg.WepStatus = WepStatus; + pAd->StaCfg.OrigWepStatus = WepStatus; + pAd->StaCfg.PairCipher = WepStatus; + pAd->StaCfg.GroupCipher = WepStatus; + + if (pAd->StaCfg.BssType == BSS_ADHOC) + { + // Build all corresponding channel information + RTMPSetPhyMode(pAd, pAd->CommonCfg.DesiredPhyMode); +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + } + } + else + { + Status = -EINVAL; + break; + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEP_STATUS (=%d)\n",WepStatus)); + } + break; + case OID_802_11_AUTHENTICATION_MODE: + if (wrq->u.data.length != sizeof(NDIS_802_11_AUTHENTICATION_MODE)) + Status = -EINVAL; + else + { + Status = copy_from_user(&AuthMode, wrq->u.data.pointer, wrq->u.data.length); + if (AuthMode > Ndis802_11AuthModeMax) + { + Status = -EINVAL; + break; + } + else + { + if (pAd->StaCfg.AuthMode != AuthMode) + { + // Config has changed + pAd->bConfigChanged = TRUE; + } + pAd->StaCfg.AuthMode = AuthMode; + } + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_AUTHENTICATION_MODE (=%d) \n",pAd->StaCfg.AuthMode)); + } + break; + case OID_802_11_INFRASTRUCTURE_MODE: + if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE)) + Status = -EINVAL; + else + { + Status = copy_from_user(&BssType, wrq->u.data.pointer, wrq->u.data.length); + + if (BssType == Ndis802_11IBSS) + Set_NetworkType_Proc(pAd, "Adhoc"); + else if (BssType == Ndis802_11Infrastructure) + Set_NetworkType_Proc(pAd, "Infra"); + else if (BssType == Ndis802_11Monitor) + Set_NetworkType_Proc(pAd, "Monitor"); + else + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_INFRASTRUCTURE_MODE (unknown)\n")); + } + } + break; + case OID_802_11_REMOVE_WEP: + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_WEP\n")); + if (wrq->u.data.length != sizeof(NDIS_802_11_KEY_INDEX)) + { + Status = -EINVAL; + } + else + { + KeyIdx = *(NDIS_802_11_KEY_INDEX *) wrq->u.data.pointer; + + if (KeyIdx & 0x80000000) + { + // Should never set default bit when remove key + Status = -EINVAL; + } + else + { + KeyIdx = KeyIdx & 0x0fffffff; + if (KeyIdx >= 4){ + Status = -EINVAL; + } + else + { + pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0; + pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE; + AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx); + } + } + } + break; + case RT_OID_802_11_RESET_COUNTERS: + NdisZeroMemory(&pAd->WlanCounters, sizeof(COUNTER_802_11)); + NdisZeroMemory(&pAd->Counters8023, sizeof(COUNTER_802_3)); + NdisZeroMemory(&pAd->RalinkCounters, sizeof(COUNTER_RALINK)); + pAd->Counters8023.RxNoBuffer = 0; + pAd->Counters8023.GoodReceives = 0; + pAd->Counters8023.RxNoBuffer = 0; + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_RESET_COUNTERS \n")); + break; + case OID_802_11_RTS_THRESHOLD: + if (wrq->u.data.length != sizeof(NDIS_802_11_RTS_THRESHOLD)) + Status = -EINVAL; + else + { + Status = copy_from_user(&RtsThresh, wrq->u.data.pointer, wrq->u.data.length); + if (RtsThresh > MAX_RTS_THRESHOLD) + Status = -EINVAL; + else + pAd->CommonCfg.RtsThreshold = (USHORT)RtsThresh; + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_RTS_THRESHOLD (=%ld)\n",RtsThresh)); + break; + case OID_802_11_FRAGMENTATION_THRESHOLD: + if (wrq->u.data.length != sizeof(NDIS_802_11_FRAGMENTATION_THRESHOLD)) + Status = -EINVAL; + else + { + Status = copy_from_user(&FragThresh, wrq->u.data.pointer, wrq->u.data.length); + pAd->CommonCfg.bUseZeroToDisableFragment = FALSE; + if (FragThresh > MAX_FRAG_THRESHOLD || FragThresh < MIN_FRAG_THRESHOLD) + { + if (FragThresh == 0) + { + pAd->CommonCfg.FragmentThreshold = MAX_FRAG_THRESHOLD; + pAd->CommonCfg.bUseZeroToDisableFragment = TRUE; + } + else + Status = -EINVAL; + } + else + pAd->CommonCfg.FragmentThreshold = (USHORT)FragThresh; + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_FRAGMENTATION_THRESHOLD (=%ld) \n",FragThresh)); + break; + case OID_802_11_POWER_MODE: + if (wrq->u.data.length != sizeof(NDIS_802_11_POWER_MODE)) + Status = -EINVAL; + else + { + Status = copy_from_user(&PowerMode, wrq->u.data.pointer, wrq->u.data.length); + if (PowerMode == Ndis802_11PowerModeCAM) + Set_PSMode_Proc(pAd, "CAM"); + else if (PowerMode == Ndis802_11PowerModeMAX_PSP) + Set_PSMode_Proc(pAd, "Max_PSP"); + else if (PowerMode == Ndis802_11PowerModeFast_PSP) + Set_PSMode_Proc(pAd, "Fast_PSP"); + else if (PowerMode == Ndis802_11PowerModeLegacy_PSP) + Set_PSMode_Proc(pAd, "Legacy_PSP"); + else + Status = -EINVAL; + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_POWER_MODE (=%d)\n",PowerMode)); + break; + case RT_OID_802_11_TX_POWER_LEVEL_1: + if (wrq->u.data.length < sizeof(ULONG)) + Status = -EINVAL; + else + { + Status = copy_from_user(&PowerTemp, wrq->u.data.pointer, wrq->u.data.length); + if (PowerTemp > 100) + PowerTemp = 0xffffffff; // AUTO + pAd->CommonCfg.TxPowerDefault = PowerTemp; //keep current setting. + pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAd->CommonCfg.TxPowerPercentage)); + } + break; + case OID_802_11_NETWORK_TYPE_IN_USE: + if (wrq->u.data.length != sizeof(NDIS_802_11_NETWORK_TYPE)) + Status = -EINVAL; + else + { + Status = copy_from_user(&NetType, wrq->u.data.pointer, wrq->u.data.length); + + if (NetType == Ndis802_11DS) + RTMPSetPhyMode(pAd, PHY_11B); + else if (NetType == Ndis802_11OFDM24) + RTMPSetPhyMode(pAd, PHY_11BG_MIXED); + else if (NetType == Ndis802_11OFDM5) + RTMPSetPhyMode(pAd, PHY_11A); + else + Status = -EINVAL; +#ifdef DOT11_N_SUPPORT + if (Status == NDIS_STATUS_SUCCESS) + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_NETWORK_TYPE_IN_USE (=%d)\n",NetType)); + } + break; + // For WPA PSK PMK key + case RT_OID_802_11_ADD_WPA: + pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); + if(pKey == NULL) + { + Status = -ENOMEM; + break; + } + + Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length); + if (pKey->Length != wrq->u.data.length) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA, Failed!!\n")); + } + else + { + if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) && + (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) && + (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) ) + { + Status = -EOPNOTSUPP; + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA, Failed!! [AuthMode != WPAPSK/WPA2PSK/WPANONE]\n")); + } + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) ) // Only for WPA PSK mode + { + NdisMoveMemory(pAd->StaCfg.PMK, &pKey->KeyMaterial, pKey->KeyLength); + // Use RaConfig as PSK agent. + // Start STA supplicant state machine + if (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) + pAd->StaCfg.WpaState = SS_START; + + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength)); + } + else + { + pAd->StaCfg.WpaState = SS_NOTUSE; + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_WPA (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength)); + } + } + kfree(pKey); + break; + case OID_802_11_REMOVE_KEY: + pRemoveKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); + if(pRemoveKey == NULL) + { + Status = -ENOMEM; + break; + } + + Status = copy_from_user(pRemoveKey, wrq->u.data.pointer, wrq->u.data.length); + if (pRemoveKey->Length != wrq->u.data.length) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!\n")); + } + else + { + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + { + RTMPWPARemoveKeyProc(pAd, pRemoveKey); + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Remove WPA Key!!\n")); + } + else + { + KeyIdx = pRemoveKey->KeyIndex; + + if (KeyIdx & 0x80000000) + { + // Should never set default bit when remove key + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(Should never set default bit when remove key)\n")); + } + else + { + KeyIdx = KeyIdx & 0x0fffffff; + if (KeyIdx > 3) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY, Failed!!(KeyId[%d] out of range)\n", KeyIdx)); + } + else + { + pAd->SharedKey[BSS0][KeyIdx].KeyLen = 0; + pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_NONE; + AsicRemoveSharedKeyEntry(pAd, 0, (UCHAR)KeyIdx); + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_REMOVE_KEY (id=0x%x, Len=%d-byte)\n", pRemoveKey->KeyIndex, pRemoveKey->Length)); + } + } + } + } + kfree(pRemoveKey); + break; + // New for WPA + case OID_802_11_ADD_KEY: + pKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); + if(pKey == NULL) + { + Status = -ENOMEM; + break; + } + Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length); + if (pKey->Length != wrq->u.data.length) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY, Failed!!\n")); + } + else + { + RTMPAddKey(pAd, pKey); + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_KEY (id=0x%x, Len=%d-byte)\n", pKey->KeyIndex, pKey->KeyLength)); + } + kfree(pKey); + break; + case OID_802_11_CONFIGURATION: + if (wrq->u.data.length != sizeof(NDIS_802_11_CONFIGURATION)) + Status = -EINVAL; + else + { + Status = copy_from_user(&Config, wrq->u.data.pointer, wrq->u.data.length); + pConfig = &Config; + + if ((pConfig->BeaconPeriod >= 20) && (pConfig->BeaconPeriod <=400)) + pAd->CommonCfg.BeaconPeriod = (USHORT) pConfig->BeaconPeriod; + + pAd->StaActive.AtimWin = (USHORT) pConfig->ATIMWindow; + MAP_KHZ_TO_CHANNEL_ID(pConfig->DSConfig, pAd->CommonCfg.Channel); + // + // Save the channel on MlmeAux for CntlOidRTBssidProc used. + // + pAd->MlmeAux.Channel = pAd->CommonCfg.Channel; + + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_CONFIGURATION (BeacnPeriod=%ld,AtimW=%ld,Ch=%d)\n", + pConfig->BeaconPeriod, pConfig->ATIMWindow, pAd->CommonCfg.Channel)); + // Config has changed + pAd->bConfigChanged = TRUE; + } + break; +#ifdef DOT11_N_SUPPORT + case RT_OID_802_11_SET_HT_PHYMODE: + if (wrq->u.data.length != sizeof(OID_SET_HT_PHYMODE)) + Status = -EINVAL; + else + { + POID_SET_HT_PHYMODE pHTPhyMode = &HT_PhyMode; + + Status = copy_from_user(&HT_PhyMode, wrq->u.data.pointer, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Set::pHTPhyMode (PhyMode = %d,TransmitNo = %d, HtMode = %d, ExtOffset = %d , MCS = %d, BW = %d, STBC = %d, SHORTGI = %d) \n", + pHTPhyMode->PhyMode, pHTPhyMode->TransmitNo,pHTPhyMode->HtMode,pHTPhyMode->ExtOffset, + pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->SHORTGI)); + if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) + RTMPSetHT(pAd, pHTPhyMode); + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_HT_PHYMODE(MCS=%d,BW=%d,SGI=%d,STBC=%d)\n", + pAd->StaCfg.HTPhyMode.field.MCS, pAd->StaCfg.HTPhyMode.field.BW, pAd->StaCfg.HTPhyMode.field.ShortGI, + pAd->StaCfg.HTPhyMode.field.STBC)); + break; +#endif // DOT11_N_SUPPORT // + case RT_OID_802_11_SET_APSD_SETTING: + if (wrq->u.data.length != sizeof(ULONG)) + Status = -EINVAL; + else + { + ULONG apsd ; + Status = copy_from_user(&apsd, wrq->u.data.pointer, wrq->u.data.length); + + /*------------------------------------------------------------------- + |B31~B7 | B6~B5 | B4 | B3 | B2 | B1 | B0 | + --------------------------------------------------------------------- + | Rsvd | Max SP Len | AC_VO | AC_VI | AC_BK | AC_BE | APSD Capable | + ---------------------------------------------------------------------*/ + pAd->CommonCfg.bAPSDCapable = (apsd & 0x00000001) ? TRUE : FALSE; + pAd->CommonCfg.bAPSDAC_BE = ((apsd & 0x00000002) >> 1) ? TRUE : FALSE; + pAd->CommonCfg.bAPSDAC_BK = ((apsd & 0x00000004) >> 2) ? TRUE : FALSE; + pAd->CommonCfg.bAPSDAC_VI = ((apsd & 0x00000008) >> 3) ? TRUE : FALSE; + pAd->CommonCfg.bAPSDAC_VO = ((apsd & 0x00000010) >> 4) ? TRUE : FALSE; + pAd->CommonCfg.MaxSPLength = (UCHAR)((apsd & 0x00000060) >> 5); + + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_APSD_SETTING (apsd=0x%lx, APSDCap=%d, [BE,BK,VI,VO]=[%d/%d/%d/%d], MaxSPLen=%d)\n", apsd, pAd->CommonCfg.bAPSDCapable, + pAd->CommonCfg.bAPSDAC_BE, pAd->CommonCfg.bAPSDAC_BK, pAd->CommonCfg.bAPSDAC_VI, pAd->CommonCfg.bAPSDAC_VO, pAd->CommonCfg.MaxSPLength)); + } + break; + + case RT_OID_802_11_SET_APSD_PSM: + if (wrq->u.data.length != sizeof(ULONG)) + Status = -EINVAL; + else + { + // Driver needs to notify AP when PSM changes + Status = copy_from_user(&pAd->CommonCfg.bAPSDForcePowerSave, wrq->u.data.pointer, wrq->u.data.length); + if (pAd->CommonCfg.bAPSDForcePowerSave != pAd->StaCfg.Psm) + { + RTMP_SET_PSM_BIT(pAd, pAd->CommonCfg.bAPSDForcePowerSave); + RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE); + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_APSD_PSM (bAPSDForcePowerSave:%d)\n", pAd->CommonCfg.bAPSDForcePowerSave)); + } + break; +#ifdef QOS_DLS_SUPPORT + case RT_OID_802_11_SET_DLS: + if (wrq->u.data.length != sizeof(ULONG)) + Status = -EINVAL; + else + { + BOOLEAN oldvalue = pAd->CommonCfg.bDLSCapable; + Status = copy_from_user(&pAd->CommonCfg.bDLSCapable, wrq->u.data.pointer, wrq->u.data.length); + if (oldvalue && !pAd->CommonCfg.bDLSCapable) + { + int i; + // tear down local dls table entry + for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } + + // tear down peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } + } + + DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_DLS (=%d)\n", pAd->CommonCfg.bDLSCapable)); + } + break; + + case RT_OID_802_11_SET_DLS_PARAM: + if (wrq->u.data.length != sizeof(RT_802_11_DLS_UI)) + Status = -EINVAL; + else + { + RT_802_11_DLS Dls; + + NdisZeroMemory(&Dls, sizeof(RT_802_11_DLS)); + RTMPMoveMemory(&Dls, wrq->u.data.pointer, sizeof(RT_802_11_DLS_UI)); + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + RT_OID_802_11_SET_DLS_PARAM, + sizeof(RT_802_11_DLS), + &Dls, 0); + DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_DLS_PARAM \n")); + } + break; +#endif // QOS_DLS_SUPPORT // + + + case RT_OID_802_11_SET_WMM: + if (wrq->u.data.length != sizeof(BOOLEAN)) + Status = -EINVAL; + else + { + Status = copy_from_user(&pAd->CommonCfg.bWmmCapable, wrq->u.data.pointer, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_SET_WMM (=%d) \n", pAd->CommonCfg.bWmmCapable)); + } + break; + + case OID_802_11_DISASSOCIATE: + // + // Set NdisRadioStateOff to TRUE, instead of called MlmeRadioOff. + // Later on, NDIS_802_11_BSSID_LIST_EX->NumberOfItems should be 0 + // when query OID_802_11_BSSID_LIST. + // + // TRUE: NumberOfItems will set to 0. + // FALSE: NumberOfItems no change. + // + pAd->CommonCfg.NdisRadioStateOff = TRUE; + // Set to immediately send the media disconnect event + pAd->MlmeAux.CurrReqIsFromNdis = TRUE; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DISASSOCIATE \n")); + + + if (INFRA_ON(pAd)) + { + if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAd); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_DISASSOCIATE, + 0, + NULL, 0); + + StateMachineTouched = TRUE; + } + break; + +#ifdef DOT11_N_SUPPORT + case RT_OID_802_11_SET_IMME_BA_CAP: + if (wrq->u.data.length != sizeof(OID_BACAP_STRUC)) + Status = -EINVAL; + else + { + OID_BACAP_STRUC Orde ; + Status = copy_from_user(&Orde, wrq->u.data.pointer, wrq->u.data.length); + if (Orde.Policy > BA_NOTUSE) + { + Status = NDIS_STATUS_INVALID_DATA; + } + else if (Orde.Policy == BA_NOTUSE) + { + pAd->CommonCfg.BACapability.field.Policy = BA_NOTUSE; + pAd->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity; + pAd->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity; + pAd->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable; + pAd->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize; + pAd->CommonCfg.DesiredHtPhy.MimoPs= Orde.MMPSmode; + pAd->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode; + // UPdata to HT IE + pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode; + pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize; + pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity; + } + else + { + pAd->CommonCfg.BACapability.field.AutoBA = Orde.AutoBA; + pAd->CommonCfg.BACapability.field.Policy = IMMED_BA; // we only support immediate BA. + pAd->CommonCfg.BACapability.field.MpduDensity = Orde.MpduDensity; + pAd->CommonCfg.DesiredHtPhy.MpduDensity = Orde.MpduDensity; + pAd->CommonCfg.DesiredHtPhy.AmsduEnable = Orde.AmsduEnable; + pAd->CommonCfg.DesiredHtPhy.AmsduSize= Orde.AmsduSize; + pAd->CommonCfg.DesiredHtPhy.MimoPs = Orde.MMPSmode; + pAd->CommonCfg.BACapability.field.MMPSmode = Orde.MMPSmode; + + // UPdata to HT IE + pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = Orde.MMPSmode; + pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = Orde.AmsduSize; + pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = Orde.MpduDensity; + + if (pAd->CommonCfg.BACapability.field.RxBAWinLimit > MAX_RX_REORDERBUF) + pAd->CommonCfg.BACapability.field.RxBAWinLimit = MAX_RX_REORDERBUF; + + } + + pAd->CommonCfg.REGBACapability.word = pAd->CommonCfg.BACapability.word; + DBGPRINT(RT_DEBUG_TRACE, ("Set::(Orde.AutoBA = %d) (Policy=%d)(ReBAWinLimit=%d)(TxBAWinLimit=%d)(AutoMode=%d)\n",Orde.AutoBA, pAd->CommonCfg.BACapability.field.Policy, + pAd->CommonCfg.BACapability.field.RxBAWinLimit,pAd->CommonCfg.BACapability.field.TxBAWinLimit, pAd->CommonCfg.BACapability.field.AutoBA)); + DBGPRINT(RT_DEBUG_TRACE, ("Set::(MimoPs = %d)(AmsduEnable = %d) (AmsduSize=%d)(MpduDensity=%d)\n",pAd->CommonCfg.DesiredHtPhy.MimoPs, pAd->CommonCfg.DesiredHtPhy.AmsduEnable, + pAd->CommonCfg.DesiredHtPhy.AmsduSize, pAd->CommonCfg.DesiredHtPhy.MpduDensity)); + } + + break; + case RT_OID_802_11_ADD_IMME_BA: + DBGPRINT(RT_DEBUG_TRACE, (" Set :: RT_OID_802_11_ADD_IMME_BA \n")); + if (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY)) + Status = -EINVAL; + else + { + UCHAR index; + OID_ADD_BA_ENTRY BA; + MAC_TABLE_ENTRY *pEntry; + + Status = copy_from_user(&BA, wrq->u.data.pointer, wrq->u.data.length); + if (BA.TID > 15) + { + Status = NDIS_STATUS_INVALID_DATA; + break; + } + else + { + //BATableInsertEntry + //As ad-hoc mode, BA pair is not limited to only BSSID. so add via OID. + index = BA.TID; + // in ad hoc mode, when adding BA pair, we should insert this entry into MACEntry too + pEntry = MacTableLookup(pAd, BA.MACAddr); + if (!pEntry) + { + DBGPRINT(RT_DEBUG_TRACE, ("RT_OID_802_11_ADD_IMME_BA. break on no connection.----:%x:%x\n", BA.MACAddr[4], BA.MACAddr[5])); + break; + } + if (BA.IsRecipient == FALSE) + { + if (pEntry->bIAmBadAtheros == TRUE) + pAd->CommonCfg.BACapability.field.RxBAWinLimit = 0x10; + + BAOriSessionSetUp(pAd, pEntry, index, 0, 100, TRUE); + } + else + { + //BATableInsertEntry(pAd, pEntry->Aid, BA.MACAddr, 0, 0xffff, BA.TID, BA.nMSDU, BA.IsRecipient); + } + + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_802_11_ADD_IMME_BA. Rec = %d. Mac = %x:%x:%x:%x:%x:%x . \n", + BA.IsRecipient, BA.MACAddr[0], BA.MACAddr[1], BA.MACAddr[2], BA.MACAddr[2] + , BA.MACAddr[4], BA.MACAddr[5])); + } + } + break; + + case RT_OID_802_11_TEAR_IMME_BA: + DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA \n")); + if (wrq->u.data.length != sizeof(OID_ADD_BA_ENTRY)) + Status = -EINVAL; + else + { + POID_ADD_BA_ENTRY pBA; + MAC_TABLE_ENTRY *pEntry; + + pBA = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); + + if (pBA == NULL) + { + DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA kmalloc() can't allocate enough memory\n")); + Status = NDIS_STATUS_FAILURE; + } + else + { + Status = copy_from_user(pBA, wrq->u.data.pointer, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Set :: RT_OID_802_11_TEAR_IMME_BA(TID=%d, bAllTid=%d)\n", pBA->TID, pBA->bAllTid)); + + if (!pBA->bAllTid && (pBA->TID > NUM_OF_TID)) + { + Status = NDIS_STATUS_INVALID_DATA; + break; + } + + if (pBA->IsRecipient == FALSE) + { + pEntry = MacTableLookup(pAd, pBA->MACAddr); + DBGPRINT(RT_DEBUG_TRACE, (" pBA->IsRecipient == FALSE\n")); + if (pEntry) + { + DBGPRINT(RT_DEBUG_TRACE, (" pBA->pEntry\n")); + BAOriSessionTearDown(pAd, pEntry->Aid, pBA->TID, FALSE, TRUE); + } + else + DBGPRINT(RT_DEBUG_TRACE, ("Set :: Not found pEntry \n")); + } + else + { + pEntry = MacTableLookup(pAd, pBA->MACAddr); + if (pEntry) + { + BARecSessionTearDown( pAd, (UCHAR)pEntry->Aid, pBA->TID, TRUE); + } + else + DBGPRINT(RT_DEBUG_TRACE, ("Set :: Not found pEntry \n")); + } + kfree(pBA); + } + } + break; +#endif // DOT11_N_SUPPORT // + + // For WPA_SUPPLICANT to set static wep key + case OID_802_11_ADD_WEP: + pWepKey = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); + + if(pWepKey == NULL) + { + Status = -ENOMEM; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed!!\n")); + break; + } + Status = copy_from_user(pWepKey, wrq->u.data.pointer, wrq->u.data.length); + if (Status) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (length mismatch)!!\n")); + } + else + { + KeyIdx = pWepKey->KeyIndex & 0x0fffffff; + // KeyIdx must be 0 ~ 3 + if (KeyIdx > 4) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, Failed (KeyIdx must be smaller than 4)!!\n")); + } + else + { + UCHAR CipherAlg = 0; + PUCHAR Key; + + // Zero the specific shared key + NdisZeroMemory(&pAd->SharedKey[BSS0][KeyIdx], sizeof(CIPHER_KEY)); + + // set key material and key length + pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength; + NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength); + + switch(pWepKey->KeyLength) + { + case 5: + CipherAlg = CIPHER_WEP64; + break; + case 13: + CipherAlg = CIPHER_WEP128; + break; + default: + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP, only support CIPHER_WEP64(len:5) & CIPHER_WEP128(len:13)!!\n")); + Status = -EINVAL; + break; + } + pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CipherAlg; + + // Default key for tx (shared key) + if (pWepKey->KeyIndex & 0x80000000) + { +#ifdef WPA_SUPPLICANT_SUPPORT + NdisZeroMemory(&pAd->StaCfg.DesireSharedKey[KeyIdx], sizeof(CIPHER_KEY)); + + // set key material and key length + pAd->StaCfg.DesireSharedKey[KeyIdx].KeyLen = (UCHAR) pWepKey->KeyLength; + NdisMoveMemory(pAd->StaCfg.DesireSharedKey[KeyIdx].Key, &pWepKey->KeyMaterial, pWepKey->KeyLength); + pAd->StaCfg.DesireSharedKeyId = KeyIdx; + pAd->StaCfg.DesireSharedKey[KeyIdx].CipherAlg = CipherAlg; +#endif // WPA_SUPPLICANT_SUPPORT // + pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx; + } + +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) && + (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) + { + Key = pWepKey->KeyMaterial; + + // Set Group key material to Asic + AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, &pAd->SharedKey[BSS0][KeyIdx]); + + /* STA doesn't need to set WCID attribute for group key */ + STA_PORT_SECURED(pAd); + + // Indicate Connected for GUI + pAd->IndicateMediaState = NdisMediaStateConnected; + } + else if (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) +#endif // WPA_SUPPLICANT_SUPPORT + { + Key = pAd->SharedKey[BSS0][KeyIdx].Key; + + // Set key material and cipherAlg to Asic + AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, &pAd->SharedKey[BSS0][KeyIdx]); + + if (pWepKey->KeyIndex & 0x80000000) + { + /* STA doesn't need to set WCID attribute for group key */ + // Assign pairwise key info + RTMPSetWcidSecurityInfo(pAd, + BSS0, + KeyIdx, + CipherAlg, + BSSID_WCID, + SHAREDKEYTABLE); + } + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_ADD_WEP (id=0x%x, Len=%d-byte), %s\n", pWepKey->KeyIndex, pWepKey->KeyLength, (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) ? "Port Secured":"Port NOT Secured")); + } + } + kfree(pWepKey); + break; +#ifdef WPA_SUPPLICANT_SUPPORT + case OID_SET_COUNTERMEASURES: + if (wrq->u.data.length != sizeof(int)) + Status = -EINVAL; + else + { + int enabled = 0; + Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length); + if (enabled == 1) + pAd->StaCfg.bBlockAssoc = TRUE; + else + // WPA MIC error should block association attempt for 60 seconds + pAd->StaCfg.bBlockAssoc = FALSE; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_SET_COUNTERMEASURES bBlockAssoc=%s\n", pAd->StaCfg.bBlockAssoc ? "TRUE":"FALSE")); + } + break; + case RT_OID_WPA_SUPPLICANT_SUPPORT: + if (wrq->u.data.length != sizeof(UCHAR)) + Status = -EINVAL; + else + { + Status = copy_from_user(&wpa_supplicant_enable, wrq->u.data.pointer, wrq->u.data.length); + if (wpa_supplicant_enable & WPA_SUPPLICANT_ENABLE_WPS) + pAd->StaCfg.WpaSupplicantUP |= WPA_SUPPLICANT_ENABLE_WPS; + else + { + pAd->StaCfg.WpaSupplicantUP = wpa_supplicant_enable; + pAd->StaCfg.WpaSupplicantUP &= 0x7F; + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_WPA_SUPPLICANT_SUPPORT (=0x%02X)\n", pAd->StaCfg.WpaSupplicantUP)); + } + break; + case OID_802_11_DEAUTHENTICATION: + if (wrq->u.data.length != sizeof(MLME_DEAUTH_REQ_STRUCT)) + Status = -EINVAL; + else + { + MLME_DEAUTH_REQ_STRUCT *pInfo; + MLME_QUEUE_ELEM *MsgElem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); + if (MsgElem == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("%s():alloc memory failed!\n", __FUNCTION__)); + return -EINVAL; + } + + pInfo = (MLME_DEAUTH_REQ_STRUCT *) MsgElem->Msg; + Status = copy_from_user(pInfo, wrq->u.data.pointer, wrq->u.data.length); + MlmeDeauthReqAction(pAd, MsgElem); + kfree(MsgElem); + + if (INFRA_ON(pAd)) + { + LinkDown(pAd, FALSE); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + } + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DEAUTHENTICATION (Reason=%d)\n", pInfo->Reason)); + } + break; + case OID_802_11_DROP_UNENCRYPTED: + if (wrq->u.data.length != sizeof(int)) + Status = -EINVAL; + else + { + int enabled = 0; + Status = copy_from_user(&enabled, wrq->u.data.pointer, wrq->u.data.length); + if (enabled == 1) + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; + else + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + NdisAcquireSpinLock(&pAd->MacTabLock); + pAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured; + NdisReleaseSpinLock(&pAd->MacTabLock); + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_DROP_UNENCRYPTED (=%d)\n", enabled)); + } + break; + case OID_802_11_SET_IEEE8021X: + if (wrq->u.data.length != sizeof(BOOLEAN)) + Status = -EINVAL; + else + { + Status = copy_from_user(&IEEE8021xState, wrq->u.data.pointer, wrq->u.data.length); + pAd->StaCfg.IEEE8021X = IEEE8021xState; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_IEEE8021X (=%d)\n", IEEE8021xState)); + } + break; + case OID_802_11_SET_IEEE8021X_REQUIRE_KEY: + if (wrq->u.data.length != sizeof(BOOLEAN)) + Status = -EINVAL; + else + { + Status = copy_from_user(&IEEE8021x_required_keys, wrq->u.data.pointer, wrq->u.data.length); + pAd->StaCfg.IEEE8021x_required_keys = IEEE8021x_required_keys; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SET_IEEE8021X_REQUIRE_KEY (%d)\n", IEEE8021x_required_keys)); + } + break; + case OID_802_11_PMKID: + pPmkId = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); + + if(pPmkId == NULL) { + Status = -ENOMEM; + break; + } + Status = copy_from_user(pPmkId, wrq->u.data.pointer, wrq->u.data.length); + + // check the PMKID information + if (pPmkId->BSSIDInfoCount == 0) + NdisZeroMemory(pAd->StaCfg.SavedPMK, sizeof(BSSID_INFO)*PMKID_NO); + else + { + PBSSID_INFO pBssIdInfo; + UINT BssIdx; + UINT CachedIdx; + + for (BssIdx = 0; BssIdx < pPmkId->BSSIDInfoCount; BssIdx++) + { + // point to the indexed BSSID_INFO structure + pBssIdInfo = (PBSSID_INFO) ((PUCHAR) pPmkId + 2 * sizeof(UINT) + BssIdx * sizeof(BSSID_INFO)); + // Find the entry in the saved data base. + for (CachedIdx = 0; CachedIdx < pAd->StaCfg.SavedPMKNum; CachedIdx++) + { + // compare the BSSID + if (NdisEqualMemory(pBssIdInfo->BSSID, pAd->StaCfg.SavedPMK[CachedIdx].BSSID, sizeof(NDIS_802_11_MAC_ADDRESS))) + break; + } + + // Found, replace it + if (CachedIdx < PMKID_NO) + { + DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx)); + NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO)); + pAd->StaCfg.SavedPMKNum++; + } + // Not found, replace the last one + else + { + // Randomly replace one + CachedIdx = (pBssIdInfo->BSSID[5] % PMKID_NO); + DBGPRINT(RT_DEBUG_OFF, ("Update OID_802_11_PMKID, idx = %d\n", CachedIdx)); + NdisMoveMemory(&pAd->StaCfg.SavedPMK[CachedIdx], pBssIdInfo, sizeof(BSSID_INFO)); + } + } + } + if(pPmkId) + kfree(pPmkId); + break; + + case RT_OID_WPS_PROBE_REQ_IE: + if (pAd->StaCfg.pWpsProbeReqIe) + { + kfree(pAd->StaCfg.pWpsProbeReqIe); + pAd->StaCfg.pWpsProbeReqIe = NULL; + } + pAd->StaCfg.WpsProbeReqIeLen = 0; + pAd->StaCfg.pWpsProbeReqIe = kmalloc(wrq->u.data.length, MEM_ALLOC_FLAG); + if (pAd->StaCfg.pWpsProbeReqIe) + { + Status = copy_from_user(pAd->StaCfg.pWpsProbeReqIe, wrq->u.data.pointer, wrq->u.data.length); + + if (Status) + { + Status = -EINVAL; + if (pAd->StaCfg.pWpsProbeReqIe) + { + kfree(pAd->StaCfg.pWpsProbeReqIe); + pAd->StaCfg.pWpsProbeReqIe = NULL; + } + pAd->StaCfg.WpsProbeReqIeLen = 0; + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_WPS_PROBE_REQ_IE, Failed (copy_from_user failed)!!\n")); + } + else + { + pAd->StaCfg.WpsProbeReqIeLen = wrq->u.data.length; + hex_dump("WpsProbeReqIe", pAd->StaCfg.pWpsProbeReqIe, pAd->StaCfg.WpsProbeReqIeLen); + DBGPRINT(RT_DEBUG_TRACE, ("Set::RT_OID_WPS_PROBE_REQ_IE, WpsProbeReqIeLen = %d!!\n", + pAd->StaCfg.WpsProbeReqIeLen)); + } + } + else + Status = -ENOMEM; + break; +#endif // WPA_SUPPLICANT_SUPPORT // + + + +#ifdef SNMP_SUPPORT + case OID_802_11_SHORTRETRYLIMIT: + if (wrq->u.data.length != sizeof(ULONG)) + Status = -EINVAL; + else + { + Status = copy_from_user(&ShortRetryLimit, wrq->u.data.pointer, wrq->u.data.length); + RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); + tx_rty_cfg.field.ShortRtyLimit = ShortRetryLimit; + RTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word); + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_SHORTRETRYLIMIT (tx_rty_cfg.field.ShortRetryLimit=%d, ShortRetryLimit=%ld)\n", tx_rty_cfg.field.ShortRtyLimit, ShortRetryLimit)); + } + break; + + case OID_802_11_LONGRETRYLIMIT: + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_LONGRETRYLIMIT \n")); + if (wrq->u.data.length != sizeof(ULONG)) + Status = -EINVAL; + else + { + Status = copy_from_user(&LongRetryLimit, wrq->u.data.pointer, wrq->u.data.length); + RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); + tx_rty_cfg.field.LongRtyLimit = LongRetryLimit; + RTMP_IO_WRITE32(pAd, TX_RTY_CFG, tx_rty_cfg.word); + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_LONGRETRYLIMIT (tx_rty_cfg.field.LongRetryLimit= %d,LongRetryLimit=%ld)\n", tx_rty_cfg.field.LongRtyLimit, LongRetryLimit)); + } + break; + + case OID_802_11_WEPDEFAULTKEYVALUE: + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYVALUE\n")); + pKey = kmalloc(wrq->u.data.length, GFP_KERNEL); + Status = copy_from_user(pKey, wrq->u.data.pointer, wrq->u.data.length); + //pKey = &WepKey; + + if ( pKey->Length != wrq->u.data.length) + { + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYVALUE, Failed!!\n")); + } + KeyIdx = pKey->KeyIndex & 0x0fffffff; + DBGPRINT(RT_DEBUG_TRACE,("pKey->KeyIndex =%d, pKey->KeyLength=%d\n", pKey->KeyIndex, pKey->KeyLength)); + + // it is a shared key + if (KeyIdx > 4) + Status = -EINVAL; + else + { + pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen = (UCHAR) pKey->KeyLength; + NdisMoveMemory(&pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, &pKey->KeyMaterial, pKey->KeyLength); + if (pKey->KeyIndex & 0x80000000) + { + // Default key for tx (shared key) + pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx; + } + //RestartAPIsRequired = TRUE; + } + break; + + + case OID_802_11_WEPDEFAULTKEYID: + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_WEPDEFAULTKEYID \n")); + + if (wrq->u.data.length != sizeof(UCHAR)) + Status = -EINVAL; + else + Status = copy_from_user(&pAd->StaCfg.DefaultKeyId, wrq->u.data.pointer, wrq->u.data.length); + + break; + + + case OID_802_11_CURRENTCHANNEL: + DBGPRINT(RT_DEBUG_TRACE, ("Set::OID_802_11_CURRENTCHANNEL \n")); + if (wrq->u.data.length != sizeof(UCHAR)) + Status = -EINVAL; + else + { + Status = copy_from_user(&ctmp, wrq->u.data.pointer, wrq->u.data.length); + sprintf((PSTRING)&ctmp,"%d", ctmp); + Set_Channel_Proc(pAd, (PSTRING)&ctmp); + } + break; +#endif + + + +#ifdef XLINK_SUPPORT + case RT_OID_802_11_SET_PSPXLINK_MODE: + if (wrq->u.data.length != sizeof(BOOLEAN)) + Status = -EINVAL; + else + { + Status = copy_from_user(&pAd->StaCfg.PSPXlink, wrq->u.data.pointer, wrq->u.data.length); + /*if (pAd->StaCfg.PSPXlink) + RX_FILTER_SET_FLAG(pAd, fRX_FILTER_ACCEPT_PROMISCUOUS)*/ + DBGPRINT(RT_DEBUG_TRACE,("Set::RT_OID_802_11_SET_PSPXLINK_MODE(=%d) \n", pAd->StaCfg.PSPXlink)); + } + break; +#endif // XLINK_SUPPORT // + + + default: + DBGPRINT(RT_DEBUG_TRACE, ("Set::unknown IOCTL's subcmd = 0x%08x\n", cmd)); + Status = -EOPNOTSUPP; + break; + } + + + return Status; +} + +INT RTMPQueryInformation( + IN PRTMP_ADAPTER pAd, + IN OUT struct ifreq *rq, + IN INT cmd) +{ + struct iwreq *wrq = (struct iwreq *) rq; + NDIS_802_11_BSSID_LIST_EX *pBssidList = NULL; + PNDIS_WLAN_BSSID_EX pBss; + NDIS_802_11_SSID Ssid; + NDIS_802_11_CONFIGURATION *pConfiguration = NULL; + RT_802_11_LINK_STATUS *pLinkStatus = NULL; + RT_802_11_STA_CONFIG *pStaConfig = NULL; + NDIS_802_11_STATISTICS *pStatistics = NULL; + NDIS_802_11_RTS_THRESHOLD RtsThresh; + NDIS_802_11_FRAGMENTATION_THRESHOLD FragThresh; + NDIS_802_11_POWER_MODE PowerMode; + NDIS_802_11_NETWORK_INFRASTRUCTURE BssType; + RT_802_11_PREAMBLE PreamType; + NDIS_802_11_AUTHENTICATION_MODE AuthMode; + NDIS_802_11_WEP_STATUS WepStatus; + NDIS_MEDIA_STATE MediaState; + ULONG BssBufSize, ulInfo=0, NetworkTypeList[4], apsd = 0, RateValue=0; + USHORT BssLen = 0; + PUCHAR pBuf = NULL, pPtr; + INT Status = NDIS_STATUS_SUCCESS; + UINT we_version_compiled; + UCHAR i, Padding = 0; + BOOLEAN RadioState; + STRING driverVersion[8]; + OID_SET_HT_PHYMODE *pHTPhyMode = NULL; + HTTRANSMIT_SETTING HTPhyMode; + + +#ifdef SNMP_SUPPORT + //for snmp, kathy + DefaultKeyIdxValue *pKeyIdxValue; + INT valueLen; + TX_RTY_CFG_STRUC tx_rty_cfg; + ULONG ShortRetryLimit, LongRetryLimit; + UCHAR tmp[64]; +#endif //SNMP + + + switch(cmd) + { + case RT_OID_DEVICE_NAME: + wrq->u.data.length = sizeof(pAd->nickname); + Status = copy_to_user(wrq->u.data.pointer, pAd->nickname, wrq->u.data.length); + break; + case RT_OID_VERSION_INFO: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_VERSION_INFO \n")); + wrq->u.data.length = 8*sizeof(CHAR); + sprintf(&driverVersion[0], "%s", STA_DRIVER_VERSION); + driverVersion[7] = '\0'; + if (copy_to_user(wrq->u.data.pointer, &driverVersion[0], wrq->u.data.length)) + { + Status = -EFAULT; + } + break; + + case OID_802_11_BSSID_LIST: + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) + { + /* + * Still scanning, indicate the caller should try again. + */ + pAd->StaCfg.bScanReqIsFromWebUI = TRUE; + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (Still scanning)\n")); + return -EAGAIN; + } +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAd->StaCfg.WpaSupplicantUP & 0x7F) == WPA_SUPPLICANT_ENABLE) + { + pAd->StaCfg.WpaSupplicantScanCount = 0; + } +#endif // WPA_SUPPLICANT_SUPPORT // + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID_LIST (%d BSS returned)\n",pAd->ScanTab.BssNr)); + pAd->StaCfg.bScanReqIsFromWebUI = FALSE; + // Claculate total buffer size required + BssBufSize = sizeof(ULONG); + + for (i = 0; i < pAd->ScanTab.BssNr; i++) + { + // Align pointer to 4 bytes boundary. + //Padding = 4 - (pAdapter->ScanTab.BssEntry[i].VarIELen & 0x0003); + //if (Padding == 4) + // Padding = 0; + BssBufSize += (sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding); + } + + // For safety issue, we add 256 bytes just in case + BssBufSize += 256; + // Allocate the same size as passed from higher layer + pBuf = kmalloc(BssBufSize, MEM_ALLOC_FLAG); + if(pBuf == NULL) + { + Status = -ENOMEM; + break; + } + // Init 802_11_BSSID_LIST_EX structure + NdisZeroMemory(pBuf, BssBufSize); + pBssidList = (PNDIS_802_11_BSSID_LIST_EX) pBuf; + pBssidList->NumberOfItems = pAd->ScanTab.BssNr; + + // Calculate total buffer length + BssLen = 4; // Consist of NumberOfItems + // Point to start of NDIS_WLAN_BSSID_EX + // pPtr = pBuf + sizeof(ULONG); + pPtr = (PUCHAR) &pBssidList->Bssid[0]; + for (i = 0; i < pAd->ScanTab.BssNr; i++) + { + pBss = (PNDIS_WLAN_BSSID_EX) pPtr; + NdisMoveMemory(&pBss->MacAddress, &pAd->ScanTab.BssEntry[i].Bssid, MAC_ADDR_LEN); + if ((pAd->ScanTab.BssEntry[i].Hidden == 1) && (pAd->StaCfg.bShowHiddenSSID == FALSE)) + { + // + // We must return this SSID during 4way handshaking, otherwise Aegis will failed to parse WPA infomation + // and then failed to send EAPOl farame. + // + if ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) && (pAd->StaCfg.PortSecured != WPA_802_1X_PORT_SECURED)) + { + pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen; + NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen); + } + else + pBss->Ssid.SsidLength = 0; + } + else + { + pBss->Ssid.SsidLength = pAd->ScanTab.BssEntry[i].SsidLen; + NdisMoveMemory(pBss->Ssid.Ssid, pAd->ScanTab.BssEntry[i].Ssid, pAd->ScanTab.BssEntry[i].SsidLen); + } + pBss->Privacy = pAd->ScanTab.BssEntry[i].Privacy; + pBss->Rssi = pAd->ScanTab.BssEntry[i].Rssi - pAd->BbpRssiToDbmDelta; + pBss->NetworkTypeInUse = NetworkTypeInUseSanity(&pAd->ScanTab.BssEntry[i]); + pBss->Configuration.Length = sizeof(NDIS_802_11_CONFIGURATION); + pBss->Configuration.BeaconPeriod = pAd->ScanTab.BssEntry[i].BeaconPeriod; + pBss->Configuration.ATIMWindow = pAd->ScanTab.BssEntry[i].AtimWin; + //NdisMoveMemory(&pBss->QBssLoad, &pAd->ScanTab.BssEntry[i].QbssLoad, sizeof(QBSS_LOAD_UI)); + + MAP_CHANNEL_ID_TO_KHZ(pAd->ScanTab.BssEntry[i].Channel, pBss->Configuration.DSConfig); + + if (pAd->ScanTab.BssEntry[i].BssType == BSS_INFRA) + pBss->InfrastructureMode = Ndis802_11Infrastructure; + else + pBss->InfrastructureMode = Ndis802_11IBSS; + + NdisMoveMemory(pBss->SupportedRates, pAd->ScanTab.BssEntry[i].SupRate, pAd->ScanTab.BssEntry[i].SupRateLen); + NdisMoveMemory(pBss->SupportedRates + pAd->ScanTab.BssEntry[i].SupRateLen, + pAd->ScanTab.BssEntry[i].ExtRate, + pAd->ScanTab.BssEntry[i].ExtRateLen); + + if (pAd->ScanTab.BssEntry[i].VarIELen == 0) + { + pBss->IELength = sizeof(NDIS_802_11_FIXED_IEs); + NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs)); + pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs); + } + else + { + pBss->IELength = (ULONG)(sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen); + pPtr = pPtr + sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs); + NdisMoveMemory(pBss->IEs, &pAd->ScanTab.BssEntry[i].FixIEs, sizeof(NDIS_802_11_FIXED_IEs)); + NdisMoveMemory(pBss->IEs + sizeof(NDIS_802_11_FIXED_IEs), pAd->ScanTab.BssEntry[i].VarIEs, pAd->ScanTab.BssEntry[i].VarIELen); + pPtr += pAd->ScanTab.BssEntry[i].VarIELen; + } + pBss->Length = (ULONG)(sizeof(NDIS_WLAN_BSSID_EX) - 1 + sizeof(NDIS_802_11_FIXED_IEs) + pAd->ScanTab.BssEntry[i].VarIELen + Padding); + +#if WIRELESS_EXT < 17 + if ((BssLen + pBss->Length) < wrq->u.data.length) + BssLen += pBss->Length; + else + { + pBssidList->NumberOfItems = i; + break; + } +#else + BssLen += pBss->Length; +#endif + } + +#if WIRELESS_EXT < 17 + wrq->u.data.length = BssLen; +#else + if (BssLen > wrq->u.data.length) + { + kfree(pBssidList); + return -E2BIG; + } + else + wrq->u.data.length = BssLen; +#endif + Status = copy_to_user(wrq->u.data.pointer, pBssidList, BssLen); + kfree(pBssidList); + break; + case OID_802_3_CURRENT_ADDRESS: + wrq->u.data.length = MAC_ADDR_LEN; + Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length); + break; + case OID_GEN_MEDIA_CONNECT_STATUS: + if (pAd->IndicateMediaState == NdisMediaStateConnected) + MediaState = NdisMediaStateConnected; + else + MediaState = NdisMediaStateDisconnected; + + wrq->u.data.length = sizeof(NDIS_MEDIA_STATE); + Status = copy_to_user(wrq->u.data.pointer, &MediaState, wrq->u.data.length); + break; + case OID_802_11_BSSID: + if (INFRA_ON(pAd) || ADHOC_ON(pAd)) + { + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Bssid, sizeof(NDIS_802_11_MAC_ADDRESS)); + + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BSSID(=EMPTY)\n")); + Status = -ENOTCONN; + } + break; + case OID_802_11_SSID: + NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); + NdisZeroMemory(Ssid.Ssid, MAX_LEN_OF_SSID); + Ssid.SsidLength = pAd->CommonCfg.SsidLen; + memcpy(Ssid.Ssid, pAd->CommonCfg.Ssid, Ssid.SsidLength); + wrq->u.data.length = sizeof(NDIS_802_11_SSID); + Status = copy_to_user(wrq->u.data.pointer, &Ssid, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SSID (Len=%d, ssid=%s)\n", Ssid.SsidLength,Ssid.Ssid)); + break; + case RT_OID_802_11_QUERY_LINK_STATUS: + pLinkStatus = (RT_802_11_LINK_STATUS *) kmalloc(sizeof(RT_802_11_LINK_STATUS), MEM_ALLOC_FLAG); + if (pLinkStatus) + { + pLinkStatus->CurrTxRate = RateIdTo500Kbps[pAd->CommonCfg.TxRate]; // unit : 500 kbps + pLinkStatus->ChannelQuality = pAd->Mlme.ChannelQuality; + pLinkStatus->RxByteCount = pAd->RalinkCounters.ReceivedByteCount; + pLinkStatus->TxByteCount = pAd->RalinkCounters.TransmittedByteCount; + pLinkStatus->CentralChannel = pAd->CommonCfg.CentralChannel; + wrq->u.data.length = sizeof(RT_802_11_LINK_STATUS); + Status = copy_to_user(wrq->u.data.pointer, pLinkStatus, wrq->u.data.length); + kfree(pLinkStatus); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS\n")); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LINK_STATUS(kmalloc failed)\n")); + Status = -EFAULT; + } + break; + case OID_802_11_CONFIGURATION: + pConfiguration = (NDIS_802_11_CONFIGURATION *) kmalloc(sizeof(NDIS_802_11_CONFIGURATION), MEM_ALLOC_FLAG); + if (pConfiguration) + { + pConfiguration->Length = sizeof(NDIS_802_11_CONFIGURATION); + pConfiguration->BeaconPeriod = pAd->CommonCfg.BeaconPeriod; + pConfiguration->ATIMWindow = pAd->StaActive.AtimWin; + MAP_CHANNEL_ID_TO_KHZ(pAd->CommonCfg.Channel, pConfiguration->DSConfig); + wrq->u.data.length = sizeof(NDIS_802_11_CONFIGURATION); + Status = copy_to_user(wrq->u.data.pointer, pConfiguration, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(BeaconPeriod=%ld,AtimW=%ld,Channel=%d) \n", + pConfiguration->BeaconPeriod, pConfiguration->ATIMWindow, pAd->CommonCfg.Channel)); + kfree(pConfiguration); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CONFIGURATION(kmalloc failed)\n")); + Status = -EFAULT; + } + break; + case RT_OID_802_11_SNR_0: + if ((pAd->StaCfg.LastSNR0 > 0)) + { + ulInfo = ((0xeb - pAd->StaCfg.LastSNR0) * 3) / 16 ; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_SNR_0(0x=%lx)\n", ulInfo)); + } + else + Status = -EFAULT; + break; + case RT_OID_802_11_SNR_1: + if ((pAd->Antenna.field.RxPath > 1) && + (pAd->StaCfg.LastSNR1 > 0)) + { + ulInfo = ((0xeb - pAd->StaCfg.LastSNR1) * 3) / 16 ; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(0x=%lx)\n",ulInfo)); + } + else + Status = -EFAULT; + DBGPRINT(RT_DEBUG_TRACE,("Query::RT_OID_802_11_SNR_1(pAd->StaCfg.LastSNR1=%d)\n",pAd->StaCfg.LastSNR1)); + break; + case OID_802_11_RSSI_TRIGGER: + ulInfo = pAd->StaCfg.RssiSample.LastRssi0 - pAd->BbpRssiToDbmDelta; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RSSI_TRIGGER(=%ld)\n", ulInfo)); + break; + case OID_802_11_RSSI: + case RT_OID_802_11_RSSI: + ulInfo = pAd->StaCfg.RssiSample.LastRssi0; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + break; + case RT_OID_802_11_RSSI_1: + ulInfo = pAd->StaCfg.RssiSample.LastRssi1; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + break; + case RT_OID_802_11_RSSI_2: + ulInfo = pAd->StaCfg.RssiSample.LastRssi2; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + break; + case OID_802_11_STATISTICS: + pStatistics = (NDIS_802_11_STATISTICS *) kmalloc(sizeof(NDIS_802_11_STATISTICS), MEM_ALLOC_FLAG); + if (pStatistics) + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS \n")); + // add the most up-to-date h/w raw counters into software counters + NICUpdateRawCounters(pAd); + + // Sanity check for calculation of sucessful count + if (pAd->WlanCounters.TransmittedFragmentCount.QuadPart < pAd->WlanCounters.RetryCount.QuadPart) + pAd->WlanCounters.TransmittedFragmentCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart; + + pStatistics->TransmittedFragmentCount.QuadPart = pAd->WlanCounters.TransmittedFragmentCount.QuadPart; + pStatistics->MulticastTransmittedFrameCount.QuadPart = pAd->WlanCounters.MulticastTransmittedFrameCount.QuadPart; + pStatistics->FailedCount.QuadPart = pAd->WlanCounters.FailedCount.QuadPart; + pStatistics->RetryCount.QuadPart = pAd->WlanCounters.RetryCount.QuadPart; + pStatistics->MultipleRetryCount.QuadPart = pAd->WlanCounters.MultipleRetryCount.QuadPart; + pStatistics->RTSSuccessCount.QuadPart = pAd->WlanCounters.RTSSuccessCount.QuadPart; + pStatistics->RTSFailureCount.QuadPart = pAd->WlanCounters.RTSFailureCount.QuadPart; + pStatistics->ACKFailureCount.QuadPart = pAd->WlanCounters.ACKFailureCount.QuadPart; + pStatistics->FrameDuplicateCount.QuadPart = pAd->WlanCounters.FrameDuplicateCount.QuadPart; + pStatistics->ReceivedFragmentCount.QuadPart = pAd->WlanCounters.ReceivedFragmentCount.QuadPart; + pStatistics->MulticastReceivedFrameCount.QuadPart = pAd->WlanCounters.MulticastReceivedFrameCount.QuadPart; +#ifdef DBG + pStatistics->FCSErrorCount = pAd->RalinkCounters.RealFcsErrCount; +#else + pStatistics->FCSErrorCount.QuadPart = pAd->WlanCounters.FCSErrorCount.QuadPart; + pStatistics->FrameDuplicateCount.u.LowPart = pAd->WlanCounters.FrameDuplicateCount.u.LowPart / 100; +#endif + wrq->u.data.length = sizeof(NDIS_802_11_STATISTICS); + Status = copy_to_user(wrq->u.data.pointer, pStatistics, wrq->u.data.length); + kfree(pStatistics); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_STATISTICS(kmalloc failed)\n")); + Status = -EFAULT; + } + break; + case OID_GEN_RCV_OK: + ulInfo = pAd->Counters8023.GoodReceives; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + break; + case OID_GEN_RCV_NO_BUFFER: + ulInfo = pAd->Counters8023.RxNoBuffer; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + break; + case RT_OID_802_11_PHY_MODE: + ulInfo = (ULONG)pAd->CommonCfg.PhyMode; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PHY_MODE (=%ld)\n", ulInfo)); + break; + case RT_OID_802_11_STA_CONFIG: + pStaConfig = (RT_802_11_STA_CONFIG *) kmalloc(sizeof(RT_802_11_STA_CONFIG), MEM_ALLOC_FLAG); + if (pStaConfig) + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG\n")); + pStaConfig->EnableTxBurst = pAd->CommonCfg.bEnableTxBurst; + pStaConfig->EnableTurboRate = 0; + pStaConfig->UseBGProtection = pAd->CommonCfg.UseBGProtection; + pStaConfig->UseShortSlotTime = pAd->CommonCfg.bUseShortSlotTime; + //pStaConfig->AdhocMode = pAd->StaCfg.AdhocMode; + pStaConfig->HwRadioStatus = (pAd->StaCfg.bHwRadio == TRUE) ? 1 : 0; + pStaConfig->Rsv1 = 0; + pStaConfig->SystemErrorBitmap = pAd->SystemErrorBitmap; + wrq->u.data.length = sizeof(RT_802_11_STA_CONFIG); + Status = copy_to_user(wrq->u.data.pointer, pStaConfig, wrq->u.data.length); + kfree(pStaConfig); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n")); + Status = -EFAULT; + } + break; + case OID_802_11_RTS_THRESHOLD: + RtsThresh = pAd->CommonCfg.RtsThreshold; + wrq->u.data.length = sizeof(RtsThresh); + Status = copy_to_user(wrq->u.data.pointer, &RtsThresh, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_RTS_THRESHOLD(=%ld)\n", RtsThresh)); + break; + case OID_802_11_FRAGMENTATION_THRESHOLD: + FragThresh = pAd->CommonCfg.FragmentThreshold; + if (pAd->CommonCfg.bUseZeroToDisableFragment == TRUE) + FragThresh = 0; + wrq->u.data.length = sizeof(FragThresh); + Status = copy_to_user(wrq->u.data.pointer, &FragThresh, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_FRAGMENTATION_THRESHOLD(=%ld)\n", FragThresh)); + break; + case OID_802_11_POWER_MODE: + PowerMode = pAd->StaCfg.WindowsPowerMode; + wrq->u.data.length = sizeof(PowerMode); + Status = copy_to_user(wrq->u.data.pointer, &PowerMode, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_POWER_MODE(=%d)\n", PowerMode)); + break; + case RT_OID_802_11_RADIO: + RadioState = (BOOLEAN) pAd->StaCfg.bSwRadio; + wrq->u.data.length = sizeof(RadioState); + Status = copy_to_user(wrq->u.data.pointer, &RadioState, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_RADIO (=%d)\n", RadioState)); + break; + case OID_802_11_INFRASTRUCTURE_MODE: + if (pAd->StaCfg.BssType == BSS_ADHOC) + BssType = Ndis802_11IBSS; + else if (pAd->StaCfg.BssType == BSS_INFRA) + BssType = Ndis802_11Infrastructure; + else if (pAd->StaCfg.BssType == BSS_MONITOR) + BssType = Ndis802_11Monitor; + else + BssType = Ndis802_11AutoUnknown; + + wrq->u.data.length = sizeof(BssType); + Status = copy_to_user(wrq->u.data.pointer, &BssType, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_INFRASTRUCTURE_MODE(=%d)\n", BssType)); + break; + case RT_OID_802_11_PREAMBLE: + PreamType = pAd->CommonCfg.TxPreamble; + wrq->u.data.length = sizeof(PreamType); + Status = copy_to_user(wrq->u.data.pointer, &PreamType, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PREAMBLE(=%d)\n", PreamType)); + break; + case OID_802_11_AUTHENTICATION_MODE: + AuthMode = pAd->StaCfg.AuthMode; + wrq->u.data.length = sizeof(AuthMode); + Status = copy_to_user(wrq->u.data.pointer, &AuthMode, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_AUTHENTICATION_MODE(=%d)\n", AuthMode)); + break; + case OID_802_11_WEP_STATUS: + WepStatus = pAd->StaCfg.WepStatus; + wrq->u.data.length = sizeof(WepStatus); + Status = copy_to_user(wrq->u.data.pointer, &WepStatus, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEP_STATUS(=%d)\n", WepStatus)); + break; + case OID_802_11_TX_POWER_LEVEL: + wrq->u.data.length = sizeof(ULONG); + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.TxPower, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_TX_POWER_LEVEL %x\n",pAd->CommonCfg.TxPower)); + break; + case RT_OID_802_11_TX_POWER_LEVEL_1: + wrq->u.data.length = sizeof(ULONG); + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.TxPowerPercentage, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_TX_POWER_LEVEL_1 (=%ld)\n", pAd->CommonCfg.TxPowerPercentage)); + break; + case OID_802_11_NETWORK_TYPES_SUPPORTED: + if ((pAd->RfIcType == RFIC_2850) || (pAd->RfIcType == RFIC_2750) || (pAd->RfIcType == RFIC_3052)) + { + NetworkTypeList[0] = 3; // NumberOfItems = 3 + NetworkTypeList[1] = Ndis802_11DS; // NetworkType[1] = 11b + NetworkTypeList[2] = Ndis802_11OFDM24; // NetworkType[2] = 11g + NetworkTypeList[3] = Ndis802_11OFDM5; // NetworkType[3] = 11a + wrq->u.data.length = 16; + Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length); + } + else + { + NetworkTypeList[0] = 2; // NumberOfItems = 2 + NetworkTypeList[1] = Ndis802_11DS; // NetworkType[1] = 11b + NetworkTypeList[2] = Ndis802_11OFDM24; // NetworkType[2] = 11g + wrq->u.data.length = 12; + Status = copy_to_user(wrq->u.data.pointer, &NetworkTypeList[0], wrq->u.data.length); + } + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_NETWORK_TYPES_SUPPORTED\n")); + break; + case OID_802_11_NETWORK_TYPE_IN_USE: + wrq->u.data.length = sizeof(ULONG); + if (pAd->CommonCfg.PhyMode == PHY_11A) + ulInfo = Ndis802_11OFDM5; + else if ((pAd->CommonCfg.PhyMode == PHY_11BG_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11G)) + ulInfo = Ndis802_11OFDM24; + else + ulInfo = Ndis802_11DS; + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + break; + case RT_OID_802_11_QUERY_LAST_RX_RATE: + ulInfo = (ULONG)pAd->LastRxRate; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_RX_RATE (=%ld)\n", ulInfo)); + break; + case RT_OID_802_11_QUERY_LAST_TX_RATE: + ulInfo = (ULONG)pAd->LastTxRate; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_TX_RATE (=%lx)\n", ulInfo)); + break; + case RT_OID_802_11_QUERY_MAP_REAL_RX_RATE: + RateValue=0; + HTPhyMode.word = (USHORT)pAd->LastRxRate; + getRate(HTPhyMode, &RateValue); + wrq->u.data.length = sizeof(RateValue); + Status = copy_to_user(wrq->u.data.pointer, &RateValue, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_RX_RATE (=%ld)\n", RateValue)); + break; + case RT_OID_802_11_QUERY_MAP_REAL_TX_RATE: + RateValue=0; + HTPhyMode.word = (USHORT)pAd->LastTxRate; + getRate(HTPhyMode, &RateValue); + wrq->u.data.length = sizeof(RateValue); + Status = copy_to_user(wrq->u.data.pointer, &RateValue, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_LAST_TX_RATE (=%ld)\n", RateValue)); + break; + case RT_OID_802_11_QUERY_TX_PHYMODE: + ulInfo = (ULONG)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word; + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_TX_PHYMODE (=%lx)\n", ulInfo)); + break; + case RT_OID_802_11_QUERY_EEPROM_VERSION: + wrq->u.data.length = sizeof(ULONG); + Status = copy_to_user(wrq->u.data.pointer, &pAd->EepromVersion, wrq->u.data.length); + break; + case RT_OID_802_11_QUERY_FIRMWARE_VERSION: + wrq->u.data.length = sizeof(ULONG); + Status = copy_to_user(wrq->u.data.pointer, &pAd->FirmwareVersion, wrq->u.data.length); + break; + case RT_OID_802_11_QUERY_NOISE_LEVEL: + wrq->u.data.length = sizeof(UCHAR); + Status = copy_to_user(wrq->u.data.pointer, &pAd->BbpWriteLatch[17], wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_NOISE_LEVEL (=%d)\n", pAd->BbpWriteLatch[17])); + break; + case RT_OID_802_11_EXTRA_INFO: + wrq->u.data.length = sizeof(ULONG); + Status = copy_to_user(wrq->u.data.pointer, &pAd->ExtraInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_EXTRA_INFO (=%ld)\n", pAd->ExtraInfo)); + break; + case RT_OID_WE_VERSION_COMPILED: + wrq->u.data.length = sizeof(UINT); + we_version_compiled = WIRELESS_EXT; + Status = copy_to_user(wrq->u.data.pointer, &we_version_compiled, wrq->u.data.length); + break; + case RT_OID_802_11_QUERY_APSD_SETTING: + apsd = (pAd->CommonCfg.bAPSDCapable | (pAd->CommonCfg.bAPSDAC_BE << 1) | (pAd->CommonCfg.bAPSDAC_BK << 2) + | (pAd->CommonCfg.bAPSDAC_VI << 3) | (pAd->CommonCfg.bAPSDAC_VO << 4) | (pAd->CommonCfg.MaxSPLength << 5)); + + wrq->u.data.length = sizeof(ULONG); + Status = copy_to_user(wrq->u.data.pointer, &apsd, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_SETTING (=0x%lx,APSDCap=%d,AC_BE=%d,AC_BK=%d,AC_VI=%d,AC_VO=%d,MAXSPLen=%d)\n", + apsd,pAd->CommonCfg.bAPSDCapable,pAd->CommonCfg.bAPSDAC_BE,pAd->CommonCfg.bAPSDAC_BK,pAd->CommonCfg.bAPSDAC_VI,pAd->CommonCfg.bAPSDAC_VO,pAd->CommonCfg.MaxSPLength)); + break; + case RT_OID_802_11_QUERY_APSD_PSM: + wrq->u.data.length = sizeof(ULONG); + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bAPSDForcePowerSave, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_APSD_PSM (=%d)\n", pAd->CommonCfg.bAPSDForcePowerSave)); + break; + case RT_OID_802_11_QUERY_WMM: + wrq->u.data.length = sizeof(BOOLEAN); + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bWmmCapable, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_WMM (=%d)\n", pAd->CommonCfg.bWmmCapable)); + break; + + +#ifdef WPA_SUPPLICANT_SUPPORT + case RT_OID_NEW_DRIVER: + { + UCHAR enabled = 1; + wrq->u.data.length = sizeof(UCHAR); + Status = copy_to_user(wrq->u.data.pointer, &enabled, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_NEW_DRIVER (=%d)\n", enabled)); + } + break; + case RT_OID_WPA_SUPPLICANT_SUPPORT: + wrq->u.data.length = sizeof(UCHAR); + Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.WpaSupplicantUP, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_WPA_SUPPLICANT_SUPPORT (=%d)\n", pAd->StaCfg.WpaSupplicantUP)); + break; +#endif // WPA_SUPPLICANT_SUPPORT // + + case RT_OID_DRIVER_DEVICE_NAME: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_DRIVER_DEVICE_NAME \n")); + wrq->u.data.length = 16; + if (copy_to_user(wrq->u.data.pointer, pAd->StaCfg.dev_name, wrq->u.data.length)) + { + Status = -EFAULT; + } + break; + case RT_OID_802_11_QUERY_HT_PHYMODE: + pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG); + if (pHTPhyMode) + { + pHTPhyMode->PhyMode = pAd->CommonCfg.PhyMode; + pHTPhyMode->HtMode = (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MODE; + pHTPhyMode->BW = (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW; + pHTPhyMode->MCS= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.MCS; + pHTPhyMode->SHORTGI= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.ShortGI; + pHTPhyMode->STBC= (UCHAR)pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.STBC; + + pHTPhyMode->ExtOffset = ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) ? (EXTCHA_BELOW) : (EXTCHA_ABOVE)); + wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE); + if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length)) + { + Status = -EFAULT; + } + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n", + pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset)); + DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word)); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n")); + Status = -EFAULT; + } + break; + case RT_OID_802_11_COUNTRY_REGION: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_COUNTRY_REGION \n")); + wrq->u.data.length = sizeof(ulInfo); + ulInfo = pAd->CommonCfg.CountryRegionForABand; + ulInfo = (ulInfo << 8)|(pAd->CommonCfg.CountryRegion); + if (copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length)) + { + Status = -EFAULT; + } + break; + case RT_OID_802_11_QUERY_DAT_HT_PHYMODE: + pHTPhyMode = (OID_SET_HT_PHYMODE *) kmalloc(sizeof(OID_SET_HT_PHYMODE), MEM_ALLOC_FLAG); + if (pHTPhyMode) + { + pHTPhyMode->PhyMode = pAd->CommonCfg.PhyMode; + pHTPhyMode->HtMode = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.HTMODE; + pHTPhyMode->BW = (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.BW; + pHTPhyMode->MCS= (UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.MCS; + pHTPhyMode->SHORTGI= (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.ShortGI; + pHTPhyMode->STBC= (UCHAR)pAd->CommonCfg.RegTransmitSetting.field.STBC; + + wrq->u.data.length = sizeof(OID_SET_HT_PHYMODE); + if (copy_to_user(wrq->u.data.pointer, pHTPhyMode, wrq->u.data.length)) + { + Status = -EFAULT; + } + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_HT_PHYMODE (PhyMode = %d, MCS =%d, BW = %d, STBC = %d, ExtOffset=%d)\n", + pHTPhyMode->HtMode, pHTPhyMode->MCS, pHTPhyMode->BW, pHTPhyMode->STBC, pHTPhyMode->ExtOffset)); + DBGPRINT(RT_DEBUG_TRACE, (" MlmeUpdateTxRates (.word = %x )\n", pAd->MacTab.Content[BSSID_WCID].HTPhyMode.word)); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_STA_CONFIG(kmalloc failed)\n")); + Status = -EFAULT; + } + break; + case RT_OID_QUERY_MULTIPLE_CARD_SUPPORT: + wrq->u.data.length = sizeof(UCHAR); + i = 0; +#ifdef MULTIPLE_CARD_SUPPORT + i = 1; +#endif // MULTIPLE_CARD_SUPPORT // + if (copy_to_user(wrq->u.data.pointer, &i, wrq->u.data.length)) + { + Status = -EFAULT; + } + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_QUERY_MULTIPLE_CARD_SUPPORT(=%d) \n", i)); + break; +#ifdef SNMP_SUPPORT + case RT_OID_802_11_MAC_ADDRESS: + wrq->u.data.length = MAC_ADDR_LEN; + Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length); + break; + + case RT_OID_802_11_MANUFACTUREROUI: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREROUI \n")); + wrq->u.data.length = ManufacturerOUI_LEN; + Status = copy_to_user(wrq->u.data.pointer, &pAd->CurrentAddress, wrq->u.data.length); + break; + + case RT_OID_802_11_MANUFACTURERNAME: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTURERNAME \n")); + wrq->u.data.length = strlen(ManufacturerNAME); + Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length); + break; + + case RT_OID_802_11_RESOURCETYPEIDNAME: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_RESOURCETYPEIDNAME \n")); + wrq->u.data.length = strlen(ResourceTypeIdName); + Status = copy_to_user(wrq->u.data.pointer, ResourceTypeIdName, wrq->u.data.length); + break; + + case RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRIVACYOPTIONIMPLEMENTED \n")); + ulInfo = 1; // 1 is support wep else 2 is not support. + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + break; + + case RT_OID_802_11_POWERMANAGEMENTMODE: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_POWERMANAGEMENTMODE \n")); + if (pAd->StaCfg.Psm == PSMP_ACTION) + ulInfo = 1; // 1 is power active else 2 is power save. + else + ulInfo = 2; + + wrq->u.data.length = sizeof(ulInfo); + Status = copy_to_user(wrq->u.data.pointer, &ulInfo, wrq->u.data.length); + break; + + case OID_802_11_WEPDEFAULTKEYVALUE: + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_WEPDEFAULTKEYVALUE \n")); + //KeyIdxValue.KeyIdx = pAd->PortCfg.MBSSID[pAd->IoctlIF].DefaultKeyId; + pKeyIdxValue = wrq->u.data.pointer; + DBGPRINT(RT_DEBUG_TRACE,("KeyIdxValue.KeyIdx = %d, \n",pKeyIdxValue->KeyIdx)); + valueLen = pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen; + NdisMoveMemory(pKeyIdxValue->Value, + &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, + valueLen); + pKeyIdxValue->Value[valueLen]='\0'; + + wrq->u.data.length = sizeof(DefaultKeyIdxValue); + + Status = copy_to_user(wrq->u.data.pointer, pKeyIdxValue, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE,("DefaultKeyId = %d, total len = %d, str len=%d, KeyValue= %02x %02x %02x %02x \n", + pAd->StaCfg.DefaultKeyId, + wrq->u.data.length, + pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen, + pAd->SharedKey[BSS0][0].Key[0], + pAd->SharedKey[BSS0][1].Key[0], + pAd->SharedKey[BSS0][2].Key[0], + pAd->SharedKey[BSS0][3].Key[0])); + break; + + case OID_802_11_WEPDEFAULTKEYID: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPDEFAULTKEYID \n")); + wrq->u.data.length = sizeof(UCHAR); + Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.DefaultKeyId, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("DefaultKeyId =%d \n", pAd->StaCfg.DefaultKeyId)); + break; + + case RT_OID_802_11_WEPKEYMAPPINGLENGTH: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_WEPKEYMAPPINGLENGTH \n")); + wrq->u.data.length = sizeof(UCHAR); + Status = copy_to_user(wrq->u.data.pointer, + &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen, + wrq->u.data.length); + break; + + case OID_802_11_SHORTRETRYLIMIT: + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SHORTRETRYLIMIT \n")); + wrq->u.data.length = sizeof(ULONG); + RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); + ShortRetryLimit = tx_rty_cfg.field.ShortRtyLimit; + DBGPRINT(RT_DEBUG_TRACE, ("ShortRetryLimit =%ld, tx_rty_cfg.field.ShortRetryLimit=%d\n", ShortRetryLimit, tx_rty_cfg.field.ShortRtyLimit)); + Status = copy_to_user(wrq->u.data.pointer, &ShortRetryLimit, wrq->u.data.length); + break; + + case OID_802_11_LONGRETRYLIMIT: + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_LONGRETRYLIMIT \n")); + wrq->u.data.length = sizeof(ULONG); + RTMP_IO_READ32(pAd, TX_RTY_CFG, &tx_rty_cfg.word); + LongRetryLimit = tx_rty_cfg.field.LongRtyLimit; + DBGPRINT(RT_DEBUG_TRACE, ("LongRetryLimit =%ld, tx_rty_cfg.field.LongRtyLimit=%d\n", LongRetryLimit, tx_rty_cfg.field.LongRtyLimit)); + Status = copy_to_user(wrq->u.data.pointer, &LongRetryLimit, wrq->u.data.length); + break; + + case RT_OID_802_11_PRODUCTID: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_PRODUCTID \n")); + +#ifdef RTMP_MAC_PCI + { + + USHORT device_id; + if (((POS_COOKIE)pAd->OS_Cookie)->pci_dev != NULL) + pci_read_config_word(((POS_COOKIE)pAd->OS_Cookie)->pci_dev, PCI_DEVICE_ID, &device_id); + else + DBGPRINT(RT_DEBUG_TRACE, (" pci_dev = NULL\n")); + sprintf((PSTRING)tmp, "%04x %04x\n", NIC_PCI_VENDOR_ID, device_id); + } +#endif // RTMP_MAC_PCI // + wrq->u.data.length = strlen((PSTRING)tmp); + Status = copy_to_user(wrq->u.data.pointer, tmp, wrq->u.data.length); + break; + + case RT_OID_802_11_MANUFACTUREID: + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_MANUFACTUREID \n")); + wrq->u.data.length = strlen(ManufacturerNAME); + Status = copy_to_user(wrq->u.data.pointer, ManufacturerNAME, wrq->u.data.length); + break; + + case OID_802_11_CURRENTCHANNEL: + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_CURRENTCHANNEL \n")); + wrq->u.data.length = sizeof(UCHAR); + DBGPRINT(RT_DEBUG_TRACE, ("sizeof UCHAR=%d, channel=%d \n", sizeof(UCHAR), pAd->CommonCfg.Channel)); + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Channel, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); + break; +#endif //SNMP_SUPPORT + + case OID_802_11_BUILD_CHANNEL_EX: + { + UCHAR value; + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_BUILD_CHANNEL_EX \n")); + wrq->u.data.length = sizeof(UCHAR); +#ifdef EXT_BUILD_CHANNEL_LIST + DBGPRINT(RT_DEBUG_TRACE, ("Support EXT_BUILD_CHANNEL_LIST.\n")); + value = 1; +#else + DBGPRINT(RT_DEBUG_TRACE, ("Doesn't support EXT_BUILD_CHANNEL_LIST.\n")); + value = 0; +#endif // EXT_BUILD_CHANNEL_LIST // + Status = copy_to_user(wrq->u.data.pointer, &value, 1); + DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); + } + break; + + case OID_802_11_GET_CH_LIST: + { + PRT_CHANNEL_LIST_INFO pChListBuf; + + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CH_LIST \n")); + if (pAd->ChannelListNum == 0) + { + wrq->u.data.length = 0; + break; + } + + pChListBuf = (RT_CHANNEL_LIST_INFO *) kmalloc(sizeof(RT_CHANNEL_LIST_INFO), MEM_ALLOC_FLAG); + if (pChListBuf == NULL) + { + wrq->u.data.length = 0; + break; + } + + pChListBuf->ChannelListNum = pAd->ChannelListNum; + for (i = 0; i < pChListBuf->ChannelListNum; i++) + pChListBuf->ChannelList[i] = pAd->ChannelList[i].Channel; + + wrq->u.data.length = sizeof(RT_CHANNEL_LIST_INFO); + Status = copy_to_user(wrq->u.data.pointer, pChListBuf, sizeof(RT_CHANNEL_LIST_INFO)); + DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); + + if (pChListBuf) + kfree(pChListBuf); + } + break; + + case OID_802_11_GET_COUNTRY_CODE: + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_COUNTRY_CODE \n")); + wrq->u.data.length = 2; + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.CountryCode, 2); + DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); + break; + +#ifdef EXT_BUILD_CHANNEL_LIST + case OID_802_11_GET_CHANNEL_GEOGRAPHY: + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_GET_CHANNEL_GEOGRAPHY \n")); + wrq->u.data.length = 1; + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.Geography, 1); + DBGPRINT(RT_DEBUG_TRACE, ("Status=%d\n", Status)); + break; +#endif // EXT_BUILD_CHANNEL_LIST // + + +#ifdef QOS_DLS_SUPPORT + case RT_OID_802_11_QUERY_DLS: + wrq->u.data.length = sizeof(BOOLEAN); + Status = copy_to_user(wrq->u.data.pointer, &pAd->CommonCfg.bDLSCapable, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_DLS(=%d)\n", pAd->CommonCfg.bDLSCapable)); + break; + + case RT_OID_802_11_QUERY_DLS_PARAM: + { + PRT_802_11_DLS_INFO pDlsInfo = kmalloc(sizeof(RT_802_11_DLS_INFO), GFP_ATOMIC); + if (pDlsInfo == NULL) + break; + + for (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + RTMPMoveMemory(&pDlsInfo->Entry[i], &pAd->StaCfg.DLSEntry[i], sizeof(RT_802_11_DLS_UI)); + } + + pDlsInfo->num = MAX_NUM_OF_DLS_ENTRY; + wrq->u.data.length = sizeof(RT_802_11_DLS_INFO); + Status = copy_to_user(wrq->u.data.pointer, pDlsInfo, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::RT_OID_802_11_QUERY_DLS_PARAM\n")); + + if (pDlsInfo) + kfree(pDlsInfo); + } + break; +#endif // QOS_DLS_SUPPORT // + +#ifdef XLINK_SUPPORT + case OID_802_11_SET_PSPXLINK_MODE: + wrq->u.data.length = sizeof(BOOLEAN); + Status = copy_to_user(wrq->u.data.pointer, &pAd->StaCfg.PSPXlink, wrq->u.data.length); + DBGPRINT(RT_DEBUG_TRACE, ("Query::OID_802_11_SET_PSPXLINK_MODE(=%d)\n", pAd->StaCfg.PSPXlink)); + break; +#endif // XLINK_SUPPORT // + + default: + DBGPRINT(RT_DEBUG_TRACE, ("Query::unknown IOCTL's subcmd = 0x%08x\n", cmd)); + Status = -EOPNOTSUPP; + break; + } + return Status; +} + +INT rt28xx_sta_ioctl( + IN struct net_device *net_dev, + IN OUT struct ifreq *rq, + IN INT cmd) +{ + POS_COOKIE pObj; + RTMP_ADAPTER *pAd = NULL; + struct iwreq *wrq = (struct iwreq *) rq; + BOOLEAN StateMachineTouched = FALSE; + INT Status = NDIS_STATUS_SUCCESS; + USHORT subcmd; + + GET_PAD_FROM_NET_DEV(pAd, net_dev); + + if (pAd == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + pObj = (POS_COOKIE) pAd->OS_Cookie; + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { +#ifdef CONFIG_APSTA_MIXED_SUPPORT + if (wrq->u.data.pointer == NULL) + { + return Status; + } + + if (strstr(wrq->u.data.pointer, "OpMode") == NULL) +#endif // CONFIG_APSTA_MIXED_SUPPORT // + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + } + + { // determine this ioctl command is comming from which interface. + pObj->ioctl_if_type = INT_MAIN; + pObj->ioctl_if = MAIN_MBSSID; + } + + switch(cmd) + { +#ifdef RALINK_ATE +#ifdef RALINK_28xx_QA + case RTPRIV_IOCTL_ATE: + { + RtmpDoAte(pAd, wrq); + } + break; +#endif // RALINK_28xx_QA // +#endif // RALINK_ATE // + case SIOCGIFHWADDR: + DBGPRINT(RT_DEBUG_TRACE, ("IOCTL::SIOCGIFHWADDR\n")); + memcpy(wrq->u.name, pAd->CurrentAddress, ETH_ALEN); + break; + case SIOCGIWNAME: + { + char *name=&wrq->u.name[0]; + rt_ioctl_giwname(net_dev, NULL, name, NULL); + break; + } + case SIOCGIWESSID: //Get ESSID + { + struct iw_point *essid=&wrq->u.essid; + rt_ioctl_giwessid(net_dev, NULL, essid, essid->pointer); + break; + } + case SIOCSIWESSID: //Set ESSID + { + struct iw_point *essid=&wrq->u.essid; + rt_ioctl_siwessid(net_dev, NULL, essid, essid->pointer); + break; + } + case SIOCSIWNWID: // set network id (the cell) + case SIOCGIWNWID: // get network id + Status = -EOPNOTSUPP; + break; + case SIOCSIWFREQ: //set channel/frequency (Hz) + { + struct iw_freq *freq=&wrq->u.freq; + rt_ioctl_siwfreq(net_dev, NULL, freq, NULL); + break; + } + case SIOCGIWFREQ: // get channel/frequency (Hz) + { + struct iw_freq *freq=&wrq->u.freq; + rt_ioctl_giwfreq(net_dev, NULL, freq, NULL); + break; + } + case SIOCSIWNICKN: //set node name/nickname + { + //struct iw_point *data=&wrq->u.data; + //rt_ioctl_siwnickn(net_dev, NULL, data, NULL); + break; + } + case SIOCGIWNICKN: //get node name/nickname + { + struct iw_point *erq = NULL; + erq = &wrq->u.data; + erq->length = strlen((PSTRING) pAd->nickname); + Status = copy_to_user(erq->pointer, pAd->nickname, erq->length); + break; + } + case SIOCGIWRATE: //get default bit rate (bps) + rt_ioctl_giwrate(net_dev, NULL, &wrq->u, NULL); + break; + case SIOCSIWRATE: //set default bit rate (bps) + rt_ioctl_siwrate(net_dev, NULL, &wrq->u, NULL); + break; + case SIOCGIWRTS: // get RTS/CTS threshold (bytes) + { + struct iw_param *rts=&wrq->u.rts; + rt_ioctl_giwrts(net_dev, NULL, rts, NULL); + break; + } + case SIOCSIWRTS: //set RTS/CTS threshold (bytes) + { + struct iw_param *rts=&wrq->u.rts; + rt_ioctl_siwrts(net_dev, NULL, rts, NULL); + break; + } + case SIOCGIWFRAG: //get fragmentation thr (bytes) + { + struct iw_param *frag=&wrq->u.frag; + rt_ioctl_giwfrag(net_dev, NULL, frag, NULL); + break; + } + case SIOCSIWFRAG: //set fragmentation thr (bytes) + { + struct iw_param *frag=&wrq->u.frag; + rt_ioctl_siwfrag(net_dev, NULL, frag, NULL); + break; + } + case SIOCGIWENCODE: //get encoding token & mode + { + struct iw_point *erq=&wrq->u.encoding; + if(erq) + rt_ioctl_giwencode(net_dev, NULL, erq, erq->pointer); + break; + } + case SIOCSIWENCODE: //set encoding token & mode + { + struct iw_point *erq=&wrq->u.encoding; + if(erq) + rt_ioctl_siwencode(net_dev, NULL, erq, erq->pointer); + break; + } + case SIOCGIWAP: //get access point MAC addresses + { + struct sockaddr *ap_addr=&wrq->u.ap_addr; + rt_ioctl_giwap(net_dev, NULL, ap_addr, ap_addr->sa_data); + break; + } + case SIOCSIWAP: //set access point MAC addresses + { + struct sockaddr *ap_addr=&wrq->u.ap_addr; + rt_ioctl_siwap(net_dev, NULL, ap_addr, ap_addr->sa_data); + break; + } + case SIOCGIWMODE: //get operation mode + { + __u32 *mode=&wrq->u.mode; + rt_ioctl_giwmode(net_dev, NULL, mode, NULL); + break; + } + case SIOCSIWMODE: //set operation mode + { + __u32 *mode=&wrq->u.mode; + rt_ioctl_siwmode(net_dev, NULL, mode, NULL); + break; + } + case SIOCGIWSENS: //get sensitivity (dBm) + case SIOCSIWSENS: //set sensitivity (dBm) + case SIOCGIWPOWER: //get Power Management settings + case SIOCSIWPOWER: //set Power Management settings + case SIOCGIWTXPOW: //get transmit power (dBm) + case SIOCSIWTXPOW: //set transmit power (dBm) + case SIOCGIWRANGE: //Get range of parameters + case SIOCGIWRETRY: //get retry limits and lifetime + case SIOCSIWRETRY: //set retry limits and lifetime + Status = -EOPNOTSUPP; + break; + case RT_PRIV_IOCTL: + case RT_PRIV_IOCTL_EXT: + subcmd = wrq->u.data.flags; + if( subcmd & OID_GET_SET_TOGGLE) + Status = RTMPSetInformation(pAd, rq, subcmd); + else + Status = RTMPQueryInformation(pAd, rq, subcmd); + break; + case SIOCGIWPRIV: + if (wrq->u.data.pointer) + { + if ( access_ok(VERIFY_WRITE, wrq->u.data.pointer, sizeof(privtab)) != TRUE) + break; + if ((sizeof(privtab) / sizeof(privtab[0])) <= wrq->u.data.length) + { + wrq->u.data.length = sizeof(privtab) / sizeof(privtab[0]); + if (copy_to_user(wrq->u.data.pointer, privtab, sizeof(privtab))) + Status = -EFAULT; + } + else + Status = -E2BIG; + } + break; + case RTPRIV_IOCTL_SET: + if(access_ok(VERIFY_READ, wrq->u.data.pointer, wrq->u.data.length) != TRUE) + break; + rt_ioctl_setparam(net_dev, NULL, NULL, wrq->u.data.pointer); + break; + case RTPRIV_IOCTL_GSITESURVEY: + RTMPIoctlGetSiteSurvey(pAd, wrq); + break; +#ifdef DBG + case RTPRIV_IOCTL_MAC: + RTMPIoctlMAC(pAd, wrq); + break; + case RTPRIV_IOCTL_E2P: + RTMPIoctlE2PROM(pAd, wrq); + break; +#ifdef RTMP_RF_RW_SUPPORT + case RTPRIV_IOCTL_RF: + RTMPIoctlRF(pAd, wrq); + break; +#endif // RTMP_RF_RW_SUPPORT // +#endif // DBG // + + case SIOCETHTOOL: + break; + default: + DBGPRINT(RT_DEBUG_ERROR, ("IOCTL::unknown IOCTL's cmd = 0x%08x\n", cmd)); + Status = -EOPNOTSUPP; + break; + } + + if(StateMachineTouched) // Upper layer sent a MLME-related operations + RTMP_MLME_HANDLER(pAd); + + return Status; +} + +#ifdef DBG +/* + ========================================================================== + Description: + Read / Write MAC + Arguments: + pAdapter Pointer to our adapter + wrq Pointer to the ioctl argument + + Return Value: + None + + Note: + Usage: + 1.) iwpriv ra0 mac 0 ==> read MAC where Addr=0x0 + 2.) iwpriv ra0 mac 0=12 ==> write MAC where Addr=0x0, value=12 + ========================================================================== +*/ +VOID RTMPIoctlMAC( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq) +{ + PSTRING this_char; + PSTRING value; + INT j = 0, k = 0; + STRING msg[1024]; + STRING arg[255]; + ULONG macAddr = 0; + UCHAR temp[16]; + STRING temp2[16]; + UINT32 macValue = 0; + INT Status; + BOOLEAN bIsPrintAllMAC = FALSE; + + + memset(msg, 0x00, 1024); + if (wrq->u.data.length > 1) //No parameters. + { + Status = copy_from_user(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length); + sprintf(msg, "\n"); + + //Parsing Read or Write + this_char = arg; + if (!*this_char) + goto next; + + if ((value = rtstrchr(this_char, '=')) != NULL) + *value++ = 0; + + if (!value || !*value) + { //Read + // Sanity check + if(strlen(this_char) > 4) + goto next; + + j = strlen(this_char); + while(j-- > 0) + { + if(this_char[j] > 'f' || this_char[j] < '0') + return; + } + + // Mac Addr + k = j = strlen(this_char); + while(j-- > 0) + { + this_char[4-k+j] = this_char[j]; + } + + while(k < 4) + this_char[3-k++]='0'; + this_char[4]='\0'; + + if(strlen(this_char) == 4) + { + AtoH(this_char, temp, 2); + macAddr = *temp*256 + temp[1]; + if (macAddr < 0xFFFF) + { + RTMP_IO_READ32(pAdapter, macAddr, &macValue); + DBGPRINT(RT_DEBUG_TRACE, ("MacAddr=%lx, MacValue=%x\n", macAddr, macValue)); + sprintf(msg+strlen(msg), "[0x%08lX]:%08X ", macAddr , macValue); + } + else + {//Invalid parametes, so default printk all mac + bIsPrintAllMAC = TRUE; + goto next; + } + } + } + else + { //Write + memcpy(&temp2, value, strlen(value)); + temp2[strlen(value)] = '\0'; + + // Sanity check + if((strlen(this_char) > 4) || strlen(temp2) > 8) + goto next; + + j = strlen(this_char); + while(j-- > 0) + { + if(this_char[j] > 'f' || this_char[j] < '0') + return; + } + + j = strlen(temp2); + while(j-- > 0) + { + if(temp2[j] > 'f' || temp2[j] < '0') + return; + } + + //MAC Addr + k = j = strlen(this_char); + while(j-- > 0) + { + this_char[4-k+j] = this_char[j]; + } + + while(k < 4) + this_char[3-k++]='0'; + this_char[4]='\0'; + + //MAC value + k = j = strlen(temp2); + while(j-- > 0) + { + temp2[8-k+j] = temp2[j]; + } + + while(k < 8) + temp2[7-k++]='0'; + temp2[8]='\0'; + + { + AtoH(this_char, temp, 2); + macAddr = *temp*256 + temp[1]; + + AtoH(temp2, temp, 4); + macValue = *temp*256*256*256 + temp[1]*256*256 + temp[2]*256 + temp[3]; + + // debug mode + if (macAddr == (HW_DEBUG_SETTING_BASE + 4)) + { + // 0x2bf4: byte0 non-zero: enable R17 tuning, 0: disable R17 tuning + if (macValue & 0x000000ff) + { + pAdapter->BbpTuning.bEnable = TRUE; + DBGPRINT(RT_DEBUG_TRACE,("turn on R17 tuning\n")); + } + else + { + UCHAR R66; + pAdapter->BbpTuning.bEnable = FALSE; + R66 = 0x26 + GET_LNA_GAIN(pAdapter); +#ifdef RALINK_ATE + if (ATE_ON(pAdapter)) + { + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R27, 0x0); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R66, (0x26 + GET_LNA_GAIN(pAdapter))); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R27, 0x20); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R66, (0x26 + GET_LNA_GAIN(pAdapter))); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R27, 0x40); + ATE_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R66, (0x26 + GET_LNA_GAIN(pAdapter))); + } + else +#endif // RALINK_ATE // + +#ifdef RT35xx + if (IS_RT3572(pAdapter)) + { + RT3572WriteBBPR66(pAdapter, (0x26 + GET_LNA_GAIN(pAdapter))); + } + else +#endif // RT35xx // + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAdapter, BBP_R66, (0x26 + GET_LNA_GAIN(pAdapter))); + DBGPRINT(RT_DEBUG_TRACE,("turn off R17 tuning, restore to 0x%02x\n", R66)); + } + return; + } + + DBGPRINT(RT_DEBUG_TRACE, ("MacAddr=%02lx, MacValue=0x%x\n", macAddr, macValue)); + + RTMP_IO_WRITE32(pAdapter, macAddr, macValue); + sprintf(msg+strlen(msg), "[0x%08lX]:%08X ", macAddr, macValue); + } + } + } + else + bIsPrintAllMAC = TRUE; +next: + if (bIsPrintAllMAC) + { + struct file *file_w; + PSTRING fileName = "MacDump.txt"; + mm_segment_t orig_fs; + + orig_fs = get_fs(); + set_fs(KERNEL_DS); + + // open file + file_w = filp_open(fileName, O_WRONLY|O_CREAT, 0); + if (IS_ERR(file_w)) + { + DBGPRINT(RT_DEBUG_TRACE, ("-->2) %s: Error %ld opening %s\n", __FUNCTION__, -PTR_ERR(file_w), fileName)); + } + else + { + if (file_w->f_op && file_w->f_op->write) + { + file_w->f_pos = 0; + macAddr = 0x1000; + + while (macAddr <= 0x1800) + { + RTMP_IO_READ32(pAdapter, macAddr, &macValue); + sprintf(msg, "%08lx = %08X\n", macAddr, macValue); + + // write data to file + file_w->f_op->write(file_w, msg, strlen(msg), &file_w->f_pos); + + printk("%s", msg); + macAddr += 4; + } + sprintf(msg, "\nDump all MAC values to %s\n", fileName); + } + filp_close(file_w, NULL); + } + set_fs(orig_fs); + } + if(strlen(msg) == 1) + sprintf(msg+strlen(msg), "===>Error command format!"); + + // Copy the information into the user buffer + wrq->u.data.length = strlen(msg); + Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); + + DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlMAC\n\n")); +} + +/* + ========================================================================== + Description: + Read / Write E2PROM + Arguments: + pAdapter Pointer to our adapter + wrq Pointer to the ioctl argument + + Return Value: + None + + Note: + Usage: + 1.) iwpriv ra0 e2p 0 ==> read E2PROM where Addr=0x0 + 2.) iwpriv ra0 e2p 0=1234 ==> write E2PROM where Addr=0x0, value=1234 + ========================================================================== +*/ +VOID RTMPIoctlE2PROM( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq) +{ + PSTRING this_char; + PSTRING value; + INT j = 0, k = 0; + STRING msg[1024]; + STRING arg[255]; + USHORT eepAddr = 0; + UCHAR temp[16]; + STRING temp2[16]; + USHORT eepValue; + int Status; + BOOLEAN bIsPrintAllE2P = FALSE; + + + memset(msg, 0x00, 1024); + if (wrq->u.data.length > 1) //No parameters. + { + Status = copy_from_user(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length); + sprintf(msg, "\n"); + + //Parsing Read or Write + this_char = arg; + + + if (!*this_char) + goto next; + + if ((value = rtstrchr(this_char, '=')) != NULL) + *value++ = 0; + + if (!value || !*value) + { //Read + + // Sanity check + if(strlen(this_char) > 4) + goto next; + + j = strlen(this_char); + while(j-- > 0) + { + if(this_char[j] > 'f' || this_char[j] < '0') + return; + } + + // E2PROM addr + k = j = strlen(this_char); + while(j-- > 0) + { + this_char[4-k+j] = this_char[j]; + } + + while(k < 4) + this_char[3-k++]='0'; + this_char[4]='\0'; + + if(strlen(this_char) == 4) + { + AtoH(this_char, temp, 2); + eepAddr = *temp*256 + temp[1]; + if (eepAddr < 0xFFFF) + { + RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue); + sprintf(msg+strlen(msg), "[0x%04X]:0x%04X ", eepAddr , eepValue); + } + else + {//Invalid parametes, so default printk all bbp + bIsPrintAllE2P = TRUE; + goto next; + } + } + } + else + { //Write + memcpy(&temp2, value, strlen(value)); + temp2[strlen(value)] = '\0'; + + // Sanity check + if((strlen(this_char) > 4) || strlen(temp2) > 8) + goto next; + + j = strlen(this_char); + while(j-- > 0) + { + if(this_char[j] > 'f' || this_char[j] < '0') + return; + } + j = strlen(temp2); + while(j-- > 0) + { + if(temp2[j] > 'f' || temp2[j] < '0') + return; + } + + //MAC Addr + k = j = strlen(this_char); + while(j-- > 0) + { + this_char[4-k+j] = this_char[j]; + } + + while(k < 4) + this_char[3-k++]='0'; + this_char[4]='\0'; + + //MAC value + k = j = strlen(temp2); + while(j-- > 0) + { + temp2[4-k+j] = temp2[j]; + } + + while(k < 4) + temp2[3-k++]='0'; + temp2[4]='\0'; + + AtoH(this_char, temp, 2); + eepAddr = *temp*256 + temp[1]; + + AtoH(temp2, temp, 2); + eepValue = *temp*256 + temp[1]; + + RT28xx_EEPROM_WRITE16(pAdapter, eepAddr, eepValue); + sprintf(msg+strlen(msg), "[0x%02X]:%02X ", eepAddr, eepValue); + } + } + else + bIsPrintAllE2P = TRUE; +next: + if (bIsPrintAllE2P) + { + struct file *file_w; + PSTRING fileName = "EEPROMDump.txt"; + mm_segment_t orig_fs; + + orig_fs = get_fs(); + set_fs(KERNEL_DS); + + // open file + file_w = filp_open(fileName, O_WRONLY|O_CREAT, 0); + if (IS_ERR(file_w)) + { + DBGPRINT(RT_DEBUG_TRACE, ("-->2) %s: Error %ld opening %s\n", __FUNCTION__, -PTR_ERR(file_w), fileName)); + } + else + { + if (file_w->f_op && file_w->f_op->write) + { + file_w->f_pos = 0; + eepAddr = 0x00; + + while (eepAddr <= 0xFE) + { + RT28xx_EEPROM_READ16(pAdapter, eepAddr, eepValue); + sprintf(msg, "%08x = %04x\n", eepAddr , eepValue); + + // write data to file + file_w->f_op->write(file_w, msg, strlen(msg), &file_w->f_pos); + + printk("%s", msg); + eepAddr += 2; + } + sprintf(msg, "\nDump all EEPROM values to %s\n", fileName); + } + filp_close(file_w, NULL); + } + set_fs(orig_fs); + } + if(strlen(msg) == 1) + sprintf(msg+strlen(msg), "===>Error command format!"); + + + // Copy the information into the user buffer + wrq->u.data.length = strlen(msg); + Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); + + DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlE2PROM\n")); +} + + +#ifdef RT30xx +/* + ========================================================================== + Description: + Read / Write RF register +Arguments: + pAdapter Pointer to our adapter + wrq Pointer to the ioctl argument + + Return Value: + None + + Note: + Usage: + 1.) iwpriv ra0 rf ==> read all RF registers + 2.) iwpriv ra0 rf 1 ==> read RF where RegID=1 + 3.) iwpriv ra0 rf 1=10 ==> write RF R1=0x10 + ========================================================================== +*/ +VOID RTMPIoctlRF( + IN PRTMP_ADAPTER pAdapter, + IN struct iwreq *wrq) +{ + CHAR *this_char; + CHAR *value; + UCHAR regRF = 0; + STRING msg[2048]; + CHAR arg[255]; + INT rfId; + LONG rfValue; + int Status; + BOOLEAN bIsPrintAllRF = FALSE; + + + memset(msg, 0x00, 2048); + if (wrq->u.data.length > 1) //No parameters. + { + Status = copy_from_user(arg, wrq->u.data.pointer, (wrq->u.data.length > 255) ? 255 : wrq->u.data.length); + sprintf(msg, "\n"); + + //Parsing Read or Write + this_char = arg; + if (!*this_char) + goto next; + + if ((value = strchr(this_char,'=')) != NULL) + *value++ = 0; + + if (!value || !*value) + { //Read + if (sscanf((PSTRING) this_char, "%d", &(rfId)) == 1) + { + if (rfId <= 31) + { +#ifdef RALINK_ATE + /* + In RT2860 ATE mode, we do not load 8051 firmware. + We must access RF directly. + For RT2870 ATE mode, ATE_RF_IO_WRITE8(/READ8)_BY_REG_ID are redefined. + */ + if (ATE_ON(pAdapter)) + { + ATE_RF_IO_READ8_BY_REG_ID(pAdapter, rfId, ®RF); + } + else +#endif // RALINK_ATE // + // according to Andy, Gary, David require. + // the command rf shall read rf register directly for dubug. + // BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + RT30xxReadRFRegister(pAdapter, rfId, ®RF); + + sprintf(msg+strlen(msg), "R%02d[0x%02x]:%02X ", rfId, rfId, regRF); + } + else + {//Invalid parametes, so default printk all RF + bIsPrintAllRF = TRUE; + goto next; + } + } + else + { //Invalid parametes, so default printk all RF + bIsPrintAllRF = TRUE; + goto next; + } + } + else + { //Write + if ((sscanf((PSTRING) this_char, "%d", &(rfId)) == 1) && (sscanf((PSTRING) value, "%lx", &(rfValue)) == 1)) + { + if (rfId <= 31) + { +#ifdef RALINK_ATE + /* + In RT2860 ATE mode, we do not load 8051 firmware. + We must access RF directly. + For RT2870 ATE mode, ATE_RF_IO_WRITE8(/READ8)_BY_REG_ID are redefined. + */ + if (ATE_ON(pAdapter)) + { + ATE_RF_IO_READ8_BY_REG_ID(pAdapter, rfId, ®RF); + ATE_RF_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)rfId,(UCHAR) rfValue); + //Read it back for showing + ATE_RF_IO_READ8_BY_REG_ID(pAdapter, rfId, ®RF); + sprintf(msg+strlen(msg), "R%02d[0x%02X]:%02X\n", rfId, rfId, regRF); + } + else +#endif // RALINK_ATE // + { + // according to Andy, Gary, David require. + // the command RF shall read/write RF register directly for dubug. + //BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + //BBP_IO_WRITE8_BY_REG_ID(pAdapter, (UCHAR)bbpId,(UCHAR) bbpValue); + RT30xxReadRFRegister(pAdapter, rfId, ®RF); + RT30xxWriteRFRegister(pAdapter, (UCHAR)rfId,(UCHAR) rfValue); + //Read it back for showing + //BBP_IO_READ8_BY_REG_ID(pAdapter, bbpId, ®BBP); + RT30xxReadRFRegister(pAdapter, rfId, ®RF); + sprintf(msg+strlen(msg), "R%02d[0x%02X]:%02X\n", rfId, rfId, regRF); + } + } + else + {//Invalid parametes, so default printk all RF + bIsPrintAllRF = TRUE; + } + } + else + { //Invalid parametes, so default printk all RF + bIsPrintAllRF = TRUE; + } + } + } + else + bIsPrintAllRF = TRUE; +next: + if (bIsPrintAllRF) + { + memset(msg, 0x00, 2048); + sprintf(msg, "\n"); + for (rfId = 0; rfId <= 31; rfId++) + { +#ifdef RALINK_ATE + /* + In RT2860 ATE mode, we do not load 8051 firmware. + We must access RF directly. + For RT2870 ATE mode, ATE_RF_IO_WRITE8(/READ8)_BY_REG_ID are redefined. + */ + if (ATE_ON(pAdapter)) + { + ATE_RF_IO_READ8_BY_REG_ID(pAdapter, rfId, ®RF); + } + else +#endif // RALINK_ATE // + + // according to Andy, Gary, David require. + // the command RF shall read/write RF register directly for dubug. + RT30xxReadRFRegister(pAdapter, rfId, ®RF); + sprintf(msg+strlen(msg), "%03d = %02X\n", rfId, regRF); + } + // Copy the information into the user buffer + DBGPRINT(RT_DEBUG_TRACE, ("strlen(msg)=%d\n", (UINT32)strlen(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__)); + } + } + else + { + if(strlen(msg) == 1) + sprintf(msg+strlen(msg), "===>Error command format!"); + + DBGPRINT(RT_DEBUG_TRACE, ("copy to user [msg=%s]\n", msg)); + // Copy the information into the user buffer + DBGPRINT(RT_DEBUG_TRACE, ("strlen(msg) =%d\n", (UINT32)strlen(msg))); + + // Copy the information into the user buffer + wrq->u.data.length = strlen(msg); + Status = copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length); + } + + DBGPRINT(RT_DEBUG_TRACE, ("<==RTMPIoctlRF\n\n")); +} +#endif // RT30xx // +#endif // DBG // + + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/sta_ioctl.o b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/sta_ioctl.o new file mode 100644 index 0000000000000000000000000000000000000000..47a537d8588c7fdedf9c8bb4d630ae23f73162c3 GIT binary patch literal 79930 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	Xt;qQARsZbs64Yc z)jPEkE!c}Q%M%M2;z6O8oE@K>ksS{@X&d44VrUWo#Y%8$NkDO~Qzq)Qduc_9>0rMg z-^S>elH#3Oi7*D7k`mKV1VE?DFl6VZ=Ef%{CTFC^CxY((L8yTHk0Cv^#3>PUe<L{f zJP>&g9uS}ldk{L)Gt2Wbld~Zq9GqI>l3JWul$rv{hNuYyd`lIBlcRr8W-usz^7BGc z6N_B(%kvo0@`6)KoHGkDQj0(y0eK%1Z)s^L78R9%j0C4fc)`bzky;U-Qkq+U6a&E- ziAAZPFoA?W<d6|i{?7vy0N|s6N+1`Wfx|L5wFHz|z*i+@mQ;d0ALSb4AMfkv91ptm z2&M`o1H0A|e7<T%ez|j6I{4BthGI|<r!f>1W#*M+gMtwh1PJFBLoVP$6#(6t2=Z-k zYDq{%Kv8O9Zc<JvIN*a)i@|pefv)=Th1~SR;N%#Tnv5QHAa{Th1LR6HhTx3+@_6u# zU-7<)$>1^#k{dw^<9!ngygj0fpog=2x-b-#6qghwXB2_G2sXz(wIn#RBsCavGK^zM zz6aPru6c!}simnP|CNDGf62;BOUq1!q<c{Q1?9-Zyp)i9-{ew;VsI#=fi=2h7AJzv zunI~obOfIw$^b1;GRt8_d3;K08aVnKQ&Q044iq{rsh}i>tRGV6fo`XSBnbo`l(JG# zQdw|nNhnf*UYuEuk+nfF2dOBMbMlKJWfJ(PUE~NyF3lh*K0dyrC^0#;AU`v&Bp!OO z8UyIKTX3RAs+m0VLW@&_6Z60|GpyJKl?6GO#U%{xsd=d&CxMQhf?UIcl1RXJL4c#D zv^X`{B{e6p5)#QSsl~}42O^>u9Dkr|SbY<-Q$e){<a~YxXmmqe0J#JZVF&bTNKpO& zC4}JAl6cTryAWfMeGRT<K*<PHHbIVfW{8J-92x+S@}(H;U{G>{+U@CL<n0lKVksz6 F831a0PWb=; literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/vr_ikans.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/vr_ikans.c new file mode 100644 index 000000000..ae565ec74 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/os/linux/vr_ikans.c @@ -0,0 +1,352 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + vr_ikans.c + + Abstract: + Only for IKANOS Vx160 or Vx180 platform. + + The fast path will check IP address/ IP port, etc. NOT only check MAC. + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Sample Lin 01-28-2008 Created + + */ + +#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 void *pRxParam, + IN struct sk_buff *pSkb, + IN UINT32 Length) +{ + apPreHeader_t *apBuf; + + + 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_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + IfIdx = MAIN_MBSSID; + } +#endif // CONFIG_STA_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_STA_SUPPORT + IF_DEV_CONFIG_OPMODE_ON_STA(pAd) + { + IfIdx = MAIN_MBSSID; + } +#endif // CONFIG_STA_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 */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/readme.txt b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/readme.txt new file mode 100644 index 000000000..69a73403a --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/readme.txt @@ -0,0 +1,23 @@ +Driver install: + +Please use following command ( # is comment line , after the ">" is command) to install driver + +# extract driver + +> tar zxvf 2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2.tar.gz + +# enter the driver folder that just extract + +> cd 2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2 + +# compile the driver (system need install kernel-header package, should be installed by default) + +> make + +# install the driver to system (need "root" right) + +> make install + +#plugin the DWA-525(PCI device) then the driver should be loadup by system. + +# now user may use "networkmanager" to site survey and connect to AP. diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.assoc.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.assoc.o.cmd new file mode 100644 index 000000000..08f40e132 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.assoc.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/assoc.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.assoc.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(assoc)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_assoc.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/assoc.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/assoc.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/assoc.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/assoc.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/assoc.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/assoc.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.auth.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.auth.o.cmd new file mode 100644 index 000000000..1fd78eb2e --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.auth.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.auth.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(auth)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_auth.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.auth_rsp.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.auth_rsp.o.cmd new file mode 100644 index 000000000..ab4a95dd8 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.auth_rsp.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth_rsp.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.auth_rsp.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(auth_rsp)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_auth_rsp.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth_rsp.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth_rsp.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth_rsp.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth_rsp.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth_rsp.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/auth_rsp.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.connect.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.connect.o.cmd new file mode 100644 index 000000000..af2d78a22 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.connect.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/connect.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.connect.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(connect)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_connect.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/connect.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/connect.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/connect.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/connect.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/connect.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/connect.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.rtmp_data.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.rtmp_data.o.cmd new file mode 100644 index 000000000..77330c18c --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.rtmp_data.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/rtmp_data.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.rtmp_data.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(rtmp_data)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_rtmp_data.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/rtmp_data.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/rtmp_data.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/rtmp_data.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/rtmp_data.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/rtmp_data.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/rtmp_data.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sanity.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sanity.o.cmd new file mode 100644 index 000000000..a8a8e5b1e --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sanity.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sanity.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.sanity.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sanity)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_sanity.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sanity.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sanity.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sanity.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sanity.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sanity.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sanity.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sta_cfg.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sta_cfg.o.cmd new file mode 100644 index 000000000..ba8a66e33 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sta_cfg.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sta_cfg.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.sta_cfg.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sta_cfg)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_sta_cfg.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sta_cfg.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sta_cfg.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sta_cfg.c \ + $(wildcard include/config/apsta/mixed/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sta_cfg.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sta_cfg.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sta_cfg.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sync.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sync.o.cmd new file mode 100644 index 000000000..f4abab5f0 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.sync.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sync.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.sync.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(sync)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_sync.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sync.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sync.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sync.c \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sync.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sync.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/sync.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.wpa.o.cmd b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.wpa.o.cmd new file mode 100644 index 000000000..d746033d3 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/.wpa.o.cmd @@ -0,0 +1,813 @@ +cmd_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/wpa.o := gcc -Wp,-MD,/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.wpa.o.d -nostdinc -isystem /usr/lib/gcc/i486-linux-gnu/4.4.3/include -Iinclude -I/usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include -include include/linux/autoconf.h -Iubuntu/include -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m32 -msoft-float -mregparm=3 -freg-struct-return -mpreferred-stack-boundary=2 -march=i586 -mtune=generic -maccumulate-outgoing-args -Wa,-mtune=generic32 -ffreestanding -fstack-protector -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -Wframe-larger-than=1024 -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fno-dwarf2-cfi-asm -fconserve-stack -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs -DSYSTEM_LOG_SUPPORT -DKTHREAD_SUPPORT -DCONFIG_STA_SUPPORT -DDBG -DWPA_SUPPLICANT_SUPPORT -DNATIVE_WPA_SUPPLICANT_SUPPORT -DDOT11_N_SUPPORT -DDOT11N_DRAFT3 -DSTATS_COUNT_SUPPORT -DRTMP_MAC_PCI -DRT2860 -DRT28xx -DRT30xx -DRT35xx -DRTMP_PCI_SUPPORT -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DMODVERSIONS -I/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include -DMODULE -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR(wpa)" -D"KBUILD_MODNAME=KBUILD_STR(rt3562sta)" -c -o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/.tmp_wpa.o /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/wpa.c + +deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/wpa.o := \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/wpa.c \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + $(wildcard include/config/h//.h) \ + $(wildcard include/config/sta/support.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_os.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/os/rt_linux.h \ + $(wildcard include/config/apsta/mixed/support.h) \ + $(wildcard include/config/5vt/enhance.h) \ + include/linux/module.h \ + $(wildcard include/config/modules.h) \ + $(wildcard include/config/modversions.h) \ + $(wildcard include/config/unused/symbols.h) \ + $(wildcard include/config/generic/bug.h) \ + $(wildcard include/config/kallsyms.h) \ + $(wildcard include/config/tracepoints.h) \ + $(wildcard include/config/tracing.h) \ + $(wildcard include/config/event/tracing.h) \ + $(wildcard include/config/ftrace/mcount/record.h) \ + $(wildcard include/config/module/unload.h) \ + $(wildcard include/config/smp.h) \ + $(wildcard include/config/constructors.h) \ + $(wildcard include/config/sysfs.h) \ + include/linux/list.h \ + $(wildcard include/config/debug/list.h) \ + include/linux/stddef.h \ + include/linux/compiler.h \ + $(wildcard include/config/trace/branch/profiling.h) \ + $(wildcard include/config/profile/all/branches.h) \ + $(wildcard include/config/enable/must/check.h) \ + $(wildcard include/config/enable/warn/deprecated.h) \ + include/linux/compiler-gcc.h \ + $(wildcard include/config/arch/supports/optimized/inlining.h) \ + $(wildcard include/config/optimize/inlining.h) \ + include/linux/compiler-gcc4.h \ + include/linux/poison.h \ + $(wildcard include/config/illegal/pointer/value.h) \ + include/linux/prefetch.h \ + include/linux/types.h \ + $(wildcard include/config/uid16.h) \ + $(wildcard include/config/lbdaf.h) \ + $(wildcard include/config/phys/addr/t/64bit.h) \ + $(wildcard include/config/64bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/types.h \ + $(wildcard include/config/x86/64.h) \ + $(wildcard include/config/highmem64g.h) \ + include/asm-generic/types.h \ + include/asm-generic/int-ll64.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitsperlong.h \ + include/asm-generic/bitsperlong.h \ + include/linux/posix_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types.h \ + $(wildcard include/config/x86/32.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/posix_types_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor.h \ + $(wildcard include/config/x86/vsmp.h) \ + $(wildcard include/config/cc/stackprotector.h) \ + $(wildcard include/config/paravirt.h) \ + $(wildcard include/config/m386.h) \ + $(wildcard include/config/m486.h) \ + $(wildcard include/config/x86/debugctlmsr.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/processor-flags.h \ + $(wildcard include/config/vm86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vm86.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace.h \ + $(wildcard include/config/x86/ptrace/bts.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ptrace-abi.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/segment.h \ + include/linux/init.h \ + $(wildcard include/config/hotplug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/math_emu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sigcontext.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/current.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/percpu.h \ + $(wildcard include/config/x86/64/smp.h) \ + include/linux/kernel.h \ + $(wildcard include/config/preempt/voluntary.h) \ + $(wildcard include/config/debug/spinlock/sleep.h) \ + $(wildcard include/config/prove/locking.h) \ + $(wildcard include/config/printk.h) \ + $(wildcard include/config/dynamic/debug.h) \ + $(wildcard include/config/ring/buffer.h) \ + $(wildcard include/config/numa.h) \ + /usr/lib/gcc/i486-linux-gnu/4.4.3/include/stdarg.h \ + include/linux/linkage.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/linkage.h \ + $(wildcard include/config/x86/alignment/16.h) \ + include/linux/stringify.h \ + include/linux/bitops.h \ + $(wildcard include/config/generic/find/first/bit.h) \ + $(wildcard include/config/generic/find/last/bit.h) \ + $(wildcard include/config/generic/find/next/bit.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bitops.h \ + $(wildcard include/config/x86/cmov.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/alternative.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/asm.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpufeature.h \ + $(wildcard include/config/x86/invlpg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/required-features.h \ + $(wildcard include/config/x86/minimum/cpu/family.h) \ + $(wildcard include/config/math/emulation.h) \ + $(wildcard include/config/x86/pae.h) \ + $(wildcard include/config/x86/cmpxchg64.h) \ + $(wildcard include/config/x86/use/3dnow.h) \ + $(wildcard include/config/x86/p6/nop.h) \ + include/asm-generic/bitops/sched.h \ + include/asm-generic/bitops/hweight.h \ + include/asm-generic/bitops/fls64.h \ + include/asm-generic/bitops/ext2-non-atomic.h \ + include/asm-generic/bitops/le.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/byteorder.h \ + include/linux/byteorder/little_endian.h \ + include/linux/swab.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swab.h \ + $(wildcard include/config/x86/bswap.h) \ + include/linux/byteorder/generic.h \ + include/asm-generic/bitops/minix.h \ + include/linux/log2.h \ + $(wildcard include/config/arch/has/ilog2/u32.h) \ + $(wildcard include/config/arch/has/ilog2/u64.h) \ + include/linux/typecheck.h \ + include/linux/ratelimit.h \ + include/linux/param.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/param.h \ + include/asm-generic/param.h \ + $(wildcard include/config/hz.h) \ + include/linux/dynamic_debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bug.h \ + $(wildcard include/config/bug.h) \ + $(wildcard include/config/debug/bugverbose.h) \ + include/asm-generic/bug.h \ + $(wildcard include/config/generic/bug/relative/pointers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/div64.h \ + include/asm-generic/percpu.h \ + $(wildcard include/config/debug/preempt.h) \ + $(wildcard include/config/have/setup/per/cpu/area.h) \ + include/linux/threads.h \ + $(wildcard include/config/nr/cpus.h) \ + $(wildcard include/config/base/small.h) \ + include/linux/percpu-defs.h \ + $(wildcard include/config/debug/force/weak/per/cpu.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/system.h \ + $(wildcard include/config/ia32/emulation.h) \ + $(wildcard include/config/x86/32/lazy/gs.h) \ + $(wildcard include/config/x86/ppro/fence.h) \ + $(wildcard include/config/x86/oostore.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cmpxchg_32.h \ + $(wildcard include/config/x86/cmpxchg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/nops.h \ + $(wildcard include/config/mk7.h) \ + include/linux/irqflags.h \ + $(wildcard include/config/trace/irqflags.h) \ + $(wildcard include/config/irqsoff/tracer.h) \ + $(wildcard include/config/preempt/tracer.h) \ + $(wildcard include/config/trace/irqflags/support.h) \ + $(wildcard include/config/x86.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irqflags.h \ + $(wildcard include/config/debug/lock/alloc.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt.h \ + $(wildcard include/config/highpte.h) \ + $(wildcard include/config/paravirt/spinlocks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_types.h \ + $(wildcard include/config/kmemcheck.h) \ + $(wildcard include/config/compat/vdso.h) \ + $(wildcard include/config/proc/fs.h) \ + include/linux/const.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32_types.h \ + $(wildcard include/config/highmem4g.h) \ + $(wildcard include/config/page/offset.h) \ + $(wildcard include/config/4kstacks.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + $(wildcard include/config/highmem.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level_types.h \ + include/asm-generic/pgtable-nopud.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/paravirt_types.h \ + $(wildcard include/config/x86/local/apic.h) \ + $(wildcard include/config/paravirt/debug.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc_defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/kmap_types.h \ + $(wildcard include/config/debug/highmem.h) \ + include/asm-generic/kmap_types.h \ + include/linux/cpumask.h \ + $(wildcard include/config/cpumask/offstack.h) \ + $(wildcard include/config/hotplug/cpu.h) \ + $(wildcard include/config/debug/per/cpu/maps.h) \ + $(wildcard include/config/disable/obsolete/cpumask/functions.h) \ + include/linux/bitmap.h \ + include/linux/string.h \ + $(wildcard include/config/binary/printf.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/string_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/page_32.h \ + $(wildcard include/config/hugetlb/page.h) \ + $(wildcard include/config/debug/virtual.h) \ + $(wildcard include/config/flatmem.h) \ + $(wildcard include/config/x86/3dnow.h) \ + include/asm-generic/memory_model.h \ + $(wildcard include/config/discontigmem.h) \ + $(wildcard include/config/sparsemem/vmemmap.h) \ + $(wildcard include/config/sparsemem.h) \ + include/asm-generic/getorder.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/msr-index.h \ + include/linux/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ioctl.h \ + include/asm-generic/ioctl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/errno.h \ + include/asm-generic/errno.h \ + include/asm-generic/errno-base.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cpumask.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ds.h \ + $(wildcard include/config/x86/ds.h) \ + include/linux/err.h \ + include/linux/personality.h \ + include/linux/cache.h \ + $(wildcard include/config/arch/has/cache/line/size.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cache.h \ + $(wildcard include/config/x86/l1/cache/shift.h) \ + include/linux/math64.h \ + include/linux/stat.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/stat.h \ + include/linux/time.h \ + $(wildcard include/config/arch/uses/gettimeoffset.h) \ + include/linux/seqlock.h \ + include/linux/spinlock.h \ + $(wildcard include/config/debug/spinlock.h) \ + $(wildcard include/config/generic/lockbreak.h) \ + $(wildcard include/config/preempt.h) \ + include/linux/preempt.h \ + $(wildcard include/config/preempt/notifiers.h) \ + include/linux/thread_info.h \ + $(wildcard include/config/compat.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/thread_info.h \ + $(wildcard include/config/debug/stack/usage.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ftrace.h \ + $(wildcard include/config/function/tracer.h) \ + $(wildcard include/config/dynamic/ftrace.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/atomic_32.h \ + include/asm-generic/atomic-long.h \ + include/linux/bottom_half.h \ + include/linux/spinlock_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock_types.h \ + include/linux/lockdep.h \ + $(wildcard include/config/lockdep.h) \ + $(wildcard include/config/lock/stat.h) \ + $(wildcard include/config/generic/hardirqs.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/spinlock.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwlock.h \ + include/linux/spinlock_api_smp.h \ + include/linux/kmod.h \ + include/linux/gfp.h \ + $(wildcard include/config/zone/dma.h) \ + $(wildcard include/config/zone/dma32.h) \ + $(wildcard include/config/debug/vm.h) \ + include/linux/mmzone.h \ + $(wildcard include/config/force/max/zoneorder.h) \ + $(wildcard include/config/memory/hotplug.h) \ + $(wildcard include/config/arch/populates/node/map.h) \ + $(wildcard include/config/flat/node/mem/map.h) \ + $(wildcard include/config/cgroup/mem/res/ctlr.h) \ + $(wildcard include/config/have/memory/present.h) \ + $(wildcard include/config/need/node/memmap/size.h) \ + $(wildcard include/config/need/multiple/nodes.h) \ + $(wildcard include/config/have/arch/early/pfn/to/nid.h) \ + $(wildcard include/config/sparsemem/extreme.h) \ + $(wildcard include/config/nodes/span/other/nodes.h) \ + $(wildcard include/config/holes/in/zone.h) \ + $(wildcard include/config/arch/has/holes/memorymodel.h) \ + include/linux/wait.h \ + include/linux/numa.h \ + $(wildcard include/config/nodes/shift.h) \ + include/linux/nodemask.h \ + include/linux/pageblock-flags.h \ + $(wildcard include/config/hugetlb/page/size/variable.h) \ + include/linux/bounds.h \ + include/linux/memory_hotplug.h \ + $(wildcard include/config/have/arch/nodedata/extension.h) \ + $(wildcard include/config/memory/hotremove.h) \ + include/linux/notifier.h \ + include/linux/errno.h \ + include/linux/mutex.h \ + $(wildcard include/config/debug/mutexes.h) \ + include/linux/rwsem.h \ + $(wildcard include/config/rwsem/generic/spinlock.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/rwsem.h \ + include/linux/srcu.h \ + include/linux/topology.h \ + $(wildcard include/config/sched/smt.h) \ + $(wildcard include/config/sched/mc.h) \ + include/linux/smp.h \ + $(wildcard include/config/use/generic/smp/helpers.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/smp.h \ + $(wildcard include/config/x86/io/apic.h) \ + $(wildcard include/config/x86/32/smp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec.h \ + $(wildcard include/config/x86/numaq.h) \ + $(wildcard include/config/mca.h) \ + $(wildcard include/config/eisa.h) \ + $(wildcard include/config/x86/mpparse.h) \ + $(wildcard include/config/acpi.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mpspec_def.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/x86_init.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/bootparam.h \ + include/linux/screen_info.h \ + include/linux/apm_bios.h \ + include/linux/edd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/e820.h \ + $(wildcard include/config/efi.h) \ + $(wildcard include/config/hibernation.h) \ + $(wildcard include/config/memtest.h) \ + include/linux/ioport.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ist.h \ + include/video/edid.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apic.h \ + $(wildcard include/config/x86/x2apic.h) \ + include/linux/delay.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/delay.h \ + include/linux/pm.h \ + $(wildcard include/config/pm/sleep.h) \ + $(wildcard include/config/pm/runtime.h) \ + include/linux/workqueue.h \ + include/linux/timer.h \ + $(wildcard include/config/timer/stats.h) \ + $(wildcard include/config/debug/objects/timers.h) \ + include/linux/ktime.h \ + $(wildcard include/config/ktime/scalar.h) \ + include/linux/jiffies.h \ + include/linux/timex.h \ + $(wildcard include/config/no/hz.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/timex.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/tsc.h \ + $(wildcard include/config/x86/tsc.h) \ + include/linux/debugobjects.h \ + $(wildcard include/config/debug/objects.h) \ + $(wildcard include/config/debug/objects/free.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/apicdef.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fixmap.h \ + $(wildcard include/config/provide/ohci1394/dma/init.h) \ + $(wildcard include/config/x86/visws/apic.h) \ + $(wildcard include/config/x86/f00f/bug.h) \ + $(wildcard include/config/x86/cyclone/timer.h) \ + $(wildcard include/config/pci/mmconfig.h) \ + $(wildcard include/config/intel/txt.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/acpi.h \ + $(wildcard include/config/acpi/numa.h) \ + include/acpi/pdc_intel.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/numa_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/mmu.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_apic.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_vectors.h \ + $(wildcard include/config/sparse/irq.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/topology.h \ + $(wildcard include/config/x86/ht.h) \ + $(wildcard include/config/x86/64/acpi/numa.h) \ + include/asm-generic/topology.h \ + include/linux/mmdebug.h \ + include/linux/elf.h \ + include/linux/elf-em.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/elf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/user_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/auxvec.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/vdso.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/desc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ldt.h \ + include/linux/mm_types.h \ + $(wildcard include/config/split/ptlock/cpus.h) \ + $(wildcard include/config/want/page/debug/flags.h) \ + $(wildcard include/config/mmu.h) \ + $(wildcard include/config/aio.h) \ + $(wildcard include/config/mm/owner.h) \ + $(wildcard include/config/mmu/notifier.h) \ + include/linux/auxvec.h \ + include/linux/prio_tree.h \ + include/linux/rbtree.h \ + include/linux/completion.h \ + include/linux/page-debug-flags.h \ + $(wildcard include/config/page/poisoning.h) \ + $(wildcard include/config/page/debug/something/else.h) \ + include/linux/kobject.h \ + include/linux/sysfs.h \ + include/linux/kref.h \ + include/linux/moduleparam.h \ + $(wildcard include/config/alpha.h) \ + $(wildcard include/config/ia64.h) \ + $(wildcard include/config/ppc64.h) \ + include/linux/tracepoint.h \ + include/linux/rcupdate.h \ + $(wildcard include/config/tree/preempt/rcu.h) \ + $(wildcard include/config/tree/rcu.h) \ + include/linux/rcutree.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/local.h \ + include/linux/percpu.h \ + $(wildcard include/config/have/legacy/per/cpu/area.h) \ + $(wildcard include/config/need/per/cpu/embed/first/chunk.h) \ + $(wildcard include/config/need/per/cpu/page/first/chunk.h) \ + $(wildcard include/config/debug/kmemleak.h) \ + include/linux/slab.h \ + $(wildcard include/config/slab/debug.h) \ + $(wildcard include/config/slub.h) \ + $(wildcard include/config/slob.h) \ + $(wildcard include/config/debug/slab.h) \ + include/linux/slub_def.h \ + $(wildcard include/config/slub/stats.h) \ + $(wildcard include/config/slub/debug.h) \ + $(wildcard include/config/kmemtrace.h) \ + include/linux/kmemtrace.h \ + include/trace/events/kmem.h \ + include/trace/define_trace.h \ + include/linux/kmemleak.h \ + include/linux/pfn.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/module.h \ + $(wildcard include/config/m586.h) \ + $(wildcard include/config/m586tsc.h) \ + $(wildcard include/config/m586mmx.h) \ + $(wildcard include/config/mcore2.h) \ + $(wildcard include/config/matom.h) \ + $(wildcard include/config/m686.h) \ + $(wildcard include/config/mpentiumii.h) \ + $(wildcard include/config/mpentiumiii.h) \ + $(wildcard include/config/mpentiumm.h) \ + $(wildcard include/config/mpentium4.h) \ + $(wildcard include/config/mk6.h) \ + $(wildcard include/config/mk8.h) \ + $(wildcard include/config/x86/elan.h) \ + $(wildcard include/config/mcrusoe.h) \ + $(wildcard include/config/mefficeon.h) \ + $(wildcard include/config/mwinchipc6.h) \ + $(wildcard include/config/mwinchip3d.h) \ + $(wildcard include/config/mcyrixiii.h) \ + $(wildcard include/config/mviac3/2.h) \ + $(wildcard include/config/mviac7.h) \ + $(wildcard include/config/mgeodegx1.h) \ + $(wildcard include/config/mgeode/lx.h) \ + include/asm-generic/module.h \ + include/trace/events/module.h \ + include/linux/version.h \ + include/linux/interrupt.h \ + $(wildcard include/config/generic/irq/probe.h) \ + $(wildcard include/config/debug/shirq.h) \ + include/linux/irqreturn.h \ + include/linux/irqnr.h \ + include/linux/hardirq.h \ + $(wildcard include/config/virt/cpu/accounting.h) \ + include/linux/ftrace_irq.h \ + $(wildcard include/config/ftrace/nmi/enter.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hardirq.h \ + $(wildcard include/config/x86/mce.h) \ + $(wildcard include/config/x86/mce/threshold.h) \ + include/linux/irq.h \ + $(wildcard include/config/s390.h) \ + $(wildcard include/config/irq/per/cpu.h) \ + $(wildcard include/config/irq/release/method.h) \ + $(wildcard include/config/intr/remap.h) \ + $(wildcard include/config/generic/pending/irq.h) \ + $(wildcard include/config/numa/irq/desc.h) \ + $(wildcard include/config/generic/hardirqs/no//do/irq.h) \ + $(wildcard include/config/cpumasks/offstack.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/irq_regs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/hw_irq.h \ + include/linux/profile.h \ + $(wildcard include/config/profiling.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sections.h \ + include/asm-generic/sections.h \ + include/linux/hrtimer.h \ + $(wildcard include/config/high/res/timers.h) \ + include/linux/pci.h \ + $(wildcard include/config/pci/iov.h) \ + $(wildcard include/config/pcieaspm.h) \ + $(wildcard include/config/pci/msi.h) \ + $(wildcard include/config/pci.h) \ + $(wildcard include/config/pci/legacy.h) \ + $(wildcard include/config/pcie/ecrc.h) \ + $(wildcard include/config/ht/irq.h) \ + $(wildcard include/config/pci/domains.h) \ + $(wildcard include/config/hotplug/pci.h) \ + include/linux/pci_regs.h \ + include/linux/mod_devicetable.h \ + include/linux/device.h \ + $(wildcard include/config/debug/devres.h) \ + $(wildcard include/config/devtmpfs.h) \ + include/linux/klist.h \ + include/linux/semaphore.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/device.h \ + $(wildcard include/config/dmar.h) \ + include/linux/pm_wakeup.h \ + $(wildcard include/config/pm.h) \ + include/linux/io.h \ + $(wildcard include/config/has/ioport.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/io_32.h \ + include/asm-generic/iomap.h \ + include/linux/vmalloc.h \ + include/linux/pci_ids.h \ + include/linux/dmapool.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/scatterlist.h \ + include/asm-generic/scatterlist.h \ + $(wildcard include/config/debug/sg.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pci.h \ + $(wildcard include/config/dma/api/debug.h) \ + include/linux/mm.h \ + $(wildcard include/config/sysctl.h) \ + $(wildcard include/config/stack/growsup.h) \ + $(wildcard include/config/swap.h) \ + $(wildcard include/config/debug/pagealloc.h) \ + include/linux/debug_locks.h \ + $(wildcard include/config/debug/locking/api/selftests.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable_32_types.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/pgtable-3level.h \ + include/asm-generic/pgtable.h \ + include/linux/page-flags.h \ + $(wildcard include/config/pageflags/extended.h) \ + $(wildcard include/config/have/mlocked/page/bit.h) \ + $(wildcard include/config/arch/uses/pg/uncached.h) \ + $(wildcard include/config/memory/failure.h) \ + include/linux/vmstat.h \ + $(wildcard include/config/vm/event/counters.h) \ + include/asm-generic/pci-dma-compat.h \ + include/linux/dma-mapping.h \ + $(wildcard include/config/has/dma.h) \ + $(wildcard include/config/have/dma/attrs.h) \ + include/linux/dma-attrs.h \ + include/linux/bug.h \ + include/linux/scatterlist.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/dma-mapping.h \ + $(wildcard include/config/isa.h) \ + include/linux/kmemcheck.h \ + include/linux/dma-debug.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/swiotlb.h \ + $(wildcard include/config/swiotlb.h) \ + include/linux/swiotlb.h \ + include/asm-generic/dma-coherent.h \ + $(wildcard include/config/have/generic/dma/coherent.h) \ + include/asm-generic/dma-mapping-common.h \ + include/asm-generic/pci.h \ + include/linux/netdevice.h \ + $(wildcard include/config/dcb.h) \ + $(wildcard include/config/wlan/80211.h) \ + $(wildcard include/config/ax25.h) \ + $(wildcard include/config/mac80211/mesh.h) \ + $(wildcard include/config/tr.h) \ + $(wildcard include/config/net/ipip.h) \ + $(wildcard include/config/net/ipgre.h) \ + $(wildcard include/config/ipv6/sit.h) \ + $(wildcard include/config/ipv6/tunnel.h) \ + $(wildcard include/config/netpoll.h) \ + $(wildcard include/config/net/poll/controller.h) \ + $(wildcard include/config/fcoe.h) \ + $(wildcard include/config/wireless/ext.h) \ + $(wildcard include/config/net/dsa.h) \ + $(wildcard include/config/net/ns.h) \ + $(wildcard include/config/net/dsa/tag/dsa.h) \ + $(wildcard include/config/net/dsa/tag/trailer.h) \ + $(wildcard include/config/netpoll/trap.h) \ + include/linux/if.h \ + include/linux/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/socket.h \ + include/asm-generic/socket.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sockios.h \ + include/asm-generic/sockios.h \ + include/linux/sockios.h \ + include/linux/uio.h \ + include/linux/hdlc/ioctl.h \ + include/linux/if_ether.h \ + include/linux/skbuff.h \ + $(wildcard include/config/nf/conntrack.h) \ + $(wildcard include/config/bridge/netfilter.h) \ + $(wildcard include/config/xfrm.h) \ + $(wildcard include/config/net/sched.h) \ + $(wildcard include/config/net/cls/act.h) \ + $(wildcard include/config/ipv6/ndisc/nodetype.h) \ + $(wildcard include/config/net/dma.h) \ + $(wildcard include/config/network/secmark.h) \ + include/linux/net.h \ + include/linux/random.h \ + include/linux/fcntl.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/fcntl.h \ + include/asm-generic/fcntl.h \ + include/linux/sysctl.h \ + include/linux/textsearch.h \ + include/net/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess.h \ + $(wildcard include/config/x86/wp/works/ok.h) \ + $(wildcard include/config/x86/intel/usercopy.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/uaccess_32.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/checksum_32.h \ + include/linux/in6.h \ + include/linux/dmaengine.h \ + $(wildcard include/config/dma/engine.h) \ + $(wildcard include/config/async/tx/dma.h) \ + $(wildcard include/config/async/tx/disable/channel/switch.h) \ + include/linux/if_packet.h \ + include/linux/rculist.h \ + include/linux/ethtool.h \ + include/net/net_namespace.h \ + $(wildcard include/config/ipv6.h) \ + $(wildcard include/config/ip/dccp.h) \ + $(wildcard include/config/netfilter.h) \ + $(wildcard include/config/net.h) \ + include/net/netns/core.h \ + include/net/netns/mib.h \ + $(wildcard include/config/xfrm/statistics.h) \ + include/net/snmp.h \ + include/linux/snmp.h \ + include/net/netns/unix.h \ + include/net/netns/packet.h \ + include/net/netns/ipv4.h \ + $(wildcard include/config/ip/multiple/tables.h) \ + $(wildcard include/config/ip/mroute.h) \ + $(wildcard include/config/ip/pimsm/v1.h) \ + $(wildcard include/config/ip/pimsm/v2.h) \ + include/net/inet_frag.h \ + include/net/netns/ipv6.h \ + $(wildcard include/config/ipv6/multiple/tables.h) \ + $(wildcard include/config/ipv6/mroute.h) \ + $(wildcard include/config/ipv6/pimsm/v2.h) \ + include/net/dst_ops.h \ + include/net/netns/dccp.h \ + include/net/netns/x_tables.h \ + $(wildcard include/config/bridge/nf/ebtables.h) \ + include/linux/netfilter.h \ + $(wildcard include/config/netfilter/debug.h) \ + $(wildcard include/config/nf/nat/needed.h) \ + include/linux/in.h \ + include/net/flow.h \ + include/linux/proc_fs.h \ + $(wildcard include/config/proc/devicetree.h) \ + $(wildcard include/config/proc/kcore.h) \ + include/linux/fs.h \ + $(wildcard include/config/dnotify.h) \ + $(wildcard include/config/quota.h) \ + $(wildcard include/config/fsnotify.h) \ + $(wildcard include/config/inotify.h) \ + $(wildcard include/config/security.h) \ + $(wildcard include/config/fs/posix/acl.h) \ + $(wildcard include/config/epoll.h) \ + $(wildcard include/config/debug/writecount.h) \ + $(wildcard include/config/file/locking.h) \ + $(wildcard include/config/auditsyscall.h) \ + $(wildcard include/config/block.h) \ + $(wildcard include/config/fs/xip.h) \ + $(wildcard include/config/migration.h) \ + include/linux/limits.h \ + include/linux/kdev_t.h \ + include/linux/dcache.h \ + include/linux/path.h \ + include/linux/radix-tree.h \ + include/linux/pid.h \ + include/linux/capability.h \ + $(wildcard include/config/security/file/capabilities.h) \ + include/linux/fiemap.h \ + include/linux/quota.h \ + include/linux/dqblk_xfs.h \ + include/linux/dqblk_v1.h \ + include/linux/dqblk_v2.h \ + include/linux/dqblk_qtree.h \ + include/linux/nfs_fs_i.h \ + include/linux/nfs.h \ + include/linux/sunrpc/msg_prot.h \ + include/linux/inet.h \ + include/linux/magic.h \ + include/net/netns/conntrack.h \ + include/linux/list_nulls.h \ + include/net/netns/xfrm.h \ + include/linux/xfrm.h \ + include/linux/seq_file_net.h \ + include/linux/seq_file.h \ + include/net/dsa.h \ + include/net/dcbnl.h \ + include/linux/etherdevice.h \ + $(wildcard include/config/have/efficient/unaligned/access.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unaligned.h \ + include/linux/unaligned/access_ok.h \ + include/linux/unaligned/generic.h \ + include/linux/wireless.h \ + include/linux/if_arp.h \ + include/linux/ctype.h \ + include/linux/usb.h \ + $(wildcard include/config/usb/devicefs.h) \ + $(wildcard include/config/usb/mon.h) \ + $(wildcard include/config/usb/device/class.h) \ + $(wildcard include/config/usb/suspend.h) \ + include/linux/usb/ch9.h \ + $(wildcard include/config/size.h) \ + $(wildcard include/config/att/one.h) \ + $(wildcard include/config/att/selfpower.h) \ + $(wildcard include/config/att/wakeup.h) \ + $(wildcard include/config/att/battery.h) \ + include/linux/sched.h \ + $(wildcard include/config/sched/debug.h) \ + $(wildcard include/config/detect/softlockup.h) \ + $(wildcard include/config/detect/hung/task.h) \ + $(wildcard include/config/core/dump/default/elf/headers.h) \ + $(wildcard include/config/bsd/process/acct.h) \ + $(wildcard include/config/taskstats.h) \ + $(wildcard include/config/audit.h) \ + $(wildcard include/config/inotify/user.h) \ + $(wildcard include/config/posix/mqueue.h) \ + $(wildcard include/config/keys.h) \ + $(wildcard include/config/user/sched.h) \ + $(wildcard include/config/perf/events.h) \ + $(wildcard include/config/schedstats.h) \ + $(wildcard include/config/task/delay/acct.h) \ + $(wildcard include/config/fair/group/sched.h) \ + $(wildcard include/config/rt/group/sched.h) \ + $(wildcard include/config/blk/dev/io/trace.h) \ + $(wildcard include/config/sysvipc.h) \ + $(wildcard include/config/rt/mutexes.h) \ + $(wildcard include/config/task/xacct.h) \ + $(wildcard include/config/cpusets.h) \ + $(wildcard include/config/cgroups.h) \ + $(wildcard include/config/futex.h) \ + $(wildcard include/config/fault/injection.h) \ + $(wildcard include/config/latencytop.h) \ + $(wildcard include/config/function/graph/tracer.h) \ + $(wildcard include/config/have/unstable/sched/clock.h) \ + $(wildcard include/config/group/sched.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/cputime.h \ + include/asm-generic/cputime.h \ + include/linux/sem.h \ + include/linux/ipc.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/ipcbuf.h \ + include/asm-generic/ipcbuf.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/sembuf.h \ + include/linux/signal.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/signal.h \ + include/asm-generic/signal-defs.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/siginfo.h \ + include/asm-generic/siginfo.h \ + include/linux/proportions.h \ + include/linux/percpu_counter.h \ + include/linux/seccomp.h \ + $(wildcard include/config/seccomp.h) \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/seccomp_32.h \ + include/linux/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/unistd_32.h \ + include/linux/rtmutex.h \ + $(wildcard include/config/debug/rt/mutexes.h) \ + include/linux/plist.h \ + $(wildcard include/config/debug/pi/list.h) \ + include/linux/resource.h \ + /usr/src/linux-headers-2.6.32-29-generic-pae/arch/x86/include/asm/resource.h \ + include/asm-generic/resource.h \ + include/linux/task_io_accounting.h \ + $(wildcard include/config/task/io/accounting.h) \ + include/linux/latencytop.h \ + include/linux/cred.h \ + $(wildcard include/config/debug/credentials.h) \ + include/linux/key.h \ + include/linux/selinux.h \ + $(wildcard include/config/security/selinux.h) \ + include/linux/aio.h \ + include/linux/aio_abi.h \ + include/net/iw_handler.h \ + include/linux/kthread.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/oid.h \ + $(wildcard include/config/status.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_chip.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt2860.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/mac_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_type.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_mac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rtmp_phy.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_iface.h \ + $(wildcard include/config/.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/iface/rtmp_pci.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt35xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chip/rt30xx.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_timer.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/mlme.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_dot11.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_md5.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_sha2.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_hmac.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rt_config.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_aes.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/crypt_arc4.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_cmd.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp.h \ + $(wildcard include/config/ap/support.h) \ + $(wildcard include/config/opmode/on/ap.h) \ + $(wildcard include/config/opmode/on/sta.h) \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/link_list.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum_def.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa_cmm.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dot11i_wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/ap.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/wpa.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/dfs.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/chlist.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/spectrum.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/eeprom.h \ + /root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/include/rtmp_mcu.h \ + +/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/wpa.o: $(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/wpa.o) + +$(deps_/root/2010_01_28_RT2860_Linux_STA_v2.3.0.0_Alpha_v2/os/linux/../../sta/wpa.o): diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/assoc.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/assoc.c new file mode 100644 index 000000000..4ab061541 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/assoc.c @@ -0,0 +1,1784 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + assoc.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John 2004-9-3 porting from RT2500 +*/ +#include "rt_config.h" + +UCHAR CipherWpaTemplate[] = { + 0xdd, // WPA IE + 0x16, // Length + 0x00, 0x50, 0xf2, 0x01, // oui + 0x01, 0x00, // Version + 0x00, 0x50, 0xf2, 0x02, // Multicast + 0x01, 0x00, // Number of unicast + 0x00, 0x50, 0xf2, 0x02, // unicast + 0x01, 0x00, // number of authentication method + 0x00, 0x50, 0xf2, 0x01 // authentication + }; + +UCHAR CipherWpa2Template[] = { + 0x30, // RSN IE + 0x14, // Length + 0x01, 0x00, // Version + 0x00, 0x0f, 0xac, 0x02, // group cipher, TKIP + 0x01, 0x00, // number of pairwise + 0x00, 0x0f, 0xac, 0x02, // unicast + 0x01, 0x00, // number of authentication method + 0x00, 0x0f, 0xac, 0x02, // authentication + 0x00, 0x00, // RSN capability + }; + +/* + ========================================================================== + Description: + association state machine init, including state transition and timer init + Parameters: + S - pointer to the association state machine + + IRQL = PASSIVE_LEVEL + + ========================================================================== + */ +VOID AssocStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + OUT STATE_MACHINE_FUNC Trans[]) +{ + StateMachineInit(S, Trans, MAX_ASSOC_STATE, MAX_ASSOC_MSG, (STATE_MACHINE_FUNC)Drop, ASSOC_IDLE, ASSOC_MACHINE_BASE); + + // first column + StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)MlmeAssocReqAction); + StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_REASSOC_REQ, (STATE_MACHINE_FUNC)MlmeReassocReqAction); + StateMachineSetAction(S, ASSOC_IDLE, MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)MlmeDisassocReqAction); + StateMachineSetAction(S, ASSOC_IDLE, MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)PeerDisassocAction); + + // second column + StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAssoc); + StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenReassoc); + StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenDisassociate); + StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)PeerDisassocAction); + StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP, (STATE_MACHINE_FUNC)PeerAssocRspAction); + // + // Patch 3Com AP MOde:3CRWE454G72 + // We send Assoc request frame to this AP, it always send Reassoc Rsp not Associate Rsp. + // + StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP, (STATE_MACHINE_FUNC)PeerAssocRspAction); + StateMachineSetAction(S, ASSOC_WAIT_RSP, MT2_ASSOC_TIMEOUT, (STATE_MACHINE_FUNC)AssocTimeoutAction); + + // third column + StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAssoc); + StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenReassoc); + StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenDisassociate); + StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)PeerDisassocAction); + StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_REASSOC_RSP, (STATE_MACHINE_FUNC)PeerReassocRspAction); + // + // Patch, AP doesn't send Reassociate Rsp frame to Station. + // + StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_PEER_ASSOC_RSP, (STATE_MACHINE_FUNC)PeerReassocRspAction); + StateMachineSetAction(S, REASSOC_WAIT_RSP, MT2_REASSOC_TIMEOUT, (STATE_MACHINE_FUNC)ReassocTimeoutAction); + + // fourth column + StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_ASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAssoc); + StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_REASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenReassoc); + StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_MLME_DISASSOC_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenDisassociate); + StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_PEER_DISASSOC_REQ, (STATE_MACHINE_FUNC)PeerDisassocAction); + StateMachineSetAction(S, DISASSOC_WAIT_RSP, MT2_DISASSOC_TIMEOUT, (STATE_MACHINE_FUNC)DisassocTimeoutAction); + + // initialize the timer + RTMPInitTimer(pAd, &pAd->MlmeAux.AssocTimer, GET_TIMER_FUNCTION(AssocTimeout), pAd, FALSE); + RTMPInitTimer(pAd, &pAd->MlmeAux.ReassocTimer, GET_TIMER_FUNCTION(ReassocTimeout), pAd, FALSE); + RTMPInitTimer(pAd, &pAd->MlmeAux.DisassocTimer, GET_TIMER_FUNCTION(DisassocTimeout), pAd, FALSE); +} + +/* + ========================================================================== + Description: + Association timeout procedure. After association timeout, this function + will be called and it will put a message into the MLME queue + Parameters: + Standard timer parameters + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AssocTimeout(IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_ASSOC_TIMEOUT, 0, NULL, 0); + RTMP_MLME_HANDLER(pAd); +} + +/* + ========================================================================== + Description: + Reassociation timeout procedure. After reassociation timeout, this + function will be called and put a message into the MLME queue + Parameters: + Standard timer parameters + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID ReassocTimeout(IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_REASSOC_TIMEOUT, 0, NULL, 0); + RTMP_MLME_HANDLER(pAd); +} + +/* + ========================================================================== + Description: + Disassociation timeout procedure. After disassociation timeout, this + function will be called and put a message into the MLME queue + Parameters: + Standard timer parameters + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID DisassocTimeout(IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_DISASSOC_TIMEOUT, 0, NULL, 0); + RTMP_MLME_HANDLER(pAd); +} + +/* + ========================================================================== + Description: + mlme assoc req handling procedure + Parameters: + Adapter - Adapter pointer + Elem - MLME Queue Element + Pre: + the station has been authenticated and the following information is stored in the config + -# SSID + -# supported rates and their length + -# listen interval (Adapter->StaCfg.default_listen_count) + -# Transmit power (Adapter->StaCfg.tx_power) + Post : + -# An association request frame is generated and sent to the air + -# Association timer starts + -# Association state -> ASSOC_WAIT_RSP + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeAssocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR ApAddr[6]; + HEADER_802_11 AssocHdr; + UCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; + USHORT ListenIntv; + ULONG Timeout; + USHORT CapabilityInfo; + BOOLEAN TimerCancelled; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + ULONG tmp; + USHORT VarIesOffset = 0; + USHORT Status; + + // Block all authentication request durning WPA block period + if (pAd->StaCfg.bBlockAssoc == TRUE) + { + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Block Assoc request durning WPA block period!\n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status, 0); + } + // check sanity first + else if (MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv)) + { + RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled); + COPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr); + + // Get an unused nonpaged memory + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeAssocReqAction() allocate memory failed \n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_FAIL_NO_RESOURCE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status, 0); + return; + } + + // Add by James 03/06/27 + pAd->StaCfg.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + // Association don't need to report MAC address + pAd->StaCfg.AssocInfo.AvailableRequestFixedIEs = + NDIS_802_11_AI_REQFI_CAPABILITIES | NDIS_802_11_AI_REQFI_LISTENINTERVAL; + pAd->StaCfg.AssocInfo.RequestFixedIEs.Capabilities = CapabilityInfo; + pAd->StaCfg.AssocInfo.RequestFixedIEs.ListenInterval = ListenIntv; + // Only reassociate need this + //COPY_MAC_ADDR(pAd->StaCfg.AssocInfo.RequestFixedIEs.CurrentAPAddress, ApAddr); + pAd->StaCfg.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + + NdisZeroMemory(pAd->StaCfg.ReqVarIEs, MAX_VIE_LEN); + // First add SSID + VarIesOffset = 0; + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SsidIe, 1); + VarIesOffset += 1; + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->MlmeAux.SsidLen, 1); + VarIesOffset += 1; + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); + VarIesOffset += pAd->MlmeAux.SsidLen; + + // Second add Supported rates + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &SupRateIe, 1); + VarIesOffset += 1; + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->MlmeAux.SupRateLen, 1); + VarIesOffset += 1; + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->MlmeAux.SupRate, pAd->MlmeAux.SupRateLen); + VarIesOffset += pAd->MlmeAux.SupRateLen; + // End Add by James + + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send ASSOC request...\n")); + MgtMacHeaderInit(pAd, &AssocHdr, SUBTYPE_ASSOC_REQ, 0, ApAddr, ApAddr); + + // Build basic frame first + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &AssocHdr, + 2, &CapabilityInfo, + 2, &ListenIntv, + 1, &SsidIe, + 1, &pAd->MlmeAux.SsidLen, + pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid, + 1, &SupRateIe, + 1, &pAd->MlmeAux.SupRateLen, + pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate, + END_OF_ARGS); + + if (pAd->MlmeAux.ExtRateLen != 0) + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &ExtRateIe, + 1, &pAd->MlmeAux.ExtRateLen, + pAd->MlmeAux.ExtRateLen, pAd->MlmeAux.ExtRate, + END_OF_ARGS); + FrameLen += tmp; + } + + +#ifdef DOT11_N_SUPPORT + // HT + if ((pAd->MlmeAux.HtCapabilityLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + { + ULONG TmpLen; + UCHAR HtLen; + UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; + PHT_CAPABILITY_IE pHtCapability; +#ifdef RT_BIG_ENDIAN + HT_CAPABILITY_IE HtCapabilityTmp; + NdisZeroMemory(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE)); + NdisMoveMemory(&HtCapabilityTmp, &pAd->MlmeAux.HtCapability, pAd->MlmeAux.HtCapabilityLen); + *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); + *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); + pHtCapability = &HtCapabilityTmp; +#else + pHtCapability = &pAd->MlmeAux.HtCapability; +#endif + + if (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) + { + HtLen = SIZE_HT_CAP_IE + 4; + MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, + 1, &WpaIe, + 1, &HtLen, + 4, &BROADCOM[0], + pAd->MlmeAux.HtCapabilityLen, pHtCapability, + END_OF_ARGS); + } + else + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, + 1, &HtCapIe, + 1, &pAd->MlmeAux.HtCapabilityLen, + pAd->MlmeAux.HtCapabilityLen, pHtCapability, + END_OF_ARGS); + } + FrameLen += TmpLen; + } +#endif // DOT11_N_SUPPORT // + +#if defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) + // TODO: How to integrate the DRAFT3 and DOT11V_WNM_SUPPORT??? + { + ULONG TmpLen; + EXT_CAP_INFO_ELEMENT extCapInfo; + UCHAR ExtCapIe[3] = {IE_EXT_CAPABILITY, 1, 0x01}; + + + NdisZeroMemory(&extCapInfo, sizeof(EXT_CAP_INFO_ELEMENT)); +#ifdef DOT11N_DRAFT3 + if (pAd->CommonCfg.bBssCoexEnable == TRUE) + extCapInfo.BssCoexistMgmtSupport = 1; +#endif // DOT11N_DRAFT3 // + + NdisMoveMemory(&ExtCapIe[2], &extCapInfo, sizeof(EXT_CAP_INFO_ELEMENT)); + MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, + sizeof(ExtCapIe), ExtCapIe, + END_OF_ARGS); + FrameLen += TmpLen; + } +#endif // defined(DOT11N_DRAFT3) || defined(DOT11V_WNM_SUPPORT) // + + // add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION + // Case I: (Aggregation + Piggy-Back) + // 1. user enable aggregation, AND + // 2. Mac support piggy-back + // 3. AP annouces it's PIGGY-BACK+AGGREGATION-capable in BEACON + // Case II: (Aggregation) + // 1. user enable aggregation, AND + // 2. AP annouces it's AGGREGATION-capable in BEACON + if (pAd->CommonCfg.bAggregationCapable) + { + if ((pAd->CommonCfg.bPiggyBackCapable) && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) + { + ULONG TmpLen; + UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00}; + MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, + 9, RalinkIe, + END_OF_ARGS); + FrameLen += TmpLen; + } + else if (pAd->MlmeAux.APRalinkIe & 0x00000001) + { + ULONG TmpLen; + UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00}; + MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, + 9, RalinkIe, + END_OF_ARGS); + FrameLen += TmpLen; + } + } + else + { + ULONG TmpLen; + UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x06, 0x00, 0x00, 0x00}; + MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, + 9, RalinkIe, + END_OF_ARGS); + FrameLen += TmpLen; + } + + if (pAd->MlmeAux.APEdcaParm.bValid) + { + if (pAd->CommonCfg.bAPSDCapable && pAd->MlmeAux.APEdcaParm.bAPSDCapable) + { + QBSS_STA_INFO_PARM QosInfo; + + NdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM)); + QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE; + QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK; + QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI; + QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO; + QosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength; + WmeIe[8] |= *(PUCHAR)&QosInfo; + } + else + { + // The Parameter Set Count is set to ��0�� in the association request frames + // WmeIe[8] |= (pAd->MlmeAux.APEdcaParm.EdcaUpdateCount & 0x0f); + } + + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 9, &WmeIe[0], + END_OF_ARGS); + FrameLen += tmp; + } + + // + // Let WPA(#221) Element ID on the end of this association frame. + // Otherwise some AP will fail on parsing Element ID and set status fail on Assoc Rsp. + // For example: Put Vendor Specific IE on the front of WPA IE. + // This happens on AP (Model No:Linksys WRK54G) + // + if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) + ) + ) + { + UCHAR RSNIe = IE_WPA; + + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2)) + { + RSNIe = IE_WPA2; + } + +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE) +#endif // WPA_SUPPLICANT_SUPPORT // + RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0); + + // Check for WPA PMK cache list + if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) + { + INT idx; + BOOLEAN FoundPMK = FALSE; + // Search chched PMKID, append it if existed + for (idx = 0; idx < PMKID_NO; idx++) + { + if (NdisEqualMemory(ApAddr, &pAd->StaCfg.SavedPMK[idx].BSSID, 6)) + { + FoundPMK = TRUE; + break; + } + } + +#ifdef WPA_SUPPLICANT_SUPPORT + /* + When AuthMode is WPA2-Enterprise and AP reboot or STA lost AP, + AP would not do PMK cache with STA after STA re-connect to AP again. + In this case, driver doesn't need to send PMKID to AP and WpaSupplicant. + */ + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) && + (NdisEqualMemory(pAd->MlmeAux.Bssid, pAd->CommonCfg.LastBssid, MAC_ADDR_LEN))) + { + FoundPMK = FALSE; + } +#endif // WPA_SUPPLICANT_SUPPORT // + + if (FoundPMK) + { + // Set PMK number + *(PUSHORT) &pAd->StaCfg.RSN_IE[pAd->StaCfg.RSNIE_Len] = 1; + NdisMoveMemory(&pAd->StaCfg.RSN_IE[pAd->StaCfg.RSNIE_Len + 2], &pAd->StaCfg.SavedPMK[idx].PMKID, 16); + pAd->StaCfg.RSNIE_Len += 18; + } + } + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifdef SIOCSIWGENIE + if ((pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE) && + (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == TRUE)) + { + ; + } + else +#endif +#endif // WPA_SUPPLICANT_SUPPORT // + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &RSNIe, + 1, &pAd->StaCfg.RSNIE_Len, + pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE, + END_OF_ARGS); + FrameLen += tmp; + } + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifdef SIOCSIWGENIE + if (((pAd->StaCfg.WpaSupplicantUP & 0x7F) != WPA_SUPPLICANT_ENABLE) || + (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE)) +#endif +#endif // WPA_SUPPLICANT_SUPPORT // + { + // Append Variable IE + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1); + VarIesOffset += 1; + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &pAd->StaCfg.RSNIE_Len, 1); + VarIesOffset += 1; + + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->StaCfg.RSN_IE, pAd->StaCfg.RSNIE_Len); + VarIesOffset += pAd->StaCfg.RSNIE_Len; + + // Set Variable IEs Length + pAd->StaCfg.ReqVarIELen = VarIesOffset; + } + } + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifdef SIOCSIWGENIE + if ((pAd->StaCfg.WpaSupplicantUP & WPA_SUPPLICANT_ENABLE) && + (pAd->StaCfg.bRSN_IE_FromWpaSupplicant == TRUE)) + { + ULONG TmpWpaAssocIeLen = 0; + MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpWpaAssocIeLen, + pAd->StaCfg.WpaAssocIeLen, pAd->StaCfg.pWpaAssocIe, + END_OF_ARGS); + + FrameLen += TmpWpaAssocIeLen; + + NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, pAd->StaCfg.pWpaAssocIe, pAd->StaCfg.WpaAssocIeLen); + VarIesOffset += pAd->StaCfg.WpaAssocIeLen; + + // Set Variable IEs Length + pAd->StaCfg.ReqVarIELen = VarIesOffset; + } +#endif +#endif // WPA_SUPPLICANT_SUPPORT // + + + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + RTMPSetTimer(&pAd->MlmeAux.AssocTimer, Timeout); + pAd->Mlme.AssocMachine.CurrState = ASSOC_WAIT_RSP; + } + else + { + DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeAssocReqAction() sanity check failed. BUG!!!!!! \n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_INVALID_FORMAT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status, 0); + } + +} + +/* + ========================================================================== + Description: + mlme reassoc req handling procedure + Parameters: + Elem - + Pre: + -# SSID (Adapter->StaCfg.ssid[]) + -# BSSID (AP address, Adapter->StaCfg.bssid) + -# Supported rates (Adapter->StaCfg.supported_rates[]) + -# Supported rates length (Adapter->StaCfg.supported_rates_len) + -# Tx power (Adapter->StaCfg.tx_power) + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeReassocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR ApAddr[6]; + HEADER_802_11 ReassocHdr; + UCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00}; + USHORT CapabilityInfo, ListenIntv; + ULONG Timeout; + ULONG FrameLen = 0; + BOOLEAN TimerCancelled; + NDIS_STATUS NStatus; + ULONG tmp; + PUCHAR pOutBuffer = NULL; + USHORT Status; + + // Block all authentication request durning WPA block period + if (pAd->StaCfg.bBlockAssoc == TRUE) + { + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Block ReAssoc request durning WPA block period!\n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status, 0); + } + // the parameters are the same as the association + else if(MlmeAssocReqSanity(pAd, Elem->Msg, Elem->MsgLen, ApAddr, &CapabilityInfo, &Timeout, &ListenIntv)) + { + RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &TimerCancelled); + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeReassocReqAction() allocate memory failed \n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_FAIL_NO_RESOURCE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status, 0); + return; + } + + COPY_MAC_ADDR(pAd->MlmeAux.Bssid, ApAddr); + + // make frame, use bssid as the AP address?? + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send RE-ASSOC request...\n")); + MgtMacHeaderInit(pAd, &ReassocHdr, SUBTYPE_REASSOC_REQ, 0, ApAddr, ApAddr); + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &ReassocHdr, + 2, &CapabilityInfo, + 2, &ListenIntv, + MAC_ADDR_LEN, ApAddr, + 1, &SsidIe, + 1, &pAd->MlmeAux.SsidLen, + pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid, + 1, &SupRateIe, + 1, &pAd->MlmeAux.SupRateLen, + pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate, + END_OF_ARGS); + + if (pAd->MlmeAux.ExtRateLen != 0) + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &ExtRateIe, + 1, &pAd->MlmeAux.ExtRateLen, + pAd->MlmeAux.ExtRateLen, pAd->MlmeAux.ExtRate, + END_OF_ARGS); + FrameLen += tmp; + } + + + if (pAd->MlmeAux.APEdcaParm.bValid) + { + if (pAd->CommonCfg.bAPSDCapable && pAd->MlmeAux.APEdcaParm.bAPSDCapable) + { + QBSS_STA_INFO_PARM QosInfo; + + NdisZeroMemory(&QosInfo, sizeof(QBSS_STA_INFO_PARM)); + QosInfo.UAPSD_AC_BE = pAd->CommonCfg.bAPSDAC_BE; + QosInfo.UAPSD_AC_BK = pAd->CommonCfg.bAPSDAC_BK; + QosInfo.UAPSD_AC_VI = pAd->CommonCfg.bAPSDAC_VI; + QosInfo.UAPSD_AC_VO = pAd->CommonCfg.bAPSDAC_VO; + QosInfo.MaxSPLength = pAd->CommonCfg.MaxSPLength; + + DBGPRINT(RT_DEBUG_TRACE, + ("uapsd> MaxSPLength = %d!\n", QosInfo.MaxSPLength)); + WmeIe[8] |= *(PUCHAR)&QosInfo; + } + + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 9, &WmeIe[0], + END_OF_ARGS); + FrameLen += tmp; + } + +#ifdef DOT11_N_SUPPORT + // HT + if ((pAd->MlmeAux.HtCapabilityLen > 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + { + ULONG TmpLen; + UCHAR HtLen; + UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; + PHT_CAPABILITY_IE pHtCapability; + +#ifdef RT_BIG_ENDIAN + HT_CAPABILITY_IE HtCapabilityTmp; + NdisZeroMemory(&HtCapabilityTmp, sizeof(HT_CAPABILITY_IE)); + NdisMoveMemory(&HtCapabilityTmp, &pAd->MlmeAux.HtCapability, pAd->MlmeAux.HtCapabilityLen); + *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); + *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); + pHtCapability = &HtCapabilityTmp; +#else + pHtCapability = &pAd->MlmeAux.HtCapability; +#endif + + if (pAd->StaActive.SupportedPhyInfo.bPreNHt == TRUE) + { + HtLen = SIZE_HT_CAP_IE + 4; + MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, + 1, &WpaIe, + 1, &HtLen, + 4, &BROADCOM[0], + pAd->MlmeAux.HtCapabilityLen, pHtCapability, + END_OF_ARGS); + } + else + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, + 1, &HtCapIe, + 1, &pAd->MlmeAux.HtCapabilityLen, + pAd->MlmeAux.HtCapabilityLen, pHtCapability, + END_OF_ARGS); + } + FrameLen += TmpLen; + } +#endif // DOT11_N_SUPPORT // + + + // add Ralink proprietary IE to inform AP this STA is going to use AGGREGATION or PIGGY-BACK+AGGREGATION + // Case I: (Aggregation + Piggy-Back) + // 1. user enable aggregation, AND + // 2. Mac support piggy-back + // 3. AP annouces it's PIGGY-BACK+AGGREGATION-capable in BEACON + // Case II: (Aggregation) + // 1. user enable aggregation, AND + // 2. AP annouces it's AGGREGATION-capable in BEACON + if (pAd->CommonCfg.bAggregationCapable) + { + if ((pAd->CommonCfg.bPiggyBackCapable) && ((pAd->MlmeAux.APRalinkIe & 0x00000003) == 3)) + { + ULONG TmpLen; + UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x03, 0x00, 0x00, 0x00}; + MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, + 9, RalinkIe, + END_OF_ARGS); + FrameLen += TmpLen; + } + else if (pAd->MlmeAux.APRalinkIe & 0x00000001) + { + ULONG TmpLen; + UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x01, 0x00, 0x00, 0x00}; + MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, + 9, RalinkIe, + END_OF_ARGS); + FrameLen += TmpLen; + } + } + else + { + ULONG TmpLen; + UCHAR RalinkIe[9] = {IE_VENDOR_SPECIFIC, 7, 0x00, 0x0c, 0x43, 0x04, 0x00, 0x00, 0x00}; + MakeOutgoingFrame(pOutBuffer+FrameLen, &TmpLen, + 9, RalinkIe, + END_OF_ARGS); + FrameLen += TmpLen; + } + + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + RTMPSetTimer(&pAd->MlmeAux.ReassocTimer, Timeout*2); /* in mSec */ + pAd->Mlme.AssocMachine.CurrState = REASSOC_WAIT_RSP; + } + else + { + DBGPRINT(RT_DEBUG_TRACE,("ASSOC - MlmeReassocReqAction() sanity check failed. BUG!!!! \n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_INVALID_FORMAT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status, 0); + } +} + +/* + ========================================================================== + Description: + Upper layer issues disassoc request + Parameters: + Elem - + + IRQL = PASSIVE_LEVEL + + ========================================================================== + */ +VOID MlmeDisassocReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PMLME_DISASSOC_REQ_STRUCT pDisassocReq; + HEADER_802_11 DisassocHdr; + PHEADER_802_11 pDisassocHdr; + PUCHAR pOutBuffer = NULL; + ULONG FrameLen = 0; + NDIS_STATUS NStatus; + BOOLEAN TimerCancelled; + ULONG Timeout = 500; + USHORT Status; + +#ifdef QOS_DLS_SUPPORT + // send DLS-TEAR_DOWN message, + if (pAd->CommonCfg.bDLSCapable) + { + UCHAR i; + + // tear down local dls table entry + for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + } + } + + // tear down peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + } + } + } +#endif // QOS_DLS_SUPPORT // + + + // skip sanity check + pDisassocReq = (PMLME_DISASSOC_REQ_STRUCT)(Elem->Msg); + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - MlmeDisassocReqAction() allocate memory failed\n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_FAIL_NO_RESOURCE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status, 0); + return; + } + + + + + RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &TimerCancelled); + + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Send DISASSOC request[BSSID::%02x:%02x:%02x:%02x:%02x:%02x (Reason=%d)\n", + pDisassocReq->Addr[0], pDisassocReq->Addr[1], pDisassocReq->Addr[2], + pDisassocReq->Addr[3], pDisassocReq->Addr[4], pDisassocReq->Addr[5], pDisassocReq->Reason)); + MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pDisassocReq->Addr, pDisassocReq->Addr); // patch peap ttls switching issue + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11),&DisassocHdr, + 2, &pDisassocReq->Reason, + END_OF_ARGS); + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + + // To patch Instance and Buffalo(N) AP + // Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine + // Therefore, we send both of them. + pDisassocHdr = (PHEADER_802_11)pOutBuffer; + pDisassocHdr->FC.SubType = SUBTYPE_DEAUTH; + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + + MlmeFreeMemory(pAd, pOutBuffer); + + pAd->StaCfg.DisassocReason = REASON_DISASSOC_STA_LEAVING; + COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pDisassocReq->Addr); + + RTMPSetTimer(&pAd->MlmeAux.DisassocTimer, Timeout); /* in mSec */ + pAd->Mlme.AssocMachine.CurrState = DISASSOC_WAIT_RSP; + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) + { + //send disassociate event to wpa_supplicant + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_DISASSOC_EVENT_FLAG, NULL, NULL, 0); + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + + RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, NULL, BSS0, 0); + +} + +/* + ========================================================================== + Description: + peer sends assoc rsp back + Parameters: + Elme - MLME message containing the received frame + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerAssocRspAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT CapabilityInfo, Status, Aid; + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; + UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; + UCHAR Addr2[MAC_ADDR_LEN]; + BOOLEAN TimerCancelled; + UCHAR CkipFlag; + EDCA_PARM EdcaParm; + HT_CAPABILITY_IE HtCapability; + ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE + UCHAR HtCapabilityLen = 0; + UCHAR AddHtInfoLen; + UCHAR NewExtChannelOffset = 0xff; + EXT_CAP_INFO_ELEMENT ExtCapInfo; + + + if (PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, + Addr2, &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, + ExtRate, &ExtRateLen, &HtCapability,&AddHtInfo, &HtCapabilityLen, + &AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, + &ExtCapInfo, + &CkipFlag)) + { + // The frame is for me ? + if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status)); +#ifdef DOT11_N_SUPPORT + DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():MacTable [%d].AMsduSize = %d. ClientStatusFlags = 0x%lx \n",Elem->Wcid, pAd->MacTab.Content[BSSID_WCID].AMsduSize, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags)); +#endif // DOT11_N_SUPPORT // + RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled); + + + + if(Status == MLME_SUCCESS) + { + UCHAR MaxSupportedRateIn500Kbps = 0; + UCHAR idx; + + // supported rates array may not be sorted. sort it and find the maximum rate + for (idx=0; idx<SupRateLen; idx++) + { + if (MaxSupportedRateIn500Kbps < (SupRate[idx] & 0x7f)) + MaxSupportedRateIn500Kbps = SupRate[idx] & 0x7f; + } + + for (idx=0; idx<ExtRateLen; idx++) + { + if (MaxSupportedRateIn500Kbps < (ExtRate[idx] & 0x7f)) + MaxSupportedRateIn500Kbps = ExtRate[idx] & 0x7f; + } + // go to procedure listed on page 376 + AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen, + &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); + + StaAddMacTableEntry(pAd, + &pAd->MacTab.Content[BSSID_WCID], + MaxSupportedRateIn500Kbps, + &HtCapability, + HtCapabilityLen, + &AddHtInfo, + AddHtInfoLen, + CapabilityInfo); + } + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status, 0); + +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT +{ + PFRAME_802_11 pFrame = (PFRAME_802_11)(Elem->Msg); + RTEnqueueInternalCmd(pAd, CMDTHREAD_CONNECT_RESULT_INFORM, + &pFrame->Octet[6], + Elem->MsgLen - 6 - sizeof(HEADER_802_11)); +} +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + } + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerAssocRspAction() sanity check fail\n")); + } +} + +/* + ========================================================================== + Description: + peer sends reassoc rsp + Parametrs: + Elem - MLME message cntaining the received frame + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerReassocRspAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT CapabilityInfo; + USHORT Status; + USHORT Aid; + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], SupRateLen; + UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRateLen; + UCHAR Addr2[MAC_ADDR_LEN]; + UCHAR CkipFlag; + BOOLEAN TimerCancelled; + EDCA_PARM EdcaParm; + HT_CAPABILITY_IE HtCapability; + ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE + UCHAR HtCapabilityLen; + UCHAR AddHtInfoLen; + UCHAR NewExtChannelOffset = 0xff; + EXT_CAP_INFO_ELEMENT ExtCapInfo; + + + if (PeerAssocRspSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, + &CapabilityInfo, &Status, &Aid, SupRate, &SupRateLen, ExtRate, &ExtRateLen, + &HtCapability, &AddHtInfo, &HtCapabilityLen, &AddHtInfoLen,&NewExtChannelOffset, &EdcaParm, + &ExtCapInfo, + &CkipFlag)) + { + if(MAC_ADDR_EQUAL(Addr2, pAd->MlmeAux.Bssid)) // The frame is for me ? + { + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - receive REASSOC_RSP to me (status=%d)\n", Status)); + RTMPCancelTimer(&pAd->MlmeAux.ReassocTimer, &TimerCancelled); + + if(Status == MLME_SUCCESS) + { + // go to procedure listed on page 376 + AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen, + &EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo); + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) + { + SendAssocIEsToWpaSupplicant(pAd); + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_ASSOC_EVENT_FLAG, NULL, NULL, 0); + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + { + wext_notify_event_assoc(pAd); + RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, &pAd->MlmeAux.Bssid[0], NULL, 0); + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + + } + + + // CkipFlag is no use for reassociate + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status, 0); + } + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerReassocRspAction() sanity check fail\n")); + } + +} + +/* + ========================================================================== + Description: + procedures on IEEE 802.11/1999 p.376 + Parametrs: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AssocPostProc( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr2, + IN USHORT CapabilityInfo, + IN USHORT Aid, + IN UCHAR SupRate[], + IN UCHAR SupRateLen, + IN UCHAR ExtRate[], + IN UCHAR ExtRateLen, + IN PEDCA_PARM pEdcaParm, + IN HT_CAPABILITY_IE *pHtCapability, + IN UCHAR HtCapabilityLen, + IN ADD_HT_INFO_IE *pAddHtInfo) // AP might use this additional ht info IE +{ + ULONG Idx; + + pAd->MlmeAux.BssType = BSS_INFRA; + COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pAddr2); + pAd->MlmeAux.Aid = Aid; + pAd->MlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; + +#ifdef DOT11_N_SUPPORT + // Some HT AP might lost WMM IE. We add WMM ourselves. beacuase HT requires QoS on. + if ((HtCapabilityLen > 0) && (pEdcaParm->bValid == FALSE)) + { + pEdcaParm->bValid = TRUE; + pEdcaParm->Aifsn[0] = 3; + pEdcaParm->Aifsn[1] = 7; + pEdcaParm->Aifsn[2] = 2; + pEdcaParm->Aifsn[3] = 2; + + pEdcaParm->Cwmin[0] = 4; + pEdcaParm->Cwmin[1] = 4; + pEdcaParm->Cwmin[2] = 3; + pEdcaParm->Cwmin[3] = 2; + + pEdcaParm->Cwmax[0] = 10; + pEdcaParm->Cwmax[1] = 10; + pEdcaParm->Cwmax[2] = 4; + pEdcaParm->Cwmax[3] = 3; + + pEdcaParm->Txop[0] = 0; + pEdcaParm->Txop[1] = 0; + pEdcaParm->Txop[2] = 96; + pEdcaParm->Txop[3] = 48; + + } +#endif // DOT11_N_SUPPORT // + + NdisMoveMemory(&pAd->MlmeAux.APEdcaParm, pEdcaParm, sizeof(EDCA_PARM)); + + // filter out un-supported rates + pAd->MlmeAux.SupRateLen = SupRateLen; + NdisMoveMemory(pAd->MlmeAux.SupRate, SupRate, SupRateLen); + RTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen); + + // filter out un-supported rates + pAd->MlmeAux.ExtRateLen = ExtRateLen; + NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen); + RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen); + +#ifdef DOT11_N_SUPPORT + if (HtCapabilityLen > 0) + { + RTMPCheckHt(pAd, BSSID_WCID, pHtCapability, pAddHtInfo); + } + DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> AP.AMsduSize = %d. ClientStatusFlags = 0x%lx \n", pAd->MacTab.Content[BSSID_WCID].AMsduSize, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags)); + + DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> (Mmps=%d, AmsduSize=%d, )\n", + pAd->MacTab.Content[BSSID_WCID].MmpsMode, pAd->MacTab.Content[BSSID_WCID].AMsduSize)); +#endif // DOT11_N_SUPPORT // + + // Set New WPA information + Idx = BssTableSearch(&pAd->ScanTab, pAddr2, pAd->MlmeAux.Channel); + if (Idx == BSS_NOT_FOUND) + { + DBGPRINT_ERR(("ASSOC - Can't find BSS after receiving Assoc response\n")); + } + else + { + // Init variable + pAd->MacTab.Content[BSSID_WCID].RSNIE_Len = 0; + NdisZeroMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, MAX_LEN_OF_RSNIE); + + // Store appropriate RSN_IE for WPA SM negotiation later + if ((pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) && (pAd->ScanTab.BssEntry[Idx].VarIELen != 0)) + { + PUCHAR pVIE; + USHORT len; + PEID_STRUCT pEid; + + pVIE = pAd->ScanTab.BssEntry[Idx].VarIEs; + len = pAd->ScanTab.BssEntry[Idx].VarIELen; + + +#ifdef PCIE_PS_SUPPORT + // Don't allow to go to sleep mode if authmode is WPA-related. + //This can make Authentication process more smoothly. + RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); +#endif // PCIE_PS_SUPPORT // + while (len > 0) + { + pEid = (PEID_STRUCT) pVIE; + // For WPA/WPAPSK + if ((pEid->Eid == IE_WPA) && (NdisEqualMemory(pEid->Octet, WPA_OUI, 4)) + && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA || pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) + { + NdisMoveMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, pVIE, (pEid->Len + 2)); + pAd->MacTab.Content[BSSID_WCID].RSNIE_Len = (pEid->Len + 2); + DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> Store RSN_IE for WPA SM negotiation \n")); + } + // For WPA2/WPA2PSK + else if ((pEid->Eid == IE_RSN) && (NdisEqualMemory(pEid->Octet + 2, RSN_OUI, 3)) + && (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2 || pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + NdisMoveMemory(pAd->MacTab.Content[BSSID_WCID].RSN_IE, pVIE, (pEid->Len + 2)); + pAd->MacTab.Content[BSSID_WCID].RSNIE_Len = (pEid->Len + 2); + DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> Store RSN_IE for WPA2 SM negotiation \n")); + } + + pVIE += (pEid->Len + 2); + len -= (pEid->Len + 2); + } + + + } + + if (pAd->MacTab.Content[BSSID_WCID].RSNIE_Len == 0) + { + DBGPRINT(RT_DEBUG_TRACE, ("AssocPostProc===> no RSN_IE \n")); + } + else + { + hex_dump("RSN_IE", pAd->MacTab.Content[BSSID_WCID].RSN_IE, pAd->MacTab.Content[BSSID_WCID].RSNIE_Len); + } + } +} + +/* + ========================================================================== + Description: + left part of IEEE 802.11/1999 p.374 + Parameters: + Elem - MLME message containing the received frame + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerDisassocAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Addr2[MAC_ADDR_LEN]; + USHORT Reason; + + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerDisassocAction()\n")); + if(PeerDisassocSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason)) + { + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerDisassocAction() Reason = %d\n", Reason)); + if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, Addr2)) + { + + RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, NULL, BSS0, 0); + + + + /* + It is possible that AP sends dis-assoc frame(PeerDisassocAction) to STA + after driver enqueue MT2_MLME_DISASSOC_REQ (MlmeDisassocReqAction) + and set CntlMachine.CurrState = CNTL_WAIT_DISASSOC. + DisassocTimer is useless because AssocMachine.CurrState will set to ASSOC_IDLE here. + Therefore, we need to check CntlMachine.CurrState here and enqueue MT2_DISASSOC_CONF to + reset CntlMachine.CurrState to CNTL_IDLE state again. + */ + if (pAd->Mlme.CntlMachine.CurrState == CNTL_WAIT_DISASSOC) + { + USHORT Status; + Status = MLME_SUCCESS; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status, 0); + } + else + LinkDown(pAd, TRUE); + + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) + { + //send disassociate event to wpa_supplicant + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_DISASSOC_EVENT_FLAG, NULL, NULL, 0); + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + } + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerDisassocAction() sanity check fail\n")); + } + +} + +/* + ========================================================================== + Description: + what the state machine will do after assoc timeout + Parameters: + Elme - + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AssocTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - AssocTimeoutAction\n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_REJ_TIMEOUT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + what the state machine will do after reassoc timeout + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID ReassocTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - ReassocTimeoutAction\n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_REJ_TIMEOUT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + what the state machine will do after disassoc timeout + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID DisassocTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - DisassocTimeoutAction\n")); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_SUCCESS; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status, 0); +} + +VOID InvalidStateWhenAssoc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenAssoc(state=%ld), reset ASSOC state machine\n", + pAd->Mlme.AssocMachine.CurrState)); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status, 0); +} + +VOID InvalidStateWhenReassoc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenReassoc(state=%ld), reset ASSOC state machine\n", + pAd->Mlme.AssocMachine.CurrState)); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status, 0); +} + +VOID InvalidStateWhenDisassociate( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - InvalidStateWhenDisassoc(state=%ld), reset ASSOC state machine\n", + pAd->Mlme.AssocMachine.CurrState)); + pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DISASSOC_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + right part of IEEE 802.11/1999 page 374 + Note: + This event should never cause ASSOC state machine perform state + transition, and has no relationship with CNTL machine. So we separate + this routine as a service outside of ASSOC state transition table. + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID Cls3errAction( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr) +{ + HEADER_802_11 DisassocHdr; + PHEADER_802_11 pDisassocHdr; + PUCHAR pOutBuffer = NULL; + ULONG FrameLen = 0; + NDIS_STATUS NStatus; + USHORT Reason = REASON_CLS3ERR; + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + return; + + DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - Class 3 Error, Send DISASSOC frame\n")); + MgtMacHeaderInit(pAd, &DisassocHdr, SUBTYPE_DISASSOC, 0, pAddr, pAd->CommonCfg.Bssid); // patch peap ttls switching issue + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11),&DisassocHdr, + 2, &Reason, + END_OF_ARGS); + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + + // To patch Instance and Buffalo(N) AP + // Driver has to send deauth to Instance AP, but Buffalo(N) needs to send disassoc to reset Authenticator's state machine + // Therefore, we send both of them. + pDisassocHdr = (PHEADER_802_11)pOutBuffer; + pDisassocHdr->FC.SubType = SUBTYPE_DEAUTH; + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + + MlmeFreeMemory(pAd, pOutBuffer); + + pAd->StaCfg.DisassocReason = REASON_CLS3ERR; + COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pAddr); +} + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT +VOID SendAssocIEsToWpaSupplicant( + IN PRTMP_ADAPTER pAd) +{ + STRING custom[IW_CUSTOM_MAX] = {0}; + + if ((pAd->StaCfg.ReqVarIELen + 17) <= IW_CUSTOM_MAX) + { + sprintf(custom, "ASSOCINFO_ReqIEs="); + NdisMoveMemory(custom+17, pAd->StaCfg.ReqVarIEs, pAd->StaCfg.ReqVarIELen); + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_REQIE_EVENT_FLAG, NULL, (PUCHAR)custom, pAd->StaCfg.ReqVarIELen + 17); + + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_ASSOCINFO_EVENT_FLAG, NULL, NULL, 0); + } + else + DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaCfg.ReqVarIELen + 17 > MAX_CUSTOM_LEN\n")); + + return; +} +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT +int wext_notify_event_assoc( + IN RTMP_ADAPTER *pAd) +{ + char custom[IW_CUSTOM_MAX] = {0}; + +#if WIRELESS_EXT > 17 + if (pAd->StaCfg.ReqVarIELen <= IW_CUSTOM_MAX) + { + NdisMoveMemory(custom, pAd->StaCfg.ReqVarIEs, pAd->StaCfg.ReqVarIELen); + RtmpOSWrielessEventSend(pAd, IWEVASSOCREQIE, -1, NULL, custom, pAd->StaCfg.ReqVarIELen); + } + else + DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaCfg.ReqVarIELen > MAX_CUSTOM_LEN\n")); +#else + int len; + + len = (pAd->StaCfg.ReqVarIELen*2) + 17; + if (len <= IW_CUSTOM_MAX) + { + UCHAR idx; + sprintf(custom, "ASSOCINFO(ReqIEs="); + for (idx=0; idx<pAd->StaCfg.ReqVarIELen; idx++) + sprintf(custom, "%s%02x", custom, pAd->StaCfg.ReqVarIEs[idx]); + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, -1, NULL, custom, len); + } + else + DBGPRINT(RT_DEBUG_TRACE, ("len(%d) > MAX_CUSTOM_LEN\n", len)); +#endif + + return 0; + +} +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + + +BOOLEAN StaAddMacTableEntry( + IN PRTMP_ADAPTER pAd, + IN PMAC_TABLE_ENTRY pEntry, + IN UCHAR MaxSupportedRateIn500Kbps, + IN HT_CAPABILITY_IE *pHtCapability, + IN UCHAR HtCapabilityLen, + IN ADD_HT_INFO_IE *pAddHtInfo, + IN UCHAR AddHtInfoLen, + IN USHORT CapabilityInfo) +{ + UCHAR MaxSupportedRate = RATE_11; + BOOLEAN bSupportN = FALSE; + + if (!pEntry) + return FALSE; + + if (ADHOC_ON(pAd)) + CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); + + switch (MaxSupportedRateIn500Kbps) + { + case 108: MaxSupportedRate = RATE_54; break; + case 96: MaxSupportedRate = RATE_48; break; + case 72: MaxSupportedRate = RATE_36; break; + case 48: MaxSupportedRate = RATE_24; break; + case 36: MaxSupportedRate = RATE_18; break; + case 24: MaxSupportedRate = RATE_12; break; + case 18: MaxSupportedRate = RATE_9; break; + case 12: MaxSupportedRate = RATE_6; break; + case 22: MaxSupportedRate = RATE_11; break; + case 11: MaxSupportedRate = RATE_5_5; break; + case 4: MaxSupportedRate = RATE_2; break; + case 2: MaxSupportedRate = RATE_1; break; + default: MaxSupportedRate = RATE_11; break; + } + + if ((pAd->CommonCfg.PhyMode == PHY_11G) && (MaxSupportedRate < RATE_FIRST_OFDM_RATE)) + return FALSE; + +#ifdef DOT11_N_SUPPORT + // 11n only + if (((pAd->CommonCfg.PhyMode == PHY_11N_2_4G) || (pAd->CommonCfg.PhyMode == PHY_11N_5G))&& (HtCapabilityLen == 0)) + return FALSE; +#endif // DOT11_N_SUPPORT // + + NdisAcquireSpinLock(&pAd->MacTabLock); + if (pEntry) + { + pEntry->PortSecured = WPA_802_1X_PORT_SECURED; + if ((MaxSupportedRate < RATE_FIRST_OFDM_RATE) || + (pAd->CommonCfg.PhyMode == PHY_11B)) + { + pEntry->RateLen = 4; + if (MaxSupportedRate >= RATE_FIRST_OFDM_RATE) + MaxSupportedRate = RATE_11; + } + else + pEntry->RateLen = 12; + + pEntry->MaxHTPhyMode.word = 0; + pEntry->MinHTPhyMode.word = 0; + pEntry->HTPhyMode.word = 0; + pEntry->MaxSupportedRate = MaxSupportedRate; + if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) + { + pEntry->MaxHTPhyMode.field.MODE = MODE_CCK; + pEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate; + pEntry->MinHTPhyMode.field.MODE = MODE_CCK; + pEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate; + pEntry->HTPhyMode.field.MODE = MODE_CCK; + pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate; + } + else + { + pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM; + pEntry->MaxHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + pEntry->MinHTPhyMode.field.MODE = MODE_OFDM; + pEntry->MinHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + pEntry->HTPhyMode.field.MODE = MODE_OFDM; + pEntry->HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + } + pEntry->CapabilityInfo = CapabilityInfo; + CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE); + CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE); + } + +#ifdef DOT11_N_SUPPORT + NdisZeroMemory(&pEntry->HTCapability, sizeof(pEntry->HTCapability)); + // If this Entry supports 802.11n, upgrade to HT rate. + //if ((HtCapabilityLen != 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + if ((pAd->StaCfg.BssType == BSS_INFRA) && + (HtCapabilityLen != 0) && + (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + bSupportN = TRUE; + if ((pAd->StaCfg.BssType == BSS_ADHOC) && + (pAd->StaCfg.bAdhocN == TRUE) && + (HtCapabilityLen != 0) && + (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + bSupportN = TRUE; + if (bSupportN) + { + UCHAR j, bitmask; //k,bitmask; + CHAR i; + + if (ADHOC_ON(pAd)) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); + if ((pHtCapability->HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF)) + { + pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD; + } + else + { + pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; + pAd->MacTab.fAnyStationNonGF = TRUE; + pAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1; + } + + if ((pHtCapability->HtCapInfo.ChannelWidth) && + (pAd->CommonCfg.DesiredHtPhy.ChannelWidth) && + ((pAd->StaCfg.BssType == BSS_INFRA) || ((pAd->StaCfg.BssType == BSS_ADHOC) && (pAddHtInfo->AddHtInfo.ExtChanOffset == pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset)))) + { + pEntry->MaxHTPhyMode.field.BW= BW_40; + pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(pHtCapability->HtCapInfo.ShortGIfor40)); + } + else + { + pEntry->MaxHTPhyMode.field.BW = BW_20; + pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(pHtCapability->HtCapInfo.ShortGIfor20)); + pAd->MacTab.fAnyStation20Only = TRUE; + } + + // 3*3 + if (pAd->MACVersion >= RALINK_2883_VERSION && pAd->MACVersion < RALINK_3070_VERSION) + pEntry->MaxHTPhyMode.field.TxBF = pAd->CommonCfg.RegTransmitSetting.field.TxBF; + + // find max fixed rate + for (i=23; i>=0; i--) // 3*3 + { + j = i/8; + bitmask = (1<<(i-(j*8))); + if ((pAd->StaCfg.DesiredHtPhyInfo.MCSSet[j] & bitmask) && (pHtCapability->MCSSet[j] & bitmask)) + { + pEntry->MaxHTPhyMode.field.MCS = i; + break; + } + if (i==0) + break; + } + + + if (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) + { + if (pAd->StaCfg.DesiredTransmitSetting.field.MCS == 32) + { + // Fix MCS as HT Duplicated Mode + pEntry->MaxHTPhyMode.field.BW = 1; + pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; + pEntry->MaxHTPhyMode.field.STBC = 0; + pEntry->MaxHTPhyMode.field.ShortGI = 0; + pEntry->MaxHTPhyMode.field.MCS = 32; + } + else if (pEntry->MaxHTPhyMode.field.MCS > pAd->StaCfg.HTPhyMode.field.MCS) + { + // STA supports fixed MCS + pEntry->MaxHTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + } + } + + pEntry->MaxHTPhyMode.field.STBC = (pHtCapability->HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC)); + pEntry->MpduDensity = pHtCapability->HtCapParm.MpduDensity; + pEntry->MaxRAmpduFactor = pHtCapability->HtCapParm.MaxRAmpduFactor; + pEntry->MmpsMode = (UCHAR)pHtCapability->HtCapInfo.MimoPs; + pEntry->AMsduSize = (UCHAR)pHtCapability->HtCapInfo.AMsduSize; + pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; + + if (pAd->CommonCfg.DesiredHtPhy.AmsduEnable && (pAd->CommonCfg.REGBACapability.field.AutoBA == FALSE)) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED); + if (pHtCapability->HtCapInfo.ShortGIfor20) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE); + if (pHtCapability->HtCapInfo.ShortGIfor40) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE); + if (pHtCapability->HtCapInfo.TxSTBC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE); + if (pHtCapability->HtCapInfo.RxSTBC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE); + if (pHtCapability->ExtHtCapInfo.PlusHTC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE); + if (pAd->CommonCfg.bRdg && pHtCapability->ExtHtCapInfo.RDGSupport) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE); + if (pHtCapability->ExtHtCapInfo.MCSFeedback == 0x03) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE); + NdisMoveMemory(&pEntry->HTCapability, pHtCapability, HtCapabilityLen); + } + else + { + pAd->MacTab.fAnyStationIsLegacy = TRUE; + } +#endif // DOT11_N_SUPPORT // + + pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; + pEntry->CurrTxRate = pEntry->MaxSupportedRate; + + // Set asic auto fall back + if (pAd->StaCfg.bAutoTxRateSwitch == TRUE) + { + PUCHAR pTable; + UCHAR TableSize = 0; + + MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &pEntry->CurrTxRateIndex); + pEntry->bAutoTxRateSwitch = TRUE; + } + else + { + pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE; + pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + pEntry->bAutoTxRateSwitch = FALSE; + + // If the legacy mode is set, overwrite the transmit setting of this entry. + RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry); + } + + pEntry->PortSecured = WPA_802_1X_PORT_SECURED; + pEntry->Sst = SST_ASSOC; + pEntry->AuthState = AS_AUTH_OPEN; + pEntry->AuthMode = pAd->StaCfg.AuthMode; + pEntry->WepStatus = pAd->StaCfg.WepStatus; + + NdisReleaseSpinLock(&pAd->MacTabLock); + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP) + { + union iwreq_data wrqu; + + SendAssocIEsToWpaSupplicant(pAd); + memset(&wrqu, 0, sizeof(wrqu)); + wrqu.data.flags = RT_ASSOC_EVENT_FLAG; + wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL); + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + { + union iwreq_data wrqu; + wext_notify_event_assoc(pAd); + + memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN); + memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN); + wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL); + + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + return TRUE; +} + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/auth.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/auth.c new file mode 100644 index 000000000..e3b063436 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/auth.c @@ -0,0 +1,515 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + auth.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John 2004-9-3 porting from RT2500 +*/ +#include "rt_config.h" + +/* + ========================================================================== + Description: + authenticate state machine init, including state transition and timer init + Parameters: + Sm - pointer to the auth state machine + Note: + The state machine looks like this + + AUTH_REQ_IDLE AUTH_WAIT_SEQ2 AUTH_WAIT_SEQ4 + MT2_MLME_AUTH_REQ mlme_auth_req_action invalid_state_when_auth invalid_state_when_auth + MT2_PEER_AUTH_EVEN drop peer_auth_even_at_seq2_action peer_auth_even_at_seq4_action + MT2_AUTH_TIMEOUT Drop auth_timeout_action auth_timeout_action + + IRQL = PASSIVE_LEVEL + + ========================================================================== + */ + +void AuthStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]) +{ + StateMachineInit(Sm, Trans, MAX_AUTH_STATE, MAX_AUTH_MSG, (STATE_MACHINE_FUNC)Drop, AUTH_REQ_IDLE, AUTH_MACHINE_BASE); + + // the first column + StateMachineSetAction(Sm, AUTH_REQ_IDLE, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)MlmeAuthReqAction); + + // the second column + StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAuth); + StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_PEER_AUTH_EVEN, (STATE_MACHINE_FUNC)PeerAuthRspAtSeq2Action); + StateMachineSetAction(Sm, AUTH_WAIT_SEQ2, MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)AuthTimeoutAction); + + // the third column + StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_MLME_AUTH_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenAuth); + StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_PEER_AUTH_EVEN, (STATE_MACHINE_FUNC)PeerAuthRspAtSeq4Action); + StateMachineSetAction(Sm, AUTH_WAIT_SEQ4, MT2_AUTH_TIMEOUT, (STATE_MACHINE_FUNC)AuthTimeoutAction); + + RTMPInitTimer(pAd, &pAd->MlmeAux.AuthTimer, GET_TIMER_FUNCTION(AuthTimeout), pAd, FALSE); +} + +/* + ========================================================================== + Description: + function to be executed at timer thread when auth timer expires + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AuthTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + + DBGPRINT(RT_DEBUG_TRACE,("AUTH - AuthTimeout\n")); + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST)) + return; + + // send a de-auth to reset AP's state machine (Patch AP-Dir635) + if (pAd->Mlme.AuthMachine.CurrState == AUTH_WAIT_SEQ2) + Cls2errAction(pAd, pAd->MlmeAux.Bssid); + + + MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_AUTH_TIMEOUT, 0, NULL, 0); + RTMP_MLME_HANDLER(pAd); +} + + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeAuthReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + if (AUTH_ReqSend(pAd, Elem, &pAd->MlmeAux.AuthTimer, "AUTH", 1, NULL, 0)) + pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ2; + else + { + USHORT Status; + + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status = MLME_INVALID_FORMAT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerAuthRspAtSeq2Action( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Addr2[MAC_ADDR_LEN]; + USHORT Seq, Status, RemoteStatus, Alg; + UCHAR iv_hdr[4]; + UCHAR ChlgText[CIPHER_TEXT_LEN]; + UCHAR CyperChlgText[CIPHER_TEXT_LEN + 8 + 8]; + ULONG c_len = 0; + HEADER_802_11 AuthHdr; + BOOLEAN TimerCancelled; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + USHORT Status2; + UCHAR ChallengeIe = IE_CHALLENGE_TEXT; + UCHAR len_challengeText = CIPHER_TEXT_LEN; + + if (PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, (PCHAR)ChlgText)) + { + if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 2) + { + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Receive AUTH_RSP seq#2 to me (Alg=%d, Status=%d)\n", Alg, Status)); + RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled); + + if (Status == MLME_SUCCESS) + { + // Authentication Mode "LEAP" has allow for CCX 1.X + if (pAd->MlmeAux.Alg == Ndis802_11AuthModeOpen) + { + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); + } + else + { + // 2. shared key, need to be challenged + Seq++; + RemoteStatus = MLME_SUCCESS; + + // Get an unused nonpaged memory + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq2Action() allocate memory fail\n")); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status2 = MLME_FAIL_NO_RESOURCE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status2, 0); + return; + } + + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send AUTH request seq#3...\n")); + MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr2, pAd->MlmeAux.Bssid); + AuthHdr.FC.Wep = 1; + + /* TSC increment */ + INC_TX_TSC(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxTsc, LEN_WEP_TSC); + + /* Construct the 4-bytes WEP IV header */ + RTMPConstructWEPIVHdr(pAd->StaCfg.DefaultKeyId, + pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxTsc, + iv_hdr); + + Alg = cpu2le16(*(USHORT *)&Alg); + Seq = cpu2le16(*(USHORT *)&Seq); + RemoteStatus= cpu2le16(*(USHORT *)&RemoteStatus); + + /* Construct message text */ + MakeOutgoingFrame(CyperChlgText, &c_len, + 2, &Alg, + 2, &Seq, + 2, &RemoteStatus, + 1, &ChallengeIe, + 1, &len_challengeText, + len_challengeText, ChlgText, + END_OF_ARGS); + + if (RTMPSoftEncryptWEP(pAd, + iv_hdr, + &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId], + CyperChlgText, + c_len) == FALSE) + { + MlmeFreeMemory(pAd, pOutBuffer); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status2 = MLME_FAIL_NO_RESOURCE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status2, 0); + return; + } + + /* Update the total length for 4-bytes ICV */ + c_len += LEN_ICV; + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &AuthHdr, + LEN_WEP_IV_HDR, iv_hdr, + c_len, CyperChlgText, + END_OF_ARGS); + + + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + RTMPSetTimer(&pAd->MlmeAux.AuthTimer, AUTH_TIMEOUT); + pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ4; + } + } + else + { + pAd->StaCfg.AuthFailReason = Status; + COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); + } + } + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthSanity() sanity check fail\n")); + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerAuthRspAtSeq4Action( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Addr2[MAC_ADDR_LEN]; + USHORT Alg, Seq, Status; + CHAR ChlgText[CIPHER_TEXT_LEN]; + BOOLEAN TimerCancelled; + + if(PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText)) + { + if(MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 4) + { + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Receive AUTH_RSP seq#4 to me\n")); + RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled); + + if (Status != MLME_SUCCESS) + { + pAd->StaCfg.AuthFailReason = Status; + COPY_MAC_ADDR(pAd->StaCfg.AuthFailSta, Addr2); + } + + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); + } + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - PeerAuthRspAtSeq4Action() sanity check fail\n")); + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeDeauthReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + MLME_DEAUTH_REQ_STRUCT *pInfo; + HEADER_802_11 DeauthHdr; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + USHORT Status; + + pInfo = (MLME_DEAUTH_REQ_STRUCT *)Elem->Msg; + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - MlmeDeauthReqAction() allocate memory fail\n")); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status = MLME_FAIL_NO_RESOURCE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2, &Status, 0); + return; + } + + + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send DE-AUTH request (Reason=%d)...\n", pInfo->Reason)); + MgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pInfo->Addr, pAd->MlmeAux.Bssid); + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11),&DeauthHdr, + 2, &pInfo->Reason, + END_OF_ARGS); + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + pAd->StaCfg.DeauthReason = pInfo->Reason; + COPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pInfo->Addr); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status = MLME_SUCCESS; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_DEAUTH_CONF, 2, &Status, 0); + + // send wireless event - for deauthentication + RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, NULL, BSS0, 0); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID AuthTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - AuthTimeoutAction\n")); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status = MLME_REJ_TIMEOUT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID InvalidStateWhenAuth( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - InvalidStateWhenAuth (state=%ld), reset AUTH state machine\n", pAd->Mlme.AuthMachine.CurrState)); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + Some STA/AP + Note: + This action should never trigger AUTH state transition, therefore we + separate it from AUTH state machine, and make it as a standalone service + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID Cls2errAction( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr) +{ + HEADER_802_11 DeauthHdr; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + USHORT Reason = REASON_CLS2ERR; + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + return; + + DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Class 2 error, Send DEAUTH frame...\n")); + MgtMacHeaderInit(pAd, &DeauthHdr, SUBTYPE_DEAUTH, 0, pAddr, pAd->MlmeAux.Bssid); + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11),&DeauthHdr, + 2, &Reason, + END_OF_ARGS); + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + pAd->StaCfg.DeauthReason = Reason; + COPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pAddr); +} + +BOOLEAN AUTH_ReqSend( + IN PRTMP_ADAPTER pAd, + IN PMLME_QUEUE_ELEM pElem, + IN PRALINK_TIMER_STRUCT pAuthTimer, + IN PSTRING pSMName, + IN USHORT SeqNo, + IN PUCHAR pNewElement, + IN ULONG ElementLen) +{ + USHORT Alg, Seq, Status; + UCHAR Addr[6]; + ULONG Timeout; + HEADER_802_11 AuthHdr; + BOOLEAN TimerCancelled; + NDIS_STATUS NStatus; + PUCHAR pOutBuffer = NULL; + ULONG FrameLen = 0, tmp = 0; + + // Block all authentication request durning WPA block period + if (pAd->StaCfg.bBlockAssoc == TRUE) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s - Block Auth request durning WPA block period!\n", pSMName)); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); + } + else if(MlmeAuthReqSanity(pAd, pElem->Msg, pElem->MsgLen, Addr, &Timeout, &Alg)) + { + /* reset timer */ + RTMPCancelTimer(pAuthTimer, &TimerCancelled); + + COPY_MAC_ADDR(pAd->MlmeAux.Bssid, Addr); + pAd->MlmeAux.Alg = Alg; + Seq = SeqNo; + Status = MLME_SUCCESS; + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if(NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s - MlmeAuthReqAction(Alg:%d) allocate memory failed\n", pSMName, Alg)); + pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE; + Status = MLME_FAIL_NO_RESOURCE; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status, 0); + return FALSE; + } + + DBGPRINT(RT_DEBUG_TRACE, ("%s - Send AUTH request seq#1 (Alg=%d)...\n", pSMName, Alg)); + MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr, pAd->MlmeAux.Bssid); + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11),&AuthHdr, + 2, &Alg, + 2, &Seq, + 2, &Status, + END_OF_ARGS); + + if (pNewElement && ElementLen) + { + MakeOutgoingFrame(pOutBuffer+FrameLen, &tmp, + ElementLen, pNewElement, + END_OF_ARGS); + FrameLen += tmp; + } + + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + RTMPSetTimer(pAuthTimer, Timeout); + return TRUE; + } + else + { + DBGPRINT_ERR(("%s - MlmeAuthReqAction() sanity check failed\n", pSMName)); + return FALSE; + } + + return TRUE; +} + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/auth_rsp.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/auth_rsp.c new file mode 100644 index 000000000..70a250121 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/auth_rsp.c @@ -0,0 +1,160 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + auth_rsp.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John 2004-10-1 copy from RT2560 +*/ +#include "rt_config.h" + +/* + ========================================================================== + Description: + authentication state machine init procedure + Parameters: + Sm - the state machine + + IRQL = PASSIVE_LEVEL + + ========================================================================== + */ +VOID AuthRspStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN PSTATE_MACHINE Sm, + IN STATE_MACHINE_FUNC Trans[]) +{ + StateMachineInit(Sm, Trans, MAX_AUTH_RSP_STATE, MAX_AUTH_RSP_MSG, (STATE_MACHINE_FUNC)Drop, AUTH_RSP_IDLE, AUTH_RSP_MACHINE_BASE); + + // column 1 + StateMachineSetAction(Sm, AUTH_RSP_IDLE, MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)PeerDeauthAction); + + // column 2 + StateMachineSetAction(Sm, AUTH_RSP_WAIT_CHAL, MT2_PEER_DEAUTH, (STATE_MACHINE_FUNC)PeerDeauthAction); + +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID PeerAuthSimpleRspGenAndSend( + IN PRTMP_ADAPTER pAd, + IN PHEADER_802_11 pHdr80211, + IN USHORT Alg, + IN USHORT Seq, + IN USHORT Reason, + IN USHORT Status) +{ + HEADER_802_11 AuthHdr; + ULONG FrameLen = 0; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + + if (Reason != MLME_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("Peer AUTH fail...\n")); + return; + } + + //Get an unused nonpaged memory + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); + if (NStatus != NDIS_STATUS_SUCCESS) + return; + + DBGPRINT(RT_DEBUG_TRACE, ("Send AUTH response (seq#2)...\n")); + MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, pHdr80211->Addr2, pAd->MlmeAux.Bssid); + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &AuthHdr, + 2, &Alg, + 2, &Seq, + 2, &Reason, + END_OF_ARGS); + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID PeerDeauthAction( + IN PRTMP_ADAPTER pAd, + IN PMLME_QUEUE_ELEM Elem) +{ + UCHAR Addr1[MAC_ADDR_LEN]; + UCHAR Addr2[MAC_ADDR_LEN]; + UCHAR Addr3[MAC_ADDR_LEN]; + USHORT Reason; + + if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr1, Addr2, Addr3, &Reason)) + { + if (INFRA_ON(pAd) + && (MAC_ADDR_EQUAL(Addr1, pAd->CurrentAddress) || MAC_ADDR_EQUAL(Addr1, BROADCAST_ADDR)) + && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid) + && MAC_ADDR_EQUAL(Addr3, pAd->CommonCfg.Bssid) + ) + { + DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n", Reason)); + + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + + + // send wireless event - for deauthentication + RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, NULL, BSS0, 0); + +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) && + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) && + (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) + pAd->StaCfg.bLostAp = TRUE; +#endif // WPA_SUPPLICANT_SUPPORT // + + LinkDown(pAd, TRUE); + } + } + else + { + DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - PeerDeauthAction() sanity check fail\n")); + } +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/connect.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/connect.c new file mode 100644 index 000000000..595eae3f1 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/connect.c @@ -0,0 +1,2909 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + connect.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John 2004-08-08 Major modification from RT2560 +*/ +#include "rt_config.h" + +UCHAR CipherSuiteWpaNoneTkip[] = { + 0x00, 0x50, 0xf2, 0x01, // oui + 0x01, 0x00, // Version + 0x00, 0x50, 0xf2, 0x02, // Multicast + 0x01, 0x00, // Number of unicast + 0x00, 0x50, 0xf2, 0x02, // unicast + 0x01, 0x00, // number of authentication method + 0x00, 0x50, 0xf2, 0x00 // authentication + }; +UCHAR CipherSuiteWpaNoneTkipLen = (sizeof(CipherSuiteWpaNoneTkip) / sizeof(UCHAR)); + +UCHAR CipherSuiteWpaNoneAes[] = { + 0x00, 0x50, 0xf2, 0x01, // oui + 0x01, 0x00, // Version + 0x00, 0x50, 0xf2, 0x04, // Multicast + 0x01, 0x00, // Number of unicast + 0x00, 0x50, 0xf2, 0x04, // unicast + 0x01, 0x00, // number of authentication method + 0x00, 0x50, 0xf2, 0x00 // authentication + }; +UCHAR CipherSuiteWpaNoneAesLen = (sizeof(CipherSuiteWpaNoneAes) / sizeof(UCHAR)); + +// The following MACRO is called after 1. starting an new IBSS, 2. succesfully JOIN an IBSS, +// or 3. succesfully ASSOCIATE to a BSS, 4. successfully RE_ASSOCIATE to a BSS +// All settings successfuly negotiated furing MLME state machines become final settings +// and are copied to pAd->StaActive +#define COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(_pAd) \ +{ \ + NdisZeroMemory((_pAd)->CommonCfg.Ssid, MAX_LEN_OF_SSID); \ + (_pAd)->CommonCfg.SsidLen = (_pAd)->MlmeAux.SsidLen; \ + NdisMoveMemory((_pAd)->CommonCfg.Ssid, (_pAd)->MlmeAux.Ssid, (_pAd)->MlmeAux.SsidLen); \ + COPY_MAC_ADDR((_pAd)->CommonCfg.Bssid, (_pAd)->MlmeAux.Bssid); \ + (_pAd)->CommonCfg.Channel = (_pAd)->MlmeAux.Channel; \ + (_pAd)->CommonCfg.CentralChannel = (_pAd)->MlmeAux.CentralChannel; \ + (_pAd)->StaActive.Aid = (_pAd)->MlmeAux.Aid; \ + (_pAd)->StaActive.AtimWin = (_pAd)->MlmeAux.AtimWin; \ + (_pAd)->StaActive.CapabilityInfo = (_pAd)->MlmeAux.CapabilityInfo; \ + (_pAd)->CommonCfg.BeaconPeriod = (_pAd)->MlmeAux.BeaconPeriod; \ + (_pAd)->StaActive.CfpMaxDuration = (_pAd)->MlmeAux.CfpMaxDuration; \ + (_pAd)->StaActive.CfpPeriod = (_pAd)->MlmeAux.CfpPeriod; \ + (_pAd)->StaActive.SupRateLen = (_pAd)->MlmeAux.SupRateLen; \ + NdisMoveMemory((_pAd)->StaActive.SupRate, (_pAd)->MlmeAux.SupRate, (_pAd)->MlmeAux.SupRateLen);\ + (_pAd)->StaActive.ExtRateLen = (_pAd)->MlmeAux.ExtRateLen; \ + NdisMoveMemory((_pAd)->StaActive.ExtRate, (_pAd)->MlmeAux.ExtRate, (_pAd)->MlmeAux.ExtRateLen);\ + NdisMoveMemory(&(_pAd)->CommonCfg.APEdcaParm, &(_pAd)->MlmeAux.APEdcaParm, sizeof(EDCA_PARM));\ + NdisMoveMemory(&(_pAd)->CommonCfg.APQosCapability, &(_pAd)->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM));\ + NdisMoveMemory(&(_pAd)->CommonCfg.APQbssLoad, &(_pAd)->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM));\ + COPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].Addr, (_pAd)->MlmeAux.Bssid); \ + (_pAd)->MacTab.Content[BSSID_WCID].Aid = (_pAd)->MlmeAux.Aid; \ + (_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.CipherAlg = (_pAd)->StaCfg.PairCipher;\ + COPY_MAC_ADDR((_pAd)->MacTab.Content[BSSID_WCID].PairwiseKey.BssId, (_pAd)->MlmeAux.Bssid);\ + (_pAd)->MacTab.Content[BSSID_WCID].RateLen = (_pAd)->StaActive.SupRateLen + (_pAd)->StaActive.ExtRateLen;\ +} + +/* + ========================================================================== + Description: + + IRQL = PASSIVE_LEVEL + + ========================================================================== +*/ +VOID MlmeCntlInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + OUT STATE_MACHINE_FUNC Trans[]) +{ + // Control state machine differs from other state machines, the interface + // follows the standard interface + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID MlmeCntlMachinePerformAction( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *S, + IN MLME_QUEUE_ELEM *Elem) +{ + switch(pAd->Mlme.CntlMachine.CurrState) + { + case CNTL_IDLE: + CntlIdleProc(pAd, Elem); + break; + case CNTL_WAIT_DISASSOC: + CntlWaitDisassocProc(pAd, Elem); + break; + case CNTL_WAIT_JOIN: + CntlWaitJoinProc(pAd, Elem); + break; + + // CNTL_WAIT_REASSOC is the only state in CNTL machine that does + // not triggered directly or indirectly by "RTMPSetInformation(OID_xxx)". + // Therefore not protected by NDIS's "only one outstanding OID request" + // rule. Which means NDIS may SET OID in the middle of ROAMing attempts. + // Current approach is to block new SET request at RTMPSetInformation() + // when CntlMachine.CurrState is not CNTL_IDLE + case CNTL_WAIT_REASSOC: + CntlWaitReassocProc(pAd, Elem); + break; + + case CNTL_WAIT_START: + CntlWaitStartProc(pAd, Elem); + break; + case CNTL_WAIT_AUTH: + CntlWaitAuthProc(pAd, Elem); + break; + case CNTL_WAIT_AUTH2: + CntlWaitAuthProc2(pAd, Elem); + break; + case CNTL_WAIT_ASSOC: + CntlWaitAssocProc(pAd, Elem); + break; + + case CNTL_WAIT_OID_LIST_SCAN: + if(Elem->MsgType == MT2_SCAN_CONF) + { + // Resume TxRing after SCANING complete. We hope the out-of-service time + // won't be too long to let upper layer time-out the waiting frames + RTMPResumeMsduTransmission(pAd); + + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + + // + // Set LED status to previous status. + // + if (pAd->bLedOnScanning) + { + pAd->bLedOnScanning = FALSE; + RTMPSetLED(pAd, pAd->LedStatus); + } +#ifdef DOT11N_DRAFT3 + // AP sent a 2040Coexistence mgmt frame, then station perform a scan, and then send back the respone. + if ((pAd->CommonCfg.BSSCoexist2040.field.InfoReq == 1) && + INFRA_ON(pAd) && + OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040)) + { + Update2040CoexistFrameAndNotify(pAd, BSSID_WCID, TRUE); + } +#endif // DOT11N_DRAFT3 // + } + break; + + case CNTL_WAIT_OID_DISASSOC: + if (Elem->MsgType == MT2_DISASSOC_CONF) + { + LinkDown(pAd, FALSE); + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + } + break; + default: + DBGPRINT_ERR(("!ERROR! CNTL - Illegal message type(=%ld)", Elem->MsgType)); + break; + } +} + + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlIdleProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + MLME_DISASSOC_REQ_STRUCT DisassocReq; + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) + return; + + switch(Elem->MsgType) + { + case OID_802_11_SSID: + CntlOidSsidProc(pAd, Elem); + break; + + case OID_802_11_BSSID: + CntlOidRTBssidProc(pAd,Elem); + break; + + case OID_802_11_BSSID_LIST_SCAN: + CntlOidScanProc(pAd,Elem); + break; + + case OID_802_11_DISASSOCIATE: + DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_DISASSOC; +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAd->StaCfg.WpaSupplicantUP & 0x7F) != WPA_SUPPLICANT_ENABLE_WITH_WEB_UI) +#endif // WPA_SUPPLICANT_SUPPORT // + { + // Set the AutoReconnectSsid to prevent it reconnect to old SSID + // Since calling this indicate user don't want to connect to that SSID anymore. + pAd->MlmeAux.AutoReconnectSsidLen= 32; + NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); + } + break; + + case MT2_MLME_ROAMING_REQ: + CntlMlmeRoamingProc(pAd, Elem); + break; + + case OID_802_11_MIC_FAILURE_REPORT_FRAME: + WpaMicFailureReportFrame(pAd, Elem); + break; + +#ifdef QOS_DLS_SUPPORT + case RT_OID_802_11_SET_DLS_PARAM: + CntlOidDLSSetupProc(pAd, Elem); + break; +#endif // QOS_DLS_SUPPORT // + + + default: + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Illegal message in CntlIdleProc(MsgType=%ld)\n",Elem->MsgType)); + break; + } +} + +VOID CntlOidScanProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + MLME_SCAN_REQ_STRUCT ScanReq; + ULONG BssIdx = BSS_NOT_FOUND; + BSS_ENTRY CurrBss; + +#ifdef RALINK_ATE +/* Disable scanning when ATE is running. */ + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + + + // record current BSS if network is connected. + // 2003-2-13 do not include current IBSS if this is the only STA in this IBSS. + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) + { + BssIdx = BssSsidTableSearch(&pAd->ScanTab, pAd->CommonCfg.Bssid, (PUCHAR)pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->CommonCfg.Channel); + if (BssIdx != BSS_NOT_FOUND) + { + NdisMoveMemory(&CurrBss, &pAd->ScanTab.BssEntry[BssIdx], sizeof(BSS_ENTRY)); + } + } + + // clean up previous SCAN result, add current BSS back to table if any + BssTableInit(&pAd->ScanTab); + if (BssIdx != BSS_NOT_FOUND) + { + // DDK Note: If the NIC is associated with a particular BSSID and SSID + // that are not contained in the list of BSSIDs generated by this scan, the + // BSSID description of the currently associated BSSID and SSID should be + // appended to the list of BSSIDs in the NIC's database. + // To ensure this, we append this BSS as the first entry in SCAN result + NdisMoveMemory(&pAd->ScanTab.BssEntry[0], &CurrBss, sizeof(BSS_ENTRY)); + pAd->ScanTab.BssNr = 1; + } + + ScanParmFill(pAd, &ScanReq, (PSTRING) Elem->Msg, Elem->MsgLen, BSS_ANY, SCAN_ACTIVE); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, + sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; +} + +/* + ========================================================================== + Description: + Before calling this routine, user desired SSID should already been + recorded in CommonCfg.Ssid[] + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlOidSsidProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM * Elem) +{ + PNDIS_802_11_SSID pOidSsid = (NDIS_802_11_SSID *)Elem->Msg; + MLME_DISASSOC_REQ_STRUCT DisassocReq; + ULONG Now; + + + // Step 1. record the desired user settings to MlmeAux + NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); + NdisMoveMemory(pAd->MlmeAux.Ssid, pOidSsid->Ssid, pOidSsid->SsidLength); + pAd->MlmeAux.SsidLen = (UCHAR)pOidSsid->SsidLength; + if (pAd->StaCfg.BssType == BSS_INFRA) + NdisZeroMemory(pAd->MlmeAux.Bssid, MAC_ADDR_LEN); + pAd->MlmeAux.BssType = pAd->StaCfg.BssType; + + pAd->StaCfg.bAutoConnectByBssid = FALSE; + + // + // Update Reconnect Ssid, that user desired to connect. + // + NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID); + NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); + pAd->MlmeAux.AutoReconnectSsidLen = pAd->MlmeAux.SsidLen; + + // step 2. find all matching BSS in the lastest SCAN result (inBssTab) + // & log them into MlmeAux.SsidBssTab for later-on iteration. Sort by RSSI order + BssTableSsidSort(pAd, &pAd->MlmeAux.SsidBssTab, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); + + DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - %d BSS of %d BSS match the desire (%d)SSID - %s\n", + pAd->MlmeAux.SsidBssTab.BssNr, pAd->ScanTab.BssNr, pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid)); + NdisGetSystemUpTime(&Now); + + if (INFRA_ON(pAd) && + OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && + (pAd->CommonCfg.SsidLen == pAd->MlmeAux.SsidBssTab.BssEntry[0].SsidLen) && + NdisEqualMemory(pAd->CommonCfg.Ssid, pAd->MlmeAux.SsidBssTab.BssEntry[0].Ssid, pAd->CommonCfg.SsidLen) && + MAC_ADDR_EQUAL(pAd->CommonCfg.Bssid, pAd->MlmeAux.SsidBssTab.BssEntry[0].Bssid)) + { + // Case 1. already connected with an AP who has the desired SSID + // with highest RSSI + + // Add checking Mode "LEAP" for CCX 1.0 + if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) + ) && + (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) + { + // case 1.1 For WPA, WPA-PSK, if the 1x port is not secured, we have to redo + // connection process + DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP...\n")); + DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, + sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; + } + else if (pAd->bConfigChanged == TRUE) + { + // case 1.2 Important Config has changed, we have to reconnect to the same AP + DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP Because config changed...\n")); + DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, + sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; + } + else + { + // case 1.3. already connected to the SSID with highest RSSI. + DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - already with this BSSID. ignore this SET_SSID request\n")); + // + // (HCT 12.1) 1c_wlan_mediaevents required + // media connect events are indicated when associating with the same AP + // + if (INFRA_ON(pAd)) + { + // + // Since MediaState already is NdisMediaStateConnected + // We just indicate the connect event again to meet the WHQL required. + // + pAd->IndicateMediaState = NdisMediaStateConnected; + RTMP_IndicateMediaState(pAd); + pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up + } + + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, &pAd->MlmeAux.Bssid[0], NULL, 0); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + } + } + else if (INFRA_ON(pAd)) + { + // + // For RT61 + // [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: ) + // RT61 may lost SSID, and not connect to NDTEST_WEP_AP2 and will connect to NDTEST_WEP_AP2 by Autoreconnect + // But media status is connected, so the SSID not report correctly. + // + if (!SSID_EQUAL(pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen)) + { + // + // Different SSID means not Roaming case, so we let LinkDown() to Indicate a disconnect event. + // + pAd->MlmeAux.CurrReqIsFromNdis = TRUE; + } + // case 2. active INFRA association existent + // roaming is done within miniport driver, nothing to do with configuration + // utility. so upon a new SET(OID_802_11_SSID) is received, we just + // disassociate with the current associated AP, + // then perform a new association with this new SSID, no matter the + // new/old SSID are the same or not. + DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - disassociate with current AP...\n")); + DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, + sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; + } + else + { + if (ADHOC_ON(pAd)) + { + DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - drop current ADHOC\n")); + LinkDown(pAd, FALSE); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_IndicateMediaState(pAd); + pAd->ExtraInfo = GENERAL_LINK_DOWN; + DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():NDIS_STATUS_MEDIA_DISCONNECT Event C!\n")); + } + + if ((pAd->MlmeAux.SsidBssTab.BssNr == 0) && + (pAd->StaCfg.bAutoReconnect == TRUE) && + ((pAd->MlmeAux.BssType == BSS_INFRA) || ((pAd->MlmeAux.BssType == BSS_ADHOC) && !pAd->StaCfg.bNotFirstScan)) && + (MlmeValidateSSID(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen) == TRUE) + ) + { + MLME_SCAN_REQ_STRUCT ScanReq; + pAd->StaCfg.bNotFirstScan = TRUE; + DBGPRINT(RT_DEBUG_TRACE, ("CntlOidSsidProc():CNTL - No matching BSS, start a new scan\n")); + BssTableInit(&pAd->ScanTab); + ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; + // Reset Missed scan number + pAd->StaCfg.LastScanTime = Now; + } + else + { + + pAd->MlmeAux.BssIdx = 0; + IterateOnBssTab(pAd); + } + } +} + + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlOidRTBssidProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM * Elem) +{ + ULONG BssIdx; + PUCHAR pOidBssid = (PUCHAR)Elem->Msg; + MLME_DISASSOC_REQ_STRUCT DisassocReq; + MLME_JOIN_REQ_STRUCT JoinReq; + PBSS_ENTRY pInBss = NULL; + +#ifdef RALINK_ATE +/* No need to perform this routine when ATE is running. */ + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + + // record user desired settings + COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pOidBssid); + pAd->MlmeAux.BssType = pAd->StaCfg.BssType; + + // find the desired BSS in the latest SCAN result table + BssIdx = BssTableSearch(&pAd->ScanTab, pOidBssid, pAd->MlmeAux.Channel); + + { + pInBss = &pAd->ScanTab.BssEntry[BssIdx]; + if (SSID_EQUAL(pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, pInBss->Ssid, pInBss->SsidLen) == FALSE) + BssIdx = BSS_NOT_FOUND; + // Check AuthMode and AuthModeAux for matching, in case AP support dual-mode + if ((pAd->StaCfg.AuthMode != pInBss->AuthMode) && + (pAd->StaCfg.AuthMode != pInBss->AuthModeAux)) + BssIdx = BSS_NOT_FOUND; + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeOpen) && + (pAd->StaCfg.WepStatus != pInBss->WepStatus)) + BssIdx = BSS_NOT_FOUND; + } + + if (BssIdx == BSS_NOT_FOUND) + { + if ((pAd->StaCfg.BssType == BSS_INFRA) || + (pAd->StaCfg.bNotFirstScan == FALSE)) + { + MLME_SCAN_REQ_STRUCT ScanReq; + + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - BSSID not found. reply NDIS_STATUS_NOT_ACCEPTED\n")); + pAd->StaCfg.bNotFirstScan = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - BSSID not found. start a new scan\n")); + ScanParmFill(pAd, &ScanReq, (PSTRING) pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, BSS_ANY, SCAN_ACTIVE); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; + // Reset Missed scan number + NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime); + } + else + { + MLME_START_REQ_STRUCT StartReq; + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - BSSID not found. start a new ADHOC (Ssid=%s)...\n",pAd->MlmeAux.Ssid)); + StartParmFill(pAd, &StartReq, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START; + } + return; + } + + pInBss = &pAd->ScanTab.BssEntry[BssIdx]; + // + // Update Reconnect Ssid, that user desired to connect. + // + NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, MAX_LEN_OF_SSID); + pAd->MlmeAux.AutoReconnectSsidLen = pInBss->SsidLen; + NdisMoveMemory(pAd->MlmeAux.AutoReconnectSsid, pInBss->Ssid, pInBss->SsidLen); + + // copy the matched BSS entry from ScanTab to MlmeAux.SsidBssTab. Why? + // Because we need this entry to become the JOIN target in later on SYNC state machine + pAd->MlmeAux.BssIdx = 0; + pAd->MlmeAux.SsidBssTab.BssNr = 1; + NdisMoveMemory(&pAd->MlmeAux.SsidBssTab.BssEntry[0], pInBss, sizeof(BSS_ENTRY)); + + // If AP's SSID is not hidden, it is OK for updating ssid to MlmeAux again. + if (pInBss->Hidden == 0) + { + pAd->MlmeAux.SsidLen = pInBss->SsidLen; + NdisMoveMemory(pAd->MlmeAux.Ssid, pInBss->Ssid, pAd->MlmeAux.SsidLen); + } + + { + if (INFRA_ON(pAd)) + { + // disassoc from current AP first + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - disassociate with current AP ...\n")); + DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_DISASSOC_STA_LEAVING); + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, + sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; + } + else + { + if (ADHOC_ON(pAd)) + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - drop current ADHOC\n")); + LinkDown(pAd, FALSE); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_IndicateMediaState(pAd); + pAd->ExtraInfo = GENERAL_LINK_DOWN; + DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event C!\n")); + } + + pInBss = &pAd->MlmeAux.SsidBssTab.BssEntry[0]; + // Change the wepstatus to original wepstatus + pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus; + pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus; + pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus; + + // Check cipher suite, AP must have more secured cipher than station setting + // Set the Pairwise and Group cipher to match the intended AP setting + // We can only connect to AP with less secured cipher setting + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) + { + pAd->StaCfg.GroupCipher = pInBss->WPA.GroupCipher; + + if (pAd->StaCfg.WepStatus == pInBss->WPA.PairCipher) + pAd->StaCfg.PairCipher = pInBss->WPA.PairCipher; + else if (pInBss->WPA.PairCipherAux != Ndis802_11WEPDisabled) + pAd->StaCfg.PairCipher = pInBss->WPA.PairCipherAux; + else // There is no PairCipher Aux, downgrade our capability to TKIP + pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; + } + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + pAd->StaCfg.GroupCipher = pInBss->WPA2.GroupCipher; + + if (pAd->StaCfg.WepStatus == pInBss->WPA2.PairCipher) + pAd->StaCfg.PairCipher = pInBss->WPA2.PairCipher; + else if (pInBss->WPA2.PairCipherAux != Ndis802_11WEPDisabled) + pAd->StaCfg.PairCipher = pInBss->WPA2.PairCipherAux; + else // There is no PairCipher Aux, downgrade our capability to TKIP + pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; + + // RSN capability + pAd->StaCfg.RsnCapability = pInBss->WPA2.RsnCapability; + } + + // Set Mix cipher flag + pAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE; + + + // No active association, join the BSS immediately + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - joining %02x:%02x:%02x:%02x:%02x:%02x ...\n", + pOidBssid[0],pOidBssid[1],pOidBssid[2],pOidBssid[3],pOidBssid[4],pOidBssid[5])); + + JoinParmFill(pAd, &JoinReq, pAd->MlmeAux.BssIdx); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ, sizeof(MLME_JOIN_REQ_STRUCT), &JoinReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN; + } + } +} + +// Roaming is the only external request triggering CNTL state machine +// despite of other "SET OID" operation. All "SET OID" related oerations +// happen in sequence, because no other SET OID will be sent to this device +// until the the previous SET operation is complete (successful o failed). +// So, how do we quarantee this ROAMING request won't corrupt other "SET OID"? +// or been corrupted by other "SET OID"? +// +// IRQL = DISPATCH_LEVEL +VOID CntlMlmeRoamingProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR BBPValue = 0; + + DBGPRINT(RT_DEBUG_TRACE,("CNTL - Roaming in MlmeAux.RoamTab...\n")); + + { + //Let BBP register at 20MHz to do (fast) roaming. + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + + NdisMoveMemory(&pAd->MlmeAux.SsidBssTab, &pAd->MlmeAux.RoamTab, sizeof(pAd->MlmeAux.RoamTab)); + pAd->MlmeAux.SsidBssTab.BssNr = pAd->MlmeAux.RoamTab.BssNr; + + BssTableSortByRssi(&pAd->MlmeAux.SsidBssTab); + pAd->MlmeAux.BssIdx = 0; + IterateOnBssTab(pAd); + } +} + +#ifdef QOS_DLS_SUPPORT +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlOidDLSSetupProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PRT_802_11_DLS pDLS = (PRT_802_11_DLS)Elem->Msg; + MLME_DLS_REQ_STRUCT MlmeDlsReq; + INT i; + USHORT reason = REASON_UNSPECIFY; + + DBGPRINT(RT_DEBUG_TRACE,("CNTL - (OID set %02x:%02x:%02x:%02x:%02x:%02x with Valid=%d, Status=%d, TimeOut=%d, CountDownTimer=%d)\n", + pDLS->MacAddr[0], pDLS->MacAddr[1], pDLS->MacAddr[2], pDLS->MacAddr[3], pDLS->MacAddr[4], pDLS->MacAddr[5], + pDLS->Valid, pDLS->Status, pDLS->TimeOut, pDLS->CountDownTimer)); + + if (!pAd->CommonCfg.bDLSCapable) + return; + + // DLS will not be supported when Adhoc mode + if (INFRA_ON(pAd)) + { + for (i = 0; i < MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) && + (pDLS->TimeOut == pAd->StaCfg.DLSEntry[i].TimeOut) && MAC_ADDR_EQUAL(pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + // 1. Same setting, just drop it + DBGPRINT(RT_DEBUG_TRACE,("CNTL - setting unchanged\n")); + break; + } + else if (!pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) && + MAC_ADDR_EQUAL(pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + // 2. Disable DLS link case, just tear down DLS link + reason = REASON_QOS_UNWANTED_MECHANISM; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + DBGPRINT(RT_DEBUG_TRACE,("CNTL - start tear down procedure\n")); + break; + } + else if ((i < MAX_NUM_OF_DLS_ENTRY) && pDLS->Valid && !pAd->StaCfg.DLSEntry[i].Valid) + { + // 3. Enable case, start DLS setup procedure + NdisMoveMemory(&pAd->StaCfg.DLSEntry[i], pDLS, sizeof(RT_802_11_DLS_UI)); + + //Update countdown timer + pAd->StaCfg.DLSEntry[i].CountDownTimer = pAd->StaCfg.DLSEntry[i].TimeOut; + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_REQ, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + DBGPRINT(RT_DEBUG_TRACE,("CNTL - DLS setup case\n")); + break; + } + else if ((i < MAX_NUM_OF_DLS_ENTRY) && pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid && + (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) && !MAC_ADDR_EQUAL(pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + // 4. update mac case, tear down old DLS and setup new DLS + reason = REASON_QOS_UNWANTED_MECHANISM; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + NdisMoveMemory(&pAd->StaCfg.DLSEntry[i], pDLS, sizeof(RT_802_11_DLS_UI)); + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_REQ, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + DBGPRINT(RT_DEBUG_TRACE,("CNTL - DLS tear down and restart case\n")); + break; + } + else if (pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid && + MAC_ADDR_EQUAL(pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr) && (pAd->StaCfg.DLSEntry[i].TimeOut != pDLS->TimeOut)) + { + // 5. update timeout case, start DLS setup procedure (no tear down) + pAd->StaCfg.DLSEntry[i].TimeOut = pDLS->TimeOut; + //Update countdown timer + pAd->StaCfg.DLSEntry[i].CountDownTimer = pAd->StaCfg.DLSEntry[i].TimeOut; + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_REQ, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + DBGPRINT(RT_DEBUG_TRACE,("CNTL - DLS update timeout case\n")); + break; + } + else if (pDLS->Valid && pAd->StaCfg.DLSEntry[i].Valid && + (pAd->StaCfg.DLSEntry[i].Status != DLS_FINISH) && MAC_ADDR_EQUAL(pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + // 6. re-setup case, start DLS setup procedure (no tear down) + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_REQ, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + DBGPRINT(RT_DEBUG_TRACE,("CNTL - DLS retry setup procedure\n")); + break; + } + else + { + DBGPRINT(RT_DEBUG_WARN,("CNTL - DLS not changed in entry - %d - Valid=%d, Status=%d, TimeOut=%d\n", + i, pAd->StaCfg.DLSEntry[i].Valid, pAd->StaCfg.DLSEntry[i].Status, pAd->StaCfg.DLSEntry[i].TimeOut)); + } + } + } +} +#endif // QOS_DLS_SUPPORT // + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlWaitDisassocProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + MLME_START_REQ_STRUCT StartReq; + + if (Elem->MsgType == MT2_DISASSOC_CONF) + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Dis-associate successful\n")); + + RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, NULL, BSS0, 0); + + LinkDown(pAd, FALSE); + + // case 1. no matching BSS, and user wants ADHOC, so we just start a new one + if ((pAd->MlmeAux.SsidBssTab.BssNr==0) && (pAd->StaCfg.BssType == BSS_ADHOC)) + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - No matching BSS, start a new ADHOC (Ssid=%s)...\n",pAd->MlmeAux.Ssid)); + StartParmFill(pAd, &StartReq, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START; + } + // case 2. try each matched BSS + else + { + pAd->MlmeAux.BssIdx = 0; + + IterateOnBssTab(pAd); + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlWaitJoinProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Reason; + MLME_AUTH_REQ_STRUCT AuthReq; + + if (Elem->MsgType == MT2_JOIN_CONF) + { + NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT)); + if (Reason == MLME_SUCCESS) + { + // 1. joined an IBSS, we are pretty much done here + if (pAd->MlmeAux.BssType == BSS_ADHOC) + { + // + // 5G bands rules of Japan: + // Ad hoc must be disabled in W53(ch52,56,60,64) channels. + // + if ( (pAd->CommonCfg.bIEEE80211H == 1) && + RadarChannelCheck(pAd, pAd->CommonCfg.Channel) + ) + { + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Channel=%d, Join adhoc on W53(52,56,60,64) Channels are not accepted\n", pAd->CommonCfg.Channel)); + return; + } + + LinkUp(pAd, BSS_ADHOC); + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - join the IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n", + pAd->CommonCfg.Bssid[0],pAd->CommonCfg.Bssid[1],pAd->CommonCfg.Bssid[2], + pAd->CommonCfg.Bssid[3],pAd->CommonCfg.Bssid[4],pAd->CommonCfg.Bssid[5])); + + pAd->IndicateMediaState = NdisMediaStateConnected; + pAd->ExtraInfo = GENERAL_LINK_UP; + + RTMPSendWirelessEvent(pAd, IW_JOIN_IBSS_FLAG, NULL, BSS0, 0); + } + // 2. joined a new INFRA network, start from authentication + else + { + { + // either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch)) + { + AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, AUTH_MODE_KEY); + } + else + { + AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, AUTH_MODE_OPEN); + } + MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ, + sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, 0); + } + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH; + } + } + else + { + // 3. failed, try next BSS + pAd->MlmeAux.BssIdx++; + IterateOnBssTab(pAd); + } + } +} + + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlWaitStartProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Result; + + if (Elem->MsgType == MT2_START_CONF) + { + NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT)); + if (Result == MLME_SUCCESS) + { + // + // 5G bands rules of Japan: + // Ad hoc must be disabled in W53(ch52,56,60,64) channels. + // + if ( (pAd->CommonCfg.bIEEE80211H == 1) && + RadarChannelCheck(pAd, pAd->CommonCfg.Channel) + ) + { + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Channel=%d, Start adhoc on W53(52,56,60,64) Channels are not accepted\n", pAd->CommonCfg.Channel)); + return; + } +#ifdef DOT11_N_SUPPORT + NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16); + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->StaCfg.bAdhocN == TRUE)) + { + N_ChannelCheck(pAd); + SetCommonHT(pAd); + if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && + (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE)) + { + pAd->MlmeAux.CentralChannel = pAd->CommonCfg.Channel + 2; + } + else if ((pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == BW_40) && + (pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW)) + { + pAd->MlmeAux.CentralChannel = pAd->CommonCfg.Channel - 2; + } + NdisMoveMemory(&pAd->MlmeAux.AddHtInfo, &pAd->CommonCfg.AddHTInfo, sizeof(ADD_HT_INFO_IE)); + RTMPCheckHt(pAd, BSSID_WCID, &pAd->CommonCfg.HtCapability, &pAd->CommonCfg.AddHTInfo); + pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE; + NdisMoveMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], &pAd->CommonCfg.HtCapability.MCSSet[0], 16); + COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd); + } + else +#endif // DOT11_N_SUPPORT // + { + pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; + } + LinkUp(pAd, BSS_ADHOC); + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + // Before send beacon, driver need do radar detection + if ((pAd->CommonCfg.Channel > 14 ) + && (pAd->CommonCfg.bIEEE80211H == 1) + && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) + { + pAd->CommonCfg.RadarDetect.RDMode = RD_SILENCE_MODE; + pAd->CommonCfg.RadarDetect.RDCount = 0; +#ifdef DFS_SUPPORT + BbpRadarDetectionStart(pAd); +#endif // DFS_SUPPORT // + } + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - start a new IBSS = %02x:%02x:%02x:%02x:%02x:%02x ...\n", + pAd->CommonCfg.Bssid[0],pAd->CommonCfg.Bssid[1],pAd->CommonCfg.Bssid[2], + pAd->CommonCfg.Bssid[3],pAd->CommonCfg.Bssid[4],pAd->CommonCfg.Bssid[5])); + + RTMPSendWirelessEvent(pAd, IW_START_IBSS_FLAG, NULL, BSS0, 0); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Start IBSS fail. BUG!!!!!\n")); + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlWaitAuthProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Reason; + MLME_ASSOC_REQ_STRUCT AssocReq; + MLME_AUTH_REQ_STRUCT AuthReq; + + if (Elem->MsgType == MT2_AUTH_CONF) + { + NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT)); + if (Reason == MLME_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n")); + AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo, + ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount); + + { + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_ASSOC_REQ, + sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_ASSOC; + } + } + else + { + // This fail may because of the AP already keep us in its MAC table without + // ageing-out. The previous authentication attempt must have let it remove us. + // so try Authentication again may help. For D-Link DWL-900AP+ compatibility. + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, try again...\n")); + { + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeShared) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch)) + { + // either Ndis802_11AuthModeShared or Ndis802_11AuthModeAutoSwitch, try shared key first + AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, AUTH_MODE_KEY); + } + else + { + AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, AUTH_MODE_OPEN); + } + MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ, + sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, 0); + + } + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2; + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlWaitAuthProc2( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Reason; + MLME_ASSOC_REQ_STRUCT AssocReq; + MLME_AUTH_REQ_STRUCT AuthReq; + + if (Elem->MsgType == MT2_AUTH_CONF) + { + NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT)); + if (Reason == MLME_SUCCESS) + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH OK\n")); + AssocParmFill(pAd, &AssocReq, pAd->MlmeAux.Bssid, pAd->MlmeAux.CapabilityInfo, + ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount); + { + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_ASSOC_REQ, + sizeof(MLME_ASSOC_REQ_STRUCT), &AssocReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_ASSOC; + } + } + else + { + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeAutoSwitch) && + (pAd->MlmeAux.Alg == Ndis802_11AuthModeShared)) + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, try OPEN system...\n")); + AuthParmFill(pAd, &AuthReq, pAd->MlmeAux.Bssid, Ndis802_11AuthModeOpen); + MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_MLME_AUTH_REQ, + sizeof(MLME_AUTH_REQ_STRUCT), &AuthReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_AUTH2; + } + else + { + // not success, try next BSS + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - AUTH FAIL, give up; try next BSS\n")); + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; //??????? + pAd->MlmeAux.BssIdx++; + IterateOnBssTab(pAd); + } + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlWaitAssocProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Reason; + + if (Elem->MsgType == MT2_ASSOC_CONF) + { + NdisMoveMemory(&Reason, Elem->Msg, sizeof(USHORT)); + if (Reason == MLME_SUCCESS) + { + RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, NULL, BSS0, 0); + + LinkUp(pAd, BSS_INFRA); + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Association successful on BSS #%ld\n",pAd->MlmeAux.BssIdx)); + } + else + { + // not success, try next BSS + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Association fails on BSS #%ld\n",pAd->MlmeAux.BssIdx)); + pAd->MlmeAux.BssIdx++; + IterateOnBssTab(pAd); + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID CntlWaitReassocProc( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Result; + + if (Elem->MsgType == MT2_REASSOC_CONF) + { + NdisMoveMemory(&Result, Elem->Msg, sizeof(USHORT)); + if (Result == MLME_SUCCESS) + { + // send wireless event - for association + RTMPSendWirelessEvent(pAd, IW_ASSOC_EVENT_FLAG, NULL, BSS0, 0); + + + // + // NDIS requires a new Link UP indication but no Link Down for RE-ASSOC + // + LinkUp(pAd, BSS_INFRA); + + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Re-assocition successful on BSS #%ld\n", pAd->MlmeAux.RoamIdx)); + } + else + { + // reassoc failed, try to pick next BSS in the BSS Table + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - Re-assocition fails on BSS #%ld\n", pAd->MlmeAux.RoamIdx)); + { + pAd->MlmeAux.RoamIdx++; + IterateOnBssTab2(pAd); + } + } + } +} + + +VOID AdhocTurnOnQos( + IN PRTMP_ADAPTER pAd) +{ +#define AC0_DEF_TXOP 0 +#define AC1_DEF_TXOP 0 +#define AC2_DEF_TXOP 94 +#define AC3_DEF_TXOP 47 + + // Turn on QOs if use HT rate. + if (pAd->CommonCfg.APEdcaParm.bValid == FALSE) + { + pAd->CommonCfg.APEdcaParm.bValid = TRUE; + pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3; + pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7; + pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1; + pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1; + + pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4; + pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4; + pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3; + pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2; + + pAd->CommonCfg.APEdcaParm.Cwmax[0] = 10; + pAd->CommonCfg.APEdcaParm.Cwmax[1] = 6; + pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4; + pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3; + + pAd->CommonCfg.APEdcaParm.Txop[0] = 0; + pAd->CommonCfg.APEdcaParm.Txop[1] = 0; + pAd->CommonCfg.APEdcaParm.Txop[2] = AC2_DEF_TXOP; + pAd->CommonCfg.APEdcaParm.Txop[3] = AC3_DEF_TXOP; + } + AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID LinkUp( + IN PRTMP_ADAPTER pAd, + IN UCHAR BssType) +{ + ULONG Now; + UINT32 Data; + BOOLEAN Cancelled; + UCHAR Value = 0, idx = 0, HashIdx = 0; + MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry = NULL; + + + // Init ChannelQuality to prevent DEAD_CQI at initial LinkUp + pAd->Mlme.ChannelQuality = 50; + + pEntry = MacTableLookup(pAd, pAd->CommonCfg.Bssid); + if (pEntry) + { + MacTableDeleteEntry(pAd, pEntry->Aid, pEntry->Addr); + pEntry = NULL; + } + + + pEntry = &pAd->MacTab.Content[BSSID_WCID]; + + // + // ASSOC - DisassocTimeoutAction + // CNTL - Dis-associate successful + // !!! LINK DOWN !!! + // [88888] OID_802_11_SSID should have returned NDTEST_WEP_AP2(Returned: ) + // + // To prevent DisassocTimeoutAction to call Link down after we link up, + // cancel the DisassocTimer no matter what it start or not. + // + RTMPCancelTimer(&pAd->MlmeAux.DisassocTimer, &Cancelled); + + COPY_SETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd); + +#ifdef DOT11_N_SUPPORT + COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd); +#endif // DOT11_N_SUPPORT // + + if (BssType == BSS_ADHOC) + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADHOC_ON); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON); + +#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier + // No carrier detection when adhoc + // CarrierDetectionStop(pAd); + pAd->CommonCfg.CarrierDetect.CD_State = CD_NORMAL; +#endif // CARRIER_DETECTION_SUPPORT // + +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->StaCfg.bAdhocN == TRUE)) + AdhocTurnOnQos(pAd); +#endif // DOT11_N_SUPPORT // + + InitChannelRelatedValue(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("!!!Adhoc LINK UP !!! \n" )); + } + else + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_INFRA_ON); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON); + + DBGPRINT(RT_DEBUG_TRACE, ("!!!Infra LINK UP !!! \n" )); + } + + + // + // Save BBP_R66 value, it will be used in RTUSBResumeMsduTransmission + // + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue); + + DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (BssType=%d, AID=%d, ssid=%s, Channel=%d, CentralChannel = %d)\n", + BssType, pAd->StaActive.Aid, pAd->CommonCfg.Ssid, pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel)); + +#ifdef DOT11_N_SUPPORT + DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! (Density =%d, )\n", pAd->MacTab.Content[BSSID_WCID].MpduDensity)); +#endif // DOT11_N_SUPPORT // + + AsicSetBssid(pAd, pAd->CommonCfg.Bssid); + + AsicSetSlotTime(pAd, TRUE); + AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm); + + + // Call this for RTS protectionfor legacy rate, we will always enable RTS threshold, but normally it will not hit + AsicUpdateProtect(pAd, 0, (OFDMSETPROTECT | CCKSETPROTECT), TRUE, FALSE); + +#ifdef DOT11_N_SUPPORT + if ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE)) + { + // Update HT protectionfor based on AP's operating mode. + if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1) + { + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, TRUE); + } + else + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, FALSE); + } +#endif // DOT11_N_SUPPORT // + + NdisZeroMemory(&pAd->DrsCounters, sizeof(COUNTER_DRS)); + + NdisGetSystemUpTime(&Now); + pAd->StaCfg.LastBeaconRxTime = Now; // last RX timestamp + + if ((pAd->CommonCfg.TxPreamble != Rt802_11PreambleLong) && + CAP_IS_SHORT_PREAMBLE_ON(pAd->StaActive.CapabilityInfo)) + { + MlmeSetTxPreamble(pAd, Rt802_11PreambleShort); + } + + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); + + if (pAd->CommonCfg.RadarDetect.RDMode == RD_SILENCE_MODE) + { +#ifdef DFS_SUPPORT + RadarDetectionStop(pAd); +#endif // DFS_SUPPORT // + } + pAd->CommonCfg.RadarDetect.RDMode = RD_NORMAL_MODE; + + if (BssType == BSS_ADHOC) + { + MakeIbssBeacon(pAd); + if ((pAd->CommonCfg.Channel > 14) + && (pAd->CommonCfg.bIEEE80211H == 1) + && RadarChannelCheck(pAd, pAd->CommonCfg.Channel)) + { + ; //Do nothing + } + else + { + AsicEnableIbssSync(pAd); + } + + // In ad hoc mode, use MAC table from index 1. + // p.s ASIC use all 0xff as termination of WCID table search.To prevent it's 0xff-ff-ff-ff-ff-ff, Write 0 here. + RTMP_IO_WRITE32(pAd, MAC_WCID_BASE, 0x00); + RTMP_IO_WRITE32(pAd, 0x1808, 0x00); + + // If WEP is enabled, add key material and cipherAlg into Asic + // Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000) + + if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) + { + UCHAR CipherAlg; + + for (idx=0; idx < SHARE_KEY_NUM; idx++) + { + CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg; + + if (pAd->SharedKey[BSS0][idx].KeyLen > 0) + { + // Set key material and cipherAlg to Asic + AsicAddSharedKeyEntry(pAd, BSS0, idx, &pAd->SharedKey[BSS0][idx]); + + if (idx == pAd->StaCfg.DefaultKeyId) + { + INT cnt; + + /* Generate 3-bytes IV randomly for software encryption using */ + for(cnt = 0; cnt < LEN_WEP_TSC; cnt++) + pAd->SharedKey[BSS0][idx].TxTsc[cnt] = RandomByte(pAd); + + /* Update WCID attribute table and IVEIV table for this group key table */ + RTMPSetWcidSecurityInfo(pAd, + BSS0, + idx, + CipherAlg, + MCAST_WCID, + SHAREDKEYTABLE); + } + } + + + } + } + // If WPANone is enabled, add key material and cipherAlg into Asic + // Fill in Shared Key Table(offset: 0x6c00) and Shared Key Mode(offset: 0x7000) + else if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) + { + pAd->StaCfg.DefaultKeyId = 0; // always be zero + + NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY)); + pAd->SharedKey[BSS0][0].KeyLen = LEN_TK; + NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pAd->StaCfg.PMK, LEN_TK); + + if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) + { + NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_MIC); + NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, &pAd->StaCfg.PMK[16], LEN_TKIP_MIC); + } + + // Decide its ChiperAlg + if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) + pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP; + else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled) + pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES; + else + { + DBGPRINT(RT_DEBUG_TRACE, ("Unknow Cipher (=%d), set Cipher to AES\n", pAd->StaCfg.PairCipher)); + pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES; + } + + // Set key material and cipherAlg to Asic + AsicAddSharedKeyEntry(pAd, + BSS0, + 0, + &pAd->SharedKey[BSS0][0]); + + /* Update WCID attribute table and IVEIV table for this group key table */ + RTMPSetWcidSecurityInfo(pAd, + BSS0, + 0, + pAd->SharedKey[BSS0][0].CipherAlg, + MCAST_WCID, + SHAREDKEYTABLE); + } + + } + else // BSS_INFRA + { + // Check the new SSID with last SSID + while (Cancelled == TRUE) + { + if (pAd->CommonCfg.LastSsidLen == pAd->CommonCfg.SsidLen) + { + if (RTMPCompareMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen) == 0) + { + // Link to the old one no linkdown is required. + break; + } + } + // Send link down event before set to link up + pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_IndicateMediaState(pAd); + pAd->ExtraInfo = GENERAL_LINK_DOWN; + DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event AA!\n")); + break; + } + + // + // On WPA mode, Remove All Keys if not connect to the last BSSID + // Key will be set after 4-way handshake. + // + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + { + //ULONG IV; + + // Remove all WPA keys +#ifdef PCIE_PS_SUPPORT + RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); +#endif // PCIE_PS_SUPPORT // + + RTMPWPARemoveAllKeys(pAd); + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; + pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP; + + +#ifdef SOFT_ENCRYPT + /* There are some situation to need to encryption by software + 1. The Client support PMF. It shall ony support AES cipher. + 2. The Client support WAPI. + If use RT3883 or later, HW can handle the above. + */ + if ((pAd->MACVersion < RALINK_3883_VERSION) && + (FALSE + )) + { + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SOFTWARE_ENCRYPT); + } +#endif // SOFT_ENCRYPT // + + + } + + // NOTE: + // the decision of using "short slot time" or not may change dynamically due to + // new STA association to the AP. so we have to decide that upon parsing BEACON, not here + + // NOTE: + // the decision to use "RTC/CTS" or "CTS-to-self" protection or not may change dynamically + // due to new STA association to the AP. so we have to decide that upon parsing BEACON, not here + + ComposePsPoll(pAd); + ComposeNullFrame(pAd); + + AsicEnableBssSync(pAd); + + // Add BSSID to WCID search table + AsicUpdateRxWCIDTable(pAd, BSSID_WCID, pAd->CommonCfg.Bssid); + + // If WEP is enabled, add paiewise and shared key +#ifdef WPA_SUPPLICANT_SUPPORT + if (((pAd->StaCfg.WpaSupplicantUP)&& + (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)&& + (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED)) || + ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE)&& + (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled))) +#else + if (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) +#endif // WPA_SUPPLICANT_SUPPORT // + { + UCHAR CipherAlg; + + for (idx=0; idx < SHARE_KEY_NUM; idx++) + { + CipherAlg = pAd->SharedKey[BSS0][idx].CipherAlg; + + if (pAd->SharedKey[BSS0][idx].KeyLen > 0) + { + // Set key material and cipherAlg to Asic + AsicAddSharedKeyEntry(pAd, BSS0, idx, &pAd->SharedKey[BSS0][idx]); + + if (idx == pAd->StaCfg.DefaultKeyId) + { + /* STA doesn't need to set WCID attribute for group key */ + + /* Assign pairwise key info to Asic */ + pEntry->Aid = BSSID_WCID; + RTMPSetWcidSecurityInfo(pAd, BSS0, idx, + CipherAlg, pEntry->Aid, SHAREDKEYTABLE); + } + } + } + } + + // only INFRASTRUCTURE mode need to indicate connectivity immediately; ADHOC mode + // should wait until at least 2 active nodes in this BSSID. + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + + // For GUI ++ + if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA) + { + pAd->IndicateMediaState = NdisMediaStateConnected; + pAd->ExtraInfo = GENERAL_LINK_UP; + RTMP_IndicateMediaState(pAd); + } + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_DISABLE) +#endif // WPA_SUPPLICANT_SUPPORT // + RTMPSetTimer(&pAd->Mlme.LinkDownTimer, LINK_DOWN_TIMEOUT); + + } + // -- + + // Add BSSID in my MAC Table. + NdisAcquireSpinLock(&pAd->MacTabLock); + // add this MAC entry into HASH table + if (pEntry) + { + HashIdx = MAC_ADDR_HASH_INDEX(pAd->CommonCfg.Bssid); + if (pAd->MacTab.Hash[HashIdx] == NULL) + { + pAd->MacTab.Hash[HashIdx] = pEntry; + } + else + { + pCurrEntry = pAd->MacTab.Hash[HashIdx]; + while (pCurrEntry->pNext != NULL) + { + pCurrEntry = pCurrEntry->pNext; + } + pCurrEntry->pNext = pEntry; + } + } + RTMPMoveMemory(pEntry->Addr, pAd->CommonCfg.Bssid, MAC_ADDR_LEN); + pEntry->Aid = BSSID_WCID; + pEntry->pAd = pAd; + SET_ENTRY_CLIENT(pEntry); + pAd->MacTab.Size = 1; // infra mode always set MACtab size =1. + pEntry->Sst = SST_ASSOC; + pEntry->AuthState = SST_ASSOC; + pEntry->AuthMode = pAd->StaCfg.AuthMode; + pEntry->WepStatus = pAd->StaCfg.WepStatus; + if (pEntry->AuthMode < Ndis802_11AuthModeWPA) + { + pEntry->WpaState = AS_NOTUSE; + pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; + } + else + { + pEntry->WpaState = AS_PTKSTART; + pEntry->PrivacyFilter = Ndis802_11PrivFilter8021xWEP; + } + NdisReleaseSpinLock(&pAd->MacTabLock); + + DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !!! ClientStatusFlags=%lx)\n", + pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags)); + + + MlmeUpdateTxRates(pAd, TRUE, BSS0); +#ifdef DOT11_N_SUPPORT + MlmeUpdateHtTxRates(pAd, BSS0); + DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK UP !! (StaActive.bHtEnable =%d, )\n", pAd->StaActive.SupportedPhyInfo.bHtEnable)); +#endif // DOT11_N_SUPPORT // + + + if (pAd->CommonCfg.bAggregationCapable) + { + if ((pAd->CommonCfg.bPiggyBackCapable) && (pAd->MlmeAux.APRalinkIe & 0x00000003) == 3) + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED); + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE); + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE); + RTMPSetPiggyBack(pAd, TRUE); + DBGPRINT(RT_DEBUG_TRACE, ("Turn on Piggy-Back\n")); + } + else if (pAd->MlmeAux.APRalinkIe & 0x00000001) + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_AGGREGATION_CAPABLE); + DBGPRINT(RT_DEBUG_TRACE, ("Ralink Aggregation\n")); + } + } + + if (pAd->MlmeAux.APRalinkIe != 0x0) + { +#ifdef DOT11_N_SUPPORT + if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE)) + { + AsicEnableRDG(pAd); + } +#endif // DOT11_N_SUPPORT // + OPSTATUS_SET_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET); + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET); + } + else + { + OPSTATUS_CLEAR_FLAG(pAd, fCLIENT_STATUS_RALINK_CHIPSET); + CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET); + } + } + + +#ifdef DOT11_N_SUPPORT + DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_CONNECT Event B!.BACapability = %x. ClientStatusFlags = %lx\n", pAd->CommonCfg.BACapability.word, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags)); +#endif // DOT11_N_SUPPORT // + + // Set LED + RTMPSetLED(pAd, LED_LINK_UP); + + pAd->Mlme.PeriodicRound = 0; + pAd->Mlme.OneSecPeriodicRound = 0; + pAd->bConfigChanged = FALSE; // Reset config flag + pAd->ExtraInfo = GENERAL_LINK_UP; // Update extra information to link is up + + // Set asic auto fall back + { + PUCHAR pTable; + UCHAR TableSize = 0; + + MlmeSelectTxRateTable(pAd, &pAd->MacTab.Content[BSSID_WCID], &pTable, &TableSize, &pAd->CommonCfg.TxRateIndex); + AsicUpdateAutoFallBackTable(pAd, pTable); + } + + NdisAcquireSpinLock(&pAd->MacTabLock); + pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word; + pEntry->MaxHTPhyMode.word = pAd->StaCfg.HTPhyMode.word; + if (pAd->StaCfg.bAutoTxRateSwitch == FALSE) + { + pEntry->bAutoTxRateSwitch = FALSE; +#ifdef DOT11_N_SUPPORT + if (pEntry->HTPhyMode.field.MCS == 32) + pEntry->HTPhyMode.field.ShortGI = GI_800; + + if ((pEntry->HTPhyMode.field.MCS > MCS_7) || (pEntry->HTPhyMode.field.MCS == 32)) + pEntry->HTPhyMode.field.STBC = STBC_NONE; +#endif // DOT11_N_SUPPORT // + // If the legacy mode is set, overwrite the transmit setting of this entry. + if (pEntry->HTPhyMode.field.MODE <= MODE_OFDM) + RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry); + } + else + pEntry->bAutoTxRateSwitch = TRUE; + NdisReleaseSpinLock(&pAd->MacTabLock); + + // Let Link Status Page display first initial rate. + pAd->LastTxRate = (USHORT)(pEntry->HTPhyMode.word); + // Select DAC according to HT or Legacy + if (pAd->StaActive.SupportedPhyInfo.MCSSet[0] != 0x00) + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value); + Value &= (~0x18); + if (pAd->Antenna.field.TxPath == 2) + { + Value |= 0x10; + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value); + } + else + { + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &Value); + Value &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, Value); + } + +#ifdef DOT11_N_SUPPORT + if (pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) + { + } + else if (pEntry->MaxRAmpduFactor == 0) + { + // If HT AP doesn't support MaxRAmpduFactor = 1, we need to set max PSDU to 0. + // Because our Init value is 1 at MACRegTable. + RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x0fff); + } +#endif // DOT11_N_SUPPORT // + + // Patch for Marvel AP to gain high throughput + // Need to set as following, + // 1. Set txop in register-EDCA_AC0_CFG as 0x60 + // 2. Set EnTXWriteBackDDONE in register-WPDMA_GLO_CFG as zero + // 3. PBF_MAX_PCNT as 0x1F3FBF9F + // 4. kick per two packets when dequeue + // + // Txop can only be modified when RDG is off, WMM is disable and TxBurst is enable + // + // if 1. Legacy AP WMM on, or 2. 11n AP, AMPDU disable. Force turn off burst no matter what bEnableTxBurst is. +#ifdef DOT11_N_SUPPORT + if (!((pAd->CommonCfg.RxStream == 1)&&(pAd->CommonCfg.TxStream == 1)) && + (pAd->StaCfg.bForceTxBurst == FALSE) && + (((pAd->StaActive.SupportedPhyInfo.bHtEnable == FALSE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)) + || ((pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->CommonCfg.BACapability.field.Policy == BA_NOTUSE)))) + { + RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); + Data &= 0xFFFFFF00; + RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); + + RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F); + DBGPRINT(RT_DEBUG_TRACE, ("Txburst 1\n")); + } + else +#endif // DOT11_N_SUPPORT // + if (pAd->CommonCfg.bEnableTxBurst) + { + RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); + Data &= 0xFFFFFF00; + Data |= 0x60; + RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); + pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = TRUE; + + RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3FBF9F); + DBGPRINT(RT_DEBUG_TRACE, ("Txburst 2\n")); + } + else + { + RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &Data); + Data &= 0xFFFFFF00; + RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, Data); + + RTMP_IO_WRITE32(pAd, PBF_MAX_PCNT, 0x1F3F7F9F); + DBGPRINT(RT_DEBUG_TRACE, ("Txburst 3\n")); + } + +#ifdef DOT11_N_SUPPORT + // Re-check to turn on TX burst or not. + if ((pAd->CommonCfg.IOTestParm.bLastAtheros == TRUE) && ((STA_WEP_ON(pAd))||(STA_TKIP_ON(pAd)))) + { + pAd->CommonCfg.IOTestParm.bNextDisableRxBA = TRUE; + if (pAd->CommonCfg.bEnableTxBurst) + { + UINT32 MACValue = 0; + // Force disable TXOP value in this case. The same action in MLMEUpdateProtect too. + // I didn't change PBF_MAX_PCNT setting. + RTMP_IO_READ32(pAd, EDCA_AC0_CFG, &MACValue); + MACValue &= 0xFFFFFF00; + RTMP_IO_WRITE32(pAd, EDCA_AC0_CFG, MACValue); + pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE; + } + } + else + { + pAd->CommonCfg.IOTestParm.bNextDisableRxBA = FALSE; + } +#endif // DOT11_N_SUPPORT // + + pAd->CommonCfg.IOTestParm.bLastAtheros = FALSE; + +#ifdef WPA_SUPPLICANT_SUPPORT + /* + If STA connects to different AP, STA couldn't send EAPOL_Start for WpaSupplicant. + */ + if ((pAd->StaCfg.BssType == BSS_INFRA) && + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) && + (NdisEqualMemory(pAd->CommonCfg.Bssid, pAd->CommonCfg.LastBssid, MAC_ADDR_LEN) == FALSE) && + (pAd->StaCfg.bLostAp == TRUE)) + { + pAd->StaCfg.bLostAp = FALSE; + } +#endif // WPA_SUPPLICANT_SUPPORT // + /* + Need to check this COPY. This COPY is from Windows Driver. + */ + + COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid); + DBGPRINT(RT_DEBUG_TRACE, ("!!!pAd->bNextDisableRxBA= %d \n", pAd->CommonCfg.IOTestParm.bNextDisableRxBA)); + // BSSID add in one MAC entry too. Because in Tx, ASIC need to check Cipher and IV/EIV, BAbitmap + // Pther information in MACTab.Content[BSSID_WCID] is not necessary for driver. + // Note: As STA, The MACTab.Content[BSSID_WCID]. PairwiseKey and Shared Key for BSS0 are the same. + + if (pAd->StaCfg.WepStatus <= Ndis802_11WEPDisabled) + { +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP && + (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) && + (pAd->StaCfg.IEEE8021X == TRUE)) + ; + else +#endif // WPA_SUPPLICANT_SUPPORT // + { + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilterAcceptAll; + } + } + + NdisAcquireSpinLock(&pAd->MacTabLock); + pEntry->PortSecured = pAd->StaCfg.PortSecured; + NdisReleaseSpinLock(&pAd->MacTabLock); + + // + // Patch Atheros AP TX will breakdown issue. + // AP Model: DLink DWL-8200AP + // + if (INFRA_ON(pAd) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && STA_TKIP_ON(pAd)) + { + RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x01); + } + else + { + RTMP_IO_WRITE32(pAd, RX_PARSER_CFG, 0x00); + } + + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); + //RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW); + + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + if (INFRA_ON(pAd)) + { + if ((pAd->CommonCfg.bBssCoexEnable == TRUE) && (pAd->CommonCfg.Channel <= 14) + && (pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE) && (pAd->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport == 1)) + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_SCAN_2040); + BuildEffectedChannelList(pAd); + //pAd->CommonCfg.ScanParameter.Dot11BssWidthTriggerScanInt = 150; + DBGPRINT(RT_DEBUG_TRACE, ("LinkUP AP supports 20/40 BSS COEX !!! Dot11BssWidthTriggerScanInt[%d]\n",pAd->CommonCfg.Dot11BssWidthTriggerScanInt)); + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("not supports 20/40 BSS COEX !!! \n")); + DBGPRINT(RT_DEBUG_TRACE, ("pAd->CommonCfg.bBssCoexEnable %d !!! \n", pAd->CommonCfg.bBssCoexEnable)); + DBGPRINT(RT_DEBUG_TRACE, ("pAd->CommonCfg.Channel %d !!! \n",pAd->CommonCfg.Channel)); + DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaActive.SupportedHtPhy.bHtEnable %d !!! \n",pAd->StaActive.SupportedPhyInfo.bHtEnable)); + DBGPRINT(RT_DEBUG_TRACE, ("pAd->MlmeAux.ExtCapInfo.BssCoexstSup %d !!! \n",pAd->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport)); + DBGPRINT(RT_DEBUG_TRACE, ("pAd->CommonCfg.CentralChannel %d !!! \n",pAd->CommonCfg.CentralChannel)); + DBGPRINT(RT_DEBUG_TRACE, ("pAd->CommonCfg.PhyMode %d !!! \n",pAd->CommonCfg.PhyMode)); + } + } +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +#ifdef WPA_SUPPLICANT_SUPPORT + /* + When AuthMode is WPA2-Enterprise and AP reboot or STA lost AP, + WpaSupplicant would not send EapolStart to AP after STA re-connect to AP again. + In this case, driver would send EapolStart to AP. + */ + if ((pAd->StaCfg.BssType == BSS_INFRA) && + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) && + (NdisEqualMemory(pAd->CommonCfg.Bssid, pAd->CommonCfg.LastBssid, MAC_ADDR_LEN)) && + (pAd->StaCfg.bLostAp == TRUE)) + { + WpaSendEapolStart(pAd, pAd->CommonCfg.Bssid); + pAd->StaCfg.bLostAp = FALSE; + } +#endif // WPA_SUPPLICANT_SUPPORT // + +} + +/* + ========================================================================== + + Routine Description: + Disconnect current BSSID + + Arguments: + pAd - Pointer to our adapter + IsReqFromAP - Request from AP + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + We need more information to know it's this requst from AP. + If yes! we need to do extra handling, for example, remove the WPA key. + Otherwise on 4-way handshaking will faied, since the WPA key didn't be + remove while auto reconnect. + Disconnect request from AP, it means we will start afresh 4-way handshaking + on WPA mode. + + ========================================================================== +*/ +VOID LinkDown( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN IsReqFromAP) +{ + UCHAR i, ByteValue = 0; + +#ifdef PCIE_PS_SUPPORT + BOOLEAN Cancelled; +#endif // PCIE_PS_SUPPORT // + + // Do nothing if monitor mode is on + if (MONITOR_ON(pAd)) + return; + +#ifdef RALINK_ATE + // Nothing to do in ATE mode. + if (ATE_ON(pAd)) + return; +#endif // RALINK_ATE // + +#ifdef PCIE_PS_SUPPORT + // Not allow go to sleep within linkdown function. + RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); +#endif // PCIE_PS_SUPPORT // + + + RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, NULL, BSS0, 0); + + DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN !!!\n")); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED); + +#ifdef PCIE_PS_SUPPORT + + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + { + BOOLEAN Cancelled; + pAd->Mlme.bPsPollTimerRunning = FALSE; + RTMPCancelTimer(&pAd->Mlme.PsPollTimer, &Cancelled); + } + + pAd->bPCIclkOff = FALSE; +#endif // PCIE_PS_SUPPORT // + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE) +/*|| RTMP_TEST_PSFLAG(pAd, fRTMP_PS_SET_PCI_CLK_OFF_COMMAND) */ + || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF)) + { + AUTO_WAKEUP_STRUC AutoWakeupCfg; + AsicForceWakeup(pAd, TRUE); + AutoWakeupCfg.word = 0; + RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE); + } + + if (ADHOC_ON(pAd)) // Adhoc mode link down + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 1!!!\n")); + + // In an IBSS, a STA's SME responds to Deauthenticate frames from a STA by + // deleting the PTKSA associated with that STA. (Spec. P802.11i/D10 P.19) + if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) + { + for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++) + { + if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i])) + MlmeDeAuthAction(pAd, &pAd->MacTab.Content[i], REASON_DEAUTH_STA_LEAVING, FALSE); + } + } + + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_IndicateMediaState(pAd); + pAd->ExtraInfo = GENERAL_LINK_DOWN; + BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MacTab.Size=%d !!!\n", pAd->MacTab.Size)); + } + else // Infra structure mode + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! LINK DOWN 2!!!\n")); + +#ifdef QOS_DLS_SUPPORT + // DLS tear down frame must be sent before link down + // send DLS-TEAR_DOWN message + if (pAd->CommonCfg.bDLSCapable) + { + // tear down local dls table entry + for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } + + // tear down peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + RTMPSendDLSTearDownFrame(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } + } +#endif // QOS_DLS_SUPPORT // + + + + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + + + // Saved last SSID for linkup comparison + pAd->CommonCfg.LastSsidLen = pAd->CommonCfg.SsidLen; + NdisMoveMemory(pAd->CommonCfg.LastSsid, pAd->CommonCfg.Ssid, pAd->CommonCfg.LastSsidLen); + COPY_MAC_ADDR(pAd->CommonCfg.LastBssid, pAd->CommonCfg.Bssid); + if (pAd->MlmeAux.CurrReqIsFromNdis == TRUE) + { + pAd->IndicateMediaState = NdisMediaStateDisconnected; + RTMP_IndicateMediaState(pAd); + pAd->ExtraInfo = GENERAL_LINK_DOWN; + DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event A!\n")); + pAd->MlmeAux.CurrReqIsFromNdis = FALSE; + } + else + { + if ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_SECURED) || + (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA)) + { + // + // If disassociation request is from NDIS, then we don't need to delete BSSID from entry. + // Otherwise lost beacon or receive De-Authentication from AP, + // then we should delete BSSID from BssTable. + // If we don't delete from entry, roaming will fail. + // + BssTableDeleteEntry(&pAd->ScanTab, pAd->CommonCfg.Bssid, pAd->CommonCfg.Channel); + } + } + + // restore back to - + // 1. long slot (20 us) or short slot (9 us) time + // 2. turn on/off RTS/CTS and/or CTS-to-self protection + // 3. short preamble + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); + +#ifdef EXT_BUILD_CHANNEL_LIST + // Country IE of the AP will be evaluated and will be used. + if (pAd->StaCfg.IEEE80211dClientMode != Rt802_11_D_None) + { + NdisMoveMemory(&pAd->CommonCfg.CountryCode[0], &pAd->StaCfg.StaOriCountryCode[0], 2); + pAd->CommonCfg.Geography = pAd->StaCfg.StaOriGeography; + BuildChannelListEx(pAd); + } +#endif // EXT_BUILD_CHANNEL_LIST // + + } + + + for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++) + { + if (IS_ENTRY_CLIENT(&pAd->MacTab.Content[i])) + MacTableDeleteEntry(pAd, pAd->MacTab.Content[i].Aid, pAd->MacTab.Content[i].Addr); + } + + AsicSetSlotTime(pAd, TRUE); //FALSE); + AsicSetEdcaParm(pAd, NULL); + + // Set LED + RTMPSetLED(pAd, LED_LINK_DOWN); + pAd->LedIndicatorStrength = 0xF0; + RTMPSetSignalLED(pAd, -100); // Force signal strength Led to be turned off, firmware is not done it. + + AsicDisableSync(pAd); + + pAd->Mlme.PeriodicRound = 0; + pAd->Mlme.OneSecPeriodicRound = 0; + +#ifdef DOT11_N_SUPPORT + NdisZeroMemory(&pAd->MlmeAux.HtCapability, sizeof(HT_CAPABILITY_IE)); + NdisZeroMemory(&pAd->MlmeAux.AddHtInfo, sizeof(ADD_HT_INFO_IE)); + pAd->MlmeAux.HtCapabilityLen = 0; + pAd->MlmeAux.NewExtChannelOffset = 0xff; + + DBGPRINT(RT_DEBUG_TRACE, ("LinkDownCleanMlmeAux.ExtCapInfo!\n")); + NdisZeroMemory((PUCHAR)(&pAd->MlmeAux.ExtCapInfo), sizeof(EXT_CAP_INFO_ELEMENT)); +#endif // DOT11_N_SUPPORT // + + // Reset WPA-PSK state. Only reset when supplicant enabled + if (pAd->StaCfg.WpaState != SS_NOTUSE) + { + pAd->StaCfg.WpaState = SS_START; + // Clear Replay counter + NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8); + +#ifdef QOS_DLS_SUPPORT + if (pAd->CommonCfg.bDLSCapable) + NdisZeroMemory(pAd->StaCfg.DlsReplayCounter, 8); +#endif // QOS_DLS_SUPPORT // + } + + // + // if link down come from AP, we need to remove all WPA keys on WPA mode. + // otherwise will cause 4-way handshaking failed, since the WPA key not empty. + // + if ((IsReqFromAP) && (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) + { + // Remove all WPA keys + RTMPWPARemoveAllKeys(pAd); + } + + // 802.1x port control +#ifdef WPA_SUPPLICANT_SUPPORT + // Prevent clear PortSecured here with static WEP + // NetworkManger set security policy first then set SSID to connect AP. + if (pAd->StaCfg.WpaSupplicantUP && + (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled) && + (pAd->StaCfg.IEEE8021X == FALSE)) + { + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + } + else +#endif // WPA_SUPPLICANT_SUPPORT // + { + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; + pAd->StaCfg.PrivacyFilter = Ndis802_11PrivFilter8021xWEP; + } + + NdisAcquireSpinLock(&pAd->MacTabLock); + NdisZeroMemory(&pAd->MacTab, sizeof(MAC_TABLE)); + pAd->MacTab.Content[BSSID_WCID].PortSecured = pAd->StaCfg.PortSecured; + NdisReleaseSpinLock(&pAd->MacTabLock); + + pAd->StaCfg.MicErrCnt = 0; + + pAd->IndicateMediaState = NdisMediaStateDisconnected; + // Update extra information to link is up + pAd->ExtraInfo = GENERAL_LINK_DOWN; + + pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; + + + // Clean association information + NdisZeroMemory(&pAd->StaCfg.AssocInfo, sizeof(NDIS_802_11_ASSOCIATION_INFORMATION)); + pAd->StaCfg.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); + pAd->StaCfg.ReqVarIELen = 0; + pAd->StaCfg.ResVarIELen = 0; + + // + // Reset RSSI value after link down + // + NdisZeroMemory((PUCHAR)(&pAd->StaCfg.RssiSample), sizeof(pAd->StaCfg.RssiSample)); + + // Restore MlmeRate + pAd->CommonCfg.MlmeRate = pAd->CommonCfg.BasicMlmeRate; + pAd->CommonCfg.RtsRate = pAd->CommonCfg.BasicMlmeRate; + +#ifdef DOT11_N_SUPPORT + // + // After Link down, reset piggy-back setting in ASIC. Disable RDG. + // + if (pAd->CommonCfg.BBPCurrentBW == BW_40) + { + pAd->CommonCfg.BBPCurrentBW = BW_20; + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &ByteValue); + ByteValue &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, ByteValue); + } +#endif // DOT11_N_SUPPORT // + // Reset DAC + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R1, &ByteValue); + ByteValue &= (~0x18); + if (pAd->Antenna.field.TxPath == 2) + { + ByteValue |= 0x10; + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R1, ByteValue); + + RTMPSetPiggyBack(pAd,FALSE); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_PIGGYBACK_INUSED); + +#ifdef DOT11_N_SUPPORT + pAd->CommonCfg.BACapability.word = pAd->CommonCfg.REGBACapability.word; +#endif // DOT11_N_SUPPORT // + + // Restore all settings in the following. + AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT|CCKSETPROTECT|OFDMSETPROTECT), TRUE, FALSE); + AsicDisableRDG(pAd); + pAd->CommonCfg.IOTestParm.bCurrentAtheros = FALSE; + pAd->CommonCfg.IOTestParm.bNowAtherosBurstOn = FALSE; + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SCAN_2040); + pAd->CommonCfg.BSSCoexist2040.word = 0; + TriEventInit(pAd); + for (i = 0; i < (pAd->ChannelListNum - 1); i++) + { + pAd->ChannelList[i].bEffectedChannel = FALSE; + } +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + + RTMP_IO_WRITE32(pAd, MAX_LEN_CFG, 0x1fff); + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); +// Allow go to sleep after linkdown steps. +#ifdef PCIE_PS_SUPPORT + + RTMP_SET_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP); +#endif // PCIE_PS_SUPPORT // + +#ifdef WPA_SUPPLICANT_SUPPORT +#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP) { + //send disassociate event to wpa_supplicant + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, RT_DISASSOC_EVENT_FLAG, NULL, NULL, 0); + } +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // +#endif // WPA_SUPPLICANT_SUPPORT // + +#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT + RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0); +#endif // NATIVE_WPA_SUPPLICANT_SUPPORT // + +#ifdef RT30xx + if ((IS_RT30xx(pAd) || IS_RT3090(pAd)||IS_RT3390(pAd)) + &&(pAd->Antenna.field.RxPath>1||pAd->Antenna.field.TxPath>1)) + { + RTMP_ASIC_MMPS_DISABLE(pAd); + } +#endif // RT30xx // + +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID IterateOnBssTab( + IN PRTMP_ADAPTER pAd) +{ + MLME_START_REQ_STRUCT StartReq; + MLME_JOIN_REQ_STRUCT JoinReq; + ULONG BssIdx; + BSS_ENTRY *pInBss = NULL; + + // Change the wepstatus to original wepstatus + pAd->StaCfg.WepStatus = pAd->StaCfg.OrigWepStatus; + pAd->StaCfg.PairCipher = pAd->StaCfg.OrigWepStatus; + pAd->StaCfg.GroupCipher = pAd->StaCfg.OrigWepStatus; + + BssIdx = pAd->MlmeAux.BssIdx; + + if (pAd->StaCfg.BssType == BSS_ADHOC) + { + if (BssIdx < pAd->MlmeAux.SsidBssTab.BssNr) + { + pInBss = &pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx]; + if ((pAd->StaCfg.AuthMode == pInBss->AuthMode) && + (pAd->StaCfg.WepStatus == pInBss->WepStatus)) + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - iterate BSS %ld of %d\n", BssIdx, pAd->MlmeAux.SsidBssTab.BssNr)); + JoinParmFill(pAd, &JoinReq, BssIdx); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ, sizeof(MLME_JOIN_REQ_STRUCT), + &JoinReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN; + return; + } + } + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All BSS fail; start a new ADHOC (Ssid=%s)...\n",pAd->MlmeAux.Ssid)); + StartParmFill(pAd, &StartReq, (PCHAR)pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_START_REQ, sizeof(MLME_START_REQ_STRUCT), &StartReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_START; + } + else if ((BssIdx < pAd->MlmeAux.SsidBssTab.BssNr) && + (pAd->StaCfg.BssType == BSS_INFRA)) + { + pInBss = &pAd->MlmeAux.SsidBssTab.BssEntry[BssIdx]; + // Check cipher suite, AP must have more secured cipher than station setting + // Set the Pairwise and Group cipher to match the intended AP setting + // We can only connect to AP with less secured cipher setting + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) + { + pAd->StaCfg.GroupCipher = pInBss->WPA.GroupCipher; + + if (pAd->StaCfg.WepStatus == pInBss->WPA.PairCipher) + pAd->StaCfg.PairCipher = pInBss->WPA.PairCipher; + else if (pInBss->WPA.PairCipherAux != Ndis802_11WEPDisabled) + pAd->StaCfg.PairCipher = pInBss->WPA.PairCipherAux; + else // There is no PairCipher Aux, downgrade our capability to TKIP + pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; + } + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + pAd->StaCfg.GroupCipher = pInBss->WPA2.GroupCipher; + + if (pAd->StaCfg.WepStatus == pInBss->WPA2.PairCipher) + pAd->StaCfg.PairCipher = pInBss->WPA2.PairCipher; + else if (pInBss->WPA2.PairCipherAux != Ndis802_11WEPDisabled) + pAd->StaCfg.PairCipher = pInBss->WPA2.PairCipherAux; + else // There is no PairCipher Aux, downgrade our capability to TKIP + pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; + + // RSN capability + pAd->StaCfg.RsnCapability = pInBss->WPA2.RsnCapability; + } + + // Set Mix cipher flag + pAd->StaCfg.bMixCipher = (pAd->StaCfg.PairCipher == pAd->StaCfg.GroupCipher) ? FALSE : TRUE; + /*if (pAd->StaCfg.bMixCipher == TRUE) + { + // If mix cipher, re-build RSNIE + RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, 0); + }*/ + + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - iterate BSS %ld of %d\n", BssIdx, pAd->MlmeAux.SsidBssTab.BssNr)); + JoinParmFill(pAd, &JoinReq, BssIdx); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_JOIN_REQ, sizeof(MLME_JOIN_REQ_STRUCT), + &JoinReq, 0); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_JOIN; + } + else // no more BSS + { + +#ifdef DOT11_N_SUPPORT +#endif // DOT11_N_SUPPORT // + { + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + BssTableInit(&pAd->ScanTab); + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\n",pAd->CommonCfg.Channel, pAd->ScanTab.BssNr)); + } + + if (pAd->MlmeAux.SsidBssTab.BssNr == 1) + { + pAd->MlmeAux.SsidBssTab.BssNr = 0; + BssTableDeleteEntry(&pAd->ScanTab, + pAd->MlmeAux.SsidBssTab.BssEntry[0].Bssid, + pAd->MlmeAux.SsidBssTab.BssEntry[0].Channel); + } + + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + } +} + +// for re-association only +// IRQL = DISPATCH_LEVEL +VOID IterateOnBssTab2( + IN PRTMP_ADAPTER pAd) +{ + MLME_REASSOC_REQ_STRUCT ReassocReq; + ULONG BssIdx; + BSS_ENTRY *pBss; + + BssIdx = pAd->MlmeAux.RoamIdx; + pBss = &pAd->MlmeAux.RoamTab.BssEntry[BssIdx]; + + if (BssIdx < pAd->MlmeAux.RoamTab.BssNr) + { + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - iterate BSS %ld of %d\n", BssIdx, pAd->MlmeAux.RoamTab.BssNr)); + + AsicSwitchChannel(pAd, pBss->Channel, FALSE); + AsicLockChannel(pAd, pBss->Channel); + + // reassociate message has the same structure as associate message + AssocParmFill(pAd, &ReassocReq, pBss->Bssid, pBss->CapabilityInfo, + ASSOC_TIMEOUT, pAd->StaCfg.DefaultListenCount); + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_REASSOC_REQ, + sizeof(MLME_REASSOC_REQ_STRUCT), &ReassocReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_REASSOC; + } + else // no more BSS + { + +#ifdef DOT11_N_SUPPORT +#endif // DOT11_N_SUPPORT // + { + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + DBGPRINT(RT_DEBUG_TRACE, ("CNTL - All roaming failed, restore to channel %d, Total BSS[%02d]\n",pAd->CommonCfg.Channel, pAd->ScanTab.BssNr)); + } + + pAd->Mlme.CntlMachine.CurrState = CNTL_IDLE; + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID JoinParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_JOIN_REQ_STRUCT *JoinReq, + IN ULONG BssIdx) +{ + JoinReq->BssIdx = BssIdx; +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID ScanParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_SCAN_REQ_STRUCT *ScanReq, + IN STRING Ssid[], + IN UCHAR SsidLen, + IN UCHAR BssType, + IN UCHAR ScanType) +{ + NdisZeroMemory(ScanReq->Ssid, MAX_LEN_OF_SSID); + ScanReq->SsidLen = SsidLen; + NdisMoveMemory(ScanReq->Ssid, Ssid, SsidLen); + ScanReq->BssType = BssType; + ScanReq->ScanType = ScanType; +} + +#ifdef QOS_DLS_SUPPORT +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID DlsParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_DLS_REQ_STRUCT *pDlsReq, + IN PRT_802_11_DLS pDls, + IN USHORT reason) +{ + pDlsReq->pDLS = pDls; + pDlsReq->Reason = reason; +} +#endif // QOS_DLS_SUPPORT // + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID StartParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_START_REQ_STRUCT *StartReq, + IN CHAR Ssid[], + IN UCHAR SsidLen) +{ + ASSERT(SsidLen <= MAX_LEN_OF_SSID); + NdisMoveMemory(StartReq->Ssid, Ssid, SsidLen); + StartReq->SsidLen = SsidLen; +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +VOID AuthParmFill( + IN PRTMP_ADAPTER pAd, + IN OUT MLME_AUTH_REQ_STRUCT *AuthReq, + IN PUCHAR pAddr, + IN USHORT Alg) +{ + COPY_MAC_ADDR(AuthReq->Addr, pAddr); + AuthReq->Alg = Alg; + AuthReq->Timeout = AUTH_TIMEOUT; +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +#ifdef RTMP_MAC_PCI +VOID ComposePsPoll( + IN PRTMP_ADAPTER pAd) +{ + NdisZeroMemory(&pAd->PsPollFrame, sizeof(PSPOLL_FRAME)); + pAd->PsPollFrame.FC.Type = BTYPE_CNTL; + pAd->PsPollFrame.FC.SubType = SUBTYPE_PS_POLL; + pAd->PsPollFrame.Aid = pAd->StaActive.Aid | 0xC000; + COPY_MAC_ADDR(pAd->PsPollFrame.Bssid, pAd->CommonCfg.Bssid); + COPY_MAC_ADDR(pAd->PsPollFrame.Ta, pAd->CurrentAddress); +} + +// IRQL = DISPATCH_LEVEL +VOID ComposeNullFrame( + IN PRTMP_ADAPTER pAd) +{ + NdisZeroMemory(&pAd->NullFrame, sizeof(HEADER_802_11)); + pAd->NullFrame.FC.Type = BTYPE_DATA; + pAd->NullFrame.FC.SubType = SUBTYPE_NULL_FUNC; + pAd->NullFrame.FC.ToDs = 1; + COPY_MAC_ADDR(pAd->NullFrame.Addr1, pAd->CommonCfg.Bssid); + COPY_MAC_ADDR(pAd->NullFrame.Addr2, pAd->CurrentAddress); + COPY_MAC_ADDR(pAd->NullFrame.Addr3, pAd->CommonCfg.Bssid); +} +#endif // RTMP_MAC_PCI // + + + + +/* + ========================================================================== + Description: + Pre-build a BEACON frame in the shared memory + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + ========================================================================== +*/ +ULONG MakeIbssBeacon( + IN PRTMP_ADAPTER pAd) +{ + UCHAR DsLen = 1, IbssLen = 2; + UCHAR LocalErpIe[3] = {IE_ERP, 1, 0x04}; + HEADER_802_11 BcnHdr; + USHORT CapabilityInfo; + LARGE_INTEGER FakeTimestamp; + ULONG FrameLen = 0; + PTXWI_STRUC pTxWI = &pAd->BeaconTxWI; + UCHAR *pBeaconFrame = pAd->BeaconBuf; + BOOLEAN Privacy; + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR SupRateLen = 0; + UCHAR ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR ExtRateLen = 0; + + if ((pAd->CommonCfg.PhyMode == PHY_11B) && (pAd->CommonCfg.Channel <= 14)) + { + SupRate[0] = 0x82; // 1 mbps + SupRate[1] = 0x84; // 2 mbps + SupRate[2] = 0x8b; // 5.5 mbps + SupRate[3] = 0x96; // 11 mbps + SupRateLen = 4; + ExtRateLen = 0; + } + else if (pAd->CommonCfg.Channel > 14) + { + SupRate[0] = 0x8C; // 6 mbps, in units of 0.5 Mbps, basic rate + SupRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps + SupRate[2] = 0x98; // 12 mbps, in units of 0.5 Mbps, basic rate + SupRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps + SupRate[4] = 0xb0; // 24 mbps, in units of 0.5 Mbps, basic rate + SupRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps + SupRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps + SupRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps + SupRateLen = 8; + ExtRateLen = 0; + + // + // Also Update MlmeRate & RtsRate for G only & A only + // + pAd->CommonCfg.MlmeRate = RATE_6; + pAd->CommonCfg.RtsRate = RATE_6; + pAd->CommonCfg.MlmeTransmit.field.MODE = MODE_OFDM; + pAd->CommonCfg.MlmeTransmit.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; + pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MODE = MODE_OFDM; + pAd->MacTab.Content[BSS0Mcast_WCID].HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pAd->CommonCfg.MlmeRate]; + } + else + { + SupRate[0] = 0x82; // 1 mbps + SupRate[1] = 0x84; // 2 mbps + SupRate[2] = 0x8b; // 5.5 mbps + SupRate[3] = 0x96; // 11 mbps + SupRateLen = 4; + + ExtRate[0] = 0x0C; // 6 mbps, in units of 0.5 Mbps, + ExtRate[1] = 0x12; // 9 mbps, in units of 0.5 Mbps + ExtRate[2] = 0x18; // 12 mbps, in units of 0.5 Mbps, + ExtRate[3] = 0x24; // 18 mbps, in units of 0.5 Mbps + ExtRate[4] = 0x30; // 24 mbps, in units of 0.5 Mbps, + ExtRate[5] = 0x48; // 36 mbps, in units of 0.5 Mbps + ExtRate[6] = 0x60; // 48 mbps, in units of 0.5 Mbps + ExtRate[7] = 0x6c; // 54 mbps, in units of 0.5 Mbps + ExtRateLen = 8; + } + + pAd->StaActive.SupRateLen = SupRateLen; + NdisMoveMemory(pAd->StaActive.SupRate, SupRate, SupRateLen); + pAd->StaActive.ExtRateLen = ExtRateLen; + NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, ExtRateLen); + + // compose IBSS beacon frame + MgtMacHeaderInit(pAd, &BcnHdr, SUBTYPE_BEACON, 0, BROADCAST_ADDR, pAd->CommonCfg.Bssid); + Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || + (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || + (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled); + CapabilityInfo = CAP_GENERATE(0, 1, Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 0, 0); + + MakeOutgoingFrame(pBeaconFrame, &FrameLen, + sizeof(HEADER_802_11), &BcnHdr, + TIMESTAMP_LEN, &FakeTimestamp, + 2, &pAd->CommonCfg.BeaconPeriod, + 2, &CapabilityInfo, + 1, &SsidIe, + 1, &pAd->CommonCfg.SsidLen, + pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid, + 1, &SupRateIe, + 1, &SupRateLen, + SupRateLen, SupRate, + 1, &DsIe, + 1, &DsLen, + 1, &pAd->CommonCfg.Channel, + 1, &IbssIe, + 1, &IbssLen, + 2, &pAd->StaActive.AtimWin, + END_OF_ARGS); + + // add ERP_IE and EXT_RAE IE of in 802.11g + if (ExtRateLen) + { + ULONG tmp; + + MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp, + 3, LocalErpIe, + 1, &ExtRateIe, + 1, &ExtRateLen, + ExtRateLen, ExtRate, + END_OF_ARGS); + FrameLen += tmp; + } + + // If adhoc secruity is set for WPA-None, append the cipher suite IE + if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) + { + ULONG tmp; + UCHAR RSNIe = IE_WPA; + RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0); + + MakeOutgoingFrame(pBeaconFrame + FrameLen, &tmp, + 1, &RSNIe, + 1, &pAd->StaCfg.RSNIE_Len, + pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE, + END_OF_ARGS); + FrameLen += tmp; + } + +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->StaCfg.bAdhocN == TRUE)) + { + ULONG TmpLen; + UCHAR HtLen, HtLen1; + +#ifdef RT_BIG_ENDIAN + HT_CAPABILITY_IE HtCapabilityTmp; + ADD_HT_INFO_IE addHTInfoTmp; + USHORT b2lTmp, b2lTmp2; +#endif + + // add HT Capability IE + HtLen = sizeof(pAd->CommonCfg.HtCapability); + HtLen1 = sizeof(pAd->CommonCfg.AddHTInfo); +#ifndef RT_BIG_ENDIAN + MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, + 1, &HtCapIe, + 1, &HtLen, + HtLen, &pAd->CommonCfg.HtCapability, + 1, &AddHtInfoIe, + 1, &HtLen1, + HtLen1, &pAd->CommonCfg.AddHTInfo, + END_OF_ARGS); +#else + NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen); + *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); + *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); + + NdisMoveMemory(&addHTInfoTmp, &pAd->CommonCfg.AddHTInfo, HtLen1); + *(USHORT *)(&addHTInfoTmp.AddHtInfo2) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo2)); + *(USHORT *)(&addHTInfoTmp.AddHtInfo3) = SWAP16(*(USHORT *)(&addHTInfoTmp.AddHtInfo3)); + + MakeOutgoingFrame(pBeaconFrame+FrameLen, &TmpLen, + 1, &HtCapIe, + 1, &HtLen, + HtLen, &HtCapabilityTmp, + 1, &AddHtInfoIe, + 1, &HtLen1, + HtLen1, &addHTInfoTmp, + END_OF_ARGS); +#endif + FrameLen += TmpLen; + } +#endif // DOT11_N_SUPPORT // + + //beacon use reserved WCID 0xff + if (pAd->CommonCfg.Channel > 14) + { + RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, 0xff, FrameLen, + PID_MGMT, PID_BEACON, RATE_1, IFS_HTTXOP, FALSE, &pAd->CommonCfg.MlmeTransmit); + } + else + { + // Set to use 1Mbps for Adhoc beacon. + HTTRANSMIT_SETTING Transmit; + Transmit.word = 0; + RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, 0, 0xff, FrameLen, + PID_MGMT, PID_BEACON, RATE_1, IFS_HTTXOP, FALSE, &Transmit); + } + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, pBeaconFrame, DIR_WRITE, FALSE); + RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI); +#endif + + DBGPRINT(RT_DEBUG_TRACE, ("MakeIbssBeacon (len=%ld), SupRateLen=%d, ExtRateLen=%d, Channel=%d, PhyMode=%d\n", + FrameLen, SupRateLen, ExtRateLen, pAd->CommonCfg.Channel, pAd->CommonCfg.PhyMode)); + return FrameLen; +} + +VOID InitChannelRelatedValue( + IN PRTMP_ADAPTER pAd) +{ + UCHAR Value = 0; + UINT32 Data = 0; + +#ifdef RTMP_MAC_PCI + // In power save , We will force use 1R. + // So after link up, check Rx antenna # again. + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); + if(pAd->Antenna.field.RxPath == 3) + { + Value |= (0x10); + } + else if(pAd->Antenna.field.RxPath == 2) + { + Value |= (0x8); + } + else if(pAd->Antenna.field.RxPath == 1) + { + Value |= (0x0); + } + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); + pAd->StaCfg.BBPR3 = Value; +#endif // RTMP_MAC_PCI // + + pAd->CommonCfg.CentralChannel = pAd->MlmeAux.CentralChannel; + pAd->CommonCfg.Channel = pAd->MlmeAux.Channel; +#ifdef DOT11_N_SUPPORT + // Change to AP channel + if ((pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) + { + // Must using 40MHz. + pAd->CommonCfg.BBPCurrentBW = BW_40; + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value); + Value &= (~0x18); + Value |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value); + + // RX : control channel at lower + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); + Value &= (~0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); +#ifdef RTMP_MAC_PCI + pAd->StaCfg.BBPR3 = Value; +#endif // RTMP_MAC_PCI // + + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data); + Data &= 0xfffffffe; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data); + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16); + DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); + } + + DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel )); + } + else if ((pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) && (pAd->MlmeAux.HtCapability.HtCapInfo.ChannelWidth == BW_40)) + { + // Must using 40MHz. + pAd->CommonCfg.BBPCurrentBW = BW_40; + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value); + Value &= (~0x18); + Value |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value); + + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data); + Data |= 0x1; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); + Value |= (0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); +#ifdef RTMP_MAC_PCI + pAd->StaCfg.BBPR3 = Value; +#endif // RTMP_MAC_PCI // + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16); + DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); + } + + DBGPRINT(RT_DEBUG_TRACE, ("!!! 40MHz Upper !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel )); + } + else +#endif // DOT11_N_SUPPORT // + { + pAd->CommonCfg.BBPCurrentBW = BW_20; + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value); + Value &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value); + + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data); + Data &= 0xfffffffe; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); + Value &= (~0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); +#ifdef RTMP_MAC_PCI + pAd->StaCfg.BBPR3 = Value; +#endif // RTMP_MAC_PCI // + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11); + DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); + } + + DBGPRINT(RT_DEBUG_TRACE, ("!!! 20MHz !!! \n" )); + } + + RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW); +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/dls.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/dls.c new file mode 100644 index 000000000..5e154940b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/dls.c @@ -0,0 +1,2235 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + dls.c + + Abstract: + Handle WMM-DLS state machine + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Rory Chen 02-14-2006 + Arvin Tai 06-03-2008 Modified for RT28xx + */ + +#include "rt_config.h" + +/* + ========================================================================== + Description: + dls state machine init, including state transition and timer init + Parameters: + Sm - pointer to the dls state machine + Note: + The state machine looks like this + + DLS_IDLE + MT2_MLME_DLS_REQUEST MlmeDlsReqAction + MT2_PEER_DLS_REQUEST PeerDlsReqAction + MT2_PEER_DLS_RESPONSE PeerDlsRspAction + MT2_MLME_DLS_TEARDOWN MlmeTearDownAction + MT2_PEER_DLS_TEARDOWN PeerTearDownAction + + IRQL = PASSIVE_LEVEL + + ========================================================================== + */ +void DlsStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]) +{ + UCHAR i; + + StateMachineInit(Sm, (STATE_MACHINE_FUNC*)Trans, MAX_DLS_STATE, MAX_DLS_MSG, (STATE_MACHINE_FUNC)Drop, DLS_IDLE, DLS_MACHINE_BASE); + + // the first column + StateMachineSetAction(Sm, DLS_IDLE, MT2_MLME_DLS_REQ, (STATE_MACHINE_FUNC)MlmeDlsReqAction); + StateMachineSetAction(Sm, DLS_IDLE, MT2_PEER_DLS_REQ, (STATE_MACHINE_FUNC)PeerDlsReqAction); + StateMachineSetAction(Sm, DLS_IDLE, MT2_PEER_DLS_RSP, (STATE_MACHINE_FUNC)PeerDlsRspAction); + StateMachineSetAction(Sm, DLS_IDLE, MT2_MLME_DLS_TEAR_DOWN, (STATE_MACHINE_FUNC)MlmeDlsTearDownAction); + StateMachineSetAction(Sm, DLS_IDLE, MT2_PEER_DLS_TEAR_DOWN, (STATE_MACHINE_FUNC)PeerDlsTearDownAction); + + for (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + pAd->StaCfg.DLSEntry[i].pAd = pAd; + RTMPInitTimer(pAd, &pAd->StaCfg.DLSEntry[i].Timer, GET_TIMER_FUNCTION(DlsTimeoutAction), pAd, FALSE); + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeDlsReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + HEADER_802_11 DlsReqHdr; + PRT_802_11_DLS pDLS = NULL; + UCHAR Category = CATEGORY_DLS; + UCHAR Action = ACTION_DLS_REQUEST; + ULONG tmp; + USHORT reason; + ULONG Timeout; + BOOLEAN TimerCancelled; + + if(!MlmeDlsReqSanity(pAd, Elem->Msg, Elem->MsgLen, &pDLS, &reason)) + return; + + DBGPRINT(RT_DEBUG_TRACE,("DLS - MlmeDlsReqAction() \n")); + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_ERROR,("DLS - MlmeDlsReqAction() allocate memory failed \n")); + return; + } + + ActHeaderInit(pAd, &DlsReqHdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + + // Build basic frame first + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &DlsReqHdr, + 1, &Category, + 1, &Action, + 6, &pDLS->MacAddr, + 6, pAd->CurrentAddress, + 2, &pAd->StaActive.CapabilityInfo, + 2, &pDLS->TimeOut, + 1, &SupRateIe, + 1, &pAd->MlmeAux.SupRateLen, + pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate, + END_OF_ARGS); + + if (pAd->MlmeAux.ExtRateLen != 0) + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &ExtRateIe, + 1, &pAd->MlmeAux.ExtRateLen, + pAd->MlmeAux.ExtRateLen, pAd->MlmeAux.ExtRate, + END_OF_ARGS); + FrameLen += tmp; + } + +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + { + UCHAR HtLen; + +#ifdef RT_BIG_ENDIAN + HT_CAPABILITY_IE HtCapabilityTmp; +#endif + + // add HT Capability IE + HtLen = sizeof(HT_CAPABILITY_IE); +#ifndef RT_BIG_ENDIAN + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &HtCapIe, + 1, &HtLen, + HtLen, &pAd->CommonCfg.HtCapability, + END_OF_ARGS); +#else + NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen); + *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); + *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); + + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &HtCapIe, + 1, &HtLen, + HtLen, &HtCapabilityTmp, + END_OF_ARGS); +#endif + FrameLen = FrameLen + tmp; + } +#endif // DOT11_N_SUPPORT // + + RTMPCancelTimer(&pDLS->Timer, &TimerCancelled); + Timeout = DLS_TIMEOUT; + RTMPSetTimer(&pDLS->Timer, Timeout); + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerDlsReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + USHORT StatusCode = MLME_SUCCESS; + HEADER_802_11 DlsRspHdr; + UCHAR Category = CATEGORY_DLS; + UCHAR Action = ACTION_DLS_RESPONSE; + ULONG tmp; + USHORT CapabilityInfo; + UCHAR DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN]; + USHORT DLSTimeOut; + SHORT i; + ULONG Timeout; + BOOLEAN TimerCancelled; + PRT_802_11_DLS pDLS = NULL; + UCHAR MaxSupportedRateIn500Kbps = 0; + UCHAR SupportedRatesLen; + UCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR HtCapabilityLen; + HT_CAPABILITY_IE HtCapability; + + if (!PeerDlsReqSanity(pAd, Elem->Msg, Elem->MsgLen, DA, SA, &CapabilityInfo, &DLSTimeOut, + &SupportedRatesLen, &SupportedRates[0], &HtCapabilityLen, &HtCapability)) + return; + + // supported rates array may not be sorted. sort it and find the maximum rate + for (i = 0; i < SupportedRatesLen; i++) + { + if (MaxSupportedRateIn500Kbps < (SupportedRates[i] & 0x7f)) + MaxSupportedRateIn500Kbps = SupportedRates[i] & 0x7f; + } + + DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsReqAction() from %02x:%02x:%02x:%02x:%02x:%02x\n", SA[0], SA[1], SA[2], SA[3], SA[4], SA[5])); + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsReqAction() allocate memory failed \n")); + return; + } + + if (!INFRA_ON(pAd)) + { + StatusCode = MLME_REQUEST_DECLINED; + } + else if (!pAd->CommonCfg.bWmmCapable) + { + StatusCode = MLME_DEST_STA_IS_NOT_A_QSTA; + } + else if (!pAd->CommonCfg.bDLSCapable) + { + StatusCode = MLME_REQUEST_DECLINED; + } + else + { + // find table to update parameters + for (i = (MAX_NUM_OF_DLS_ENTRY-1); i >= 0; i--) + { + if (pAd->StaCfg.DLSEntry[i].Valid && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + pAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY; + else + { + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + pAd->StaCfg.DLSEntry[i].Status = DLS_FINISH; + } + + pAd->StaCfg.DLSEntry[i].Sequence = 0; + pAd->StaCfg.DLSEntry[i].TimeOut = DLSTimeOut; + pAd->StaCfg.DLSEntry[i].CountDownTimer = DLSTimeOut; + if (HtCapabilityLen != 0) + pAd->StaCfg.DLSEntry[i].bHTCap = TRUE; + else + pAd->StaCfg.DLSEntry[i].bHTCap = FALSE; + pDLS = &pAd->StaCfg.DLSEntry[i]; + break; + } + } + + // can not find in table, create a new one + if (i < 0) + { + DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsReqAction() can not find same entry \n")); + for (i=(MAX_NUM_OF_DLS_ENTRY - 1); i >= MAX_NUM_OF_INIT_DLS_ENTRY; i--) + { + if (!pAd->StaCfg.DLSEntry[i].Valid) + { + MAC_TABLE_ENTRY *pEntry; + UCHAR MaxSupportedRate = RATE_11; + + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + { + pAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY; + } + else + { + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + pAd->StaCfg.DLSEntry[i].Status = DLS_FINISH; + } + + pAd->StaCfg.DLSEntry[i].Sequence = 0; + pAd->StaCfg.DLSEntry[i].Valid = TRUE; + pAd->StaCfg.DLSEntry[i].TimeOut = DLSTimeOut; + pAd->StaCfg.DLSEntry[i].CountDownTimer = DLSTimeOut; + NdisMoveMemory(pAd->StaCfg.DLSEntry[i].MacAddr, SA, MAC_ADDR_LEN); + if (HtCapabilityLen != 0) + pAd->StaCfg.DLSEntry[i].bHTCap = TRUE; + else + pAd->StaCfg.DLSEntry[i].bHTCap = FALSE; + pDLS = &pAd->StaCfg.DLSEntry[i]; + pEntry = MacTableInsertDlsEntry(pAd, SA, i); + + switch (MaxSupportedRateIn500Kbps) + { + case 108: MaxSupportedRate = RATE_54; break; + case 96: MaxSupportedRate = RATE_48; break; + case 72: MaxSupportedRate = RATE_36; break; + case 48: MaxSupportedRate = RATE_24; break; + case 36: MaxSupportedRate = RATE_18; break; + case 24: MaxSupportedRate = RATE_12; break; + case 18: MaxSupportedRate = RATE_9; break; + case 12: MaxSupportedRate = RATE_6; break; + case 22: MaxSupportedRate = RATE_11; break; + case 11: MaxSupportedRate = RATE_5_5; break; + case 4: MaxSupportedRate = RATE_2; break; + case 2: MaxSupportedRate = RATE_1; break; + default: MaxSupportedRate = RATE_11; break; + } + + pEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate); + + if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) + { + pEntry->MaxHTPhyMode.field.MODE = MODE_CCK; + pEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate; + pEntry->MinHTPhyMode.field.MODE = MODE_CCK; + pEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate; + pEntry->HTPhyMode.field.MODE = MODE_CCK; + pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate; + } + else + { + pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM; + pEntry->MaxHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + pEntry->MinHTPhyMode.field.MODE = MODE_OFDM; + pEntry->MinHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + pEntry->HTPhyMode.field.MODE = MODE_OFDM; + pEntry->HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + } + + pEntry->MaxHTPhyMode.field.BW = BW_20; + pEntry->MinHTPhyMode.field.BW = BW_20; + +#ifdef DOT11_N_SUPPORT + pEntry->HTCapability.MCSSet[0] = 0; + pEntry->HTCapability.MCSSet[1] = 0; + + // If this Entry supports 802.11n, upgrade to HT rate. + if ((HtCapabilityLen != 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + { + UCHAR j, bitmask; //k,bitmask; + CHAR ii; + + DBGPRINT(RT_DEBUG_TRACE, ("DLS - PeerDlsReqAction() Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\n", + SA[0], SA[1], SA[2], SA[3], SA[4], SA[5])); + + if ((HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF)) + { + pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD; + } + else + { + pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; + pAd->MacTab.fAnyStationNonGF = TRUE; + pAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1; + } + + if ((HtCapability.HtCapInfo.ChannelWidth) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth)) + { + pEntry->MaxHTPhyMode.field.BW= BW_40; + pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(HtCapability.HtCapInfo.ShortGIfor40)); + } + else + { + pEntry->MaxHTPhyMode.field.BW = BW_20; + pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(HtCapability.HtCapInfo.ShortGIfor20)); + pAd->MacTab.fAnyStation20Only = TRUE; + } + + // find max fixed rate + for (ii=15; ii>=0; ii--) + { + j = ii/8; + bitmask = (1<<(ii-(j*8))); + if ( (pAd->StaCfg.DesiredHtPhyInfo.MCSSet[j]&bitmask) && (HtCapability.MCSSet[j]&bitmask)) + { + pEntry->MaxHTPhyMode.field.MCS = ii; + break; + } + if (ii==0) + break; + } + + + if (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) + { + + DBGPRINT(RT_DEBUG_OFF, ("@@@ pAd->CommonCfg.RegTransmitSetting.field.MCS = %d\n", + pAd->StaCfg.DesiredTransmitSetting.field.MCS)); + if (pAd->StaCfg.DesiredTransmitSetting.field.MCS == 32) + { + // Fix MCS as HT Duplicated Mode + pEntry->MaxHTPhyMode.field.BW = 1; + pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; + pEntry->MaxHTPhyMode.field.STBC = 0; + pEntry->MaxHTPhyMode.field.ShortGI = 0; + pEntry->MaxHTPhyMode.field.MCS = 32; + } + else if (pEntry->MaxHTPhyMode.field.MCS > pAd->StaCfg.HTPhyMode.field.MCS) + { + // STA supports fixed MCS + pEntry->MaxHTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + } + } + + pEntry->MaxHTPhyMode.field.STBC = (HtCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC)); + pEntry->MpduDensity = HtCapability.HtCapParm.MpduDensity; + pEntry->MaxRAmpduFactor = HtCapability.HtCapParm.MaxRAmpduFactor; + pEntry->MmpsMode = (UCHAR)HtCapability.HtCapInfo.MimoPs; + pEntry->AMsduSize = (UCHAR)HtCapability.HtCapInfo.AMsduSize; + pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; + + if (HtCapability.HtCapInfo.ShortGIfor20) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE); + if (HtCapability.HtCapInfo.ShortGIfor40) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE); + if (HtCapability.HtCapInfo.TxSTBC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE); + if (HtCapability.HtCapInfo.RxSTBC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE); + if (HtCapability.ExtHtCapInfo.PlusHTC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE); + if (pAd->CommonCfg.bRdg && HtCapability.ExtHtCapInfo.RDGSupport) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE); + if (HtCapability.ExtHtCapInfo.MCSFeedback == 0x03) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE); + + NdisMoveMemory(&pEntry->HTCapability, &HtCapability, sizeof(HT_CAPABILITY_IE)); + } +#endif // DOT11_N_SUPPORT // + + pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; + pEntry->CurrTxRate = pEntry->MaxSupportedRate; + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); + + if (pAd->StaCfg.bAutoTxRateSwitch == TRUE) + { + PUCHAR pTable; + UCHAR TableSize = 0; + + MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &pEntry->CurrTxRateIndex); + pEntry->bAutoTxRateSwitch = TRUE; + } + else + { + pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE; + pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + pEntry->bAutoTxRateSwitch = FALSE; + + RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry); + } + pEntry->RateLen = SupportedRatesLen; + + break; + } + } + } + StatusCode = MLME_SUCCESS; + + // can not find in table, create a new one + if (i < 0) + { + StatusCode = MLME_QOS_UNSPECIFY; + DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsReqAction() DLSEntry table full(only can support %d DLS session) \n", MAX_NUM_OF_DLS_ENTRY - MAX_NUM_OF_INIT_DLS_ENTRY)); + } + else + { + DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsReqAction() use entry(%d) %02x:%02x:%02x:%02x:%02x:%02x\n", + i, SA[0], SA[1], SA[2], SA[3], SA[4], SA[5])); + } + } + + ActHeaderInit(pAd, &DlsRspHdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + + // Build basic frame first + if (StatusCode == MLME_SUCCESS) + { + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &DlsRspHdr, + 1, &Category, + 1, &Action, + 2, &StatusCode, + 6, SA, + 6, pAd->CurrentAddress, + 2, &pAd->StaActive.CapabilityInfo, + 1, &SupRateIe, + 1, &pAd->MlmeAux.SupRateLen, + pAd->MlmeAux.SupRateLen, pAd->MlmeAux.SupRate, + END_OF_ARGS); + + if (pAd->MlmeAux.ExtRateLen != 0) + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &ExtRateIe, + 1, &pAd->MlmeAux.ExtRateLen, + pAd->MlmeAux.ExtRateLen, pAd->MlmeAux.ExtRate, + END_OF_ARGS); + FrameLen += tmp; + } + +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + { + UCHAR HtLen; + +#ifdef RT_BIG_ENDIAN + HT_CAPABILITY_IE HtCapabilityTmp; +#endif + + // add HT Capability IE + HtLen = sizeof(HT_CAPABILITY_IE); +#ifndef RT_BIG_ENDIAN + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &HtCapIe, + 1, &HtLen, + HtLen, &pAd->CommonCfg.HtCapability, + END_OF_ARGS); +#else + NdisMoveMemory(&HtCapabilityTmp, &pAd->CommonCfg.HtCapability, HtLen); + *(USHORT *)(&HtCapabilityTmp.HtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.HtCapInfo)); + *(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo) = SWAP16(*(USHORT *)(&HtCapabilityTmp.ExtHtCapInfo)); + + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &HtCapIe, + 1, &HtLen, + HtLen, &HtCapabilityTmp, + END_OF_ARGS); +#endif + FrameLen = FrameLen + tmp; + } +#endif // DOT11_N_SUPPORT // + + if (pDLS && (pDLS->Status != DLS_FINISH)) + { + RTMPCancelTimer(&pDLS->Timer, &TimerCancelled); + Timeout = DLS_TIMEOUT; + RTMPSetTimer(&pDLS->Timer, Timeout); + } + } + else + { + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &DlsRspHdr, + 1, &Category, + 1, &Action, + 2, &StatusCode, + 6, SA, + 6, pAd->CurrentAddress, + END_OF_ARGS); + } + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerDlsRspAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT CapabilityInfo; + UCHAR DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN]; + USHORT StatusCode; + SHORT i; + BOOLEAN TimerCancelled; + UCHAR MaxSupportedRateIn500Kbps = 0; + UCHAR SupportedRatesLen; + UCHAR SupportedRates[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR HtCapabilityLen; + HT_CAPABILITY_IE HtCapability; + + if (!pAd->CommonCfg.bDLSCapable) + return; + + if (!INFRA_ON(pAd)) + return; + + if (!PeerDlsRspSanity(pAd, Elem->Msg, Elem->MsgLen, DA, SA, &CapabilityInfo, &StatusCode, + &SupportedRatesLen, &SupportedRates[0], &HtCapabilityLen, &HtCapability)) + return; + + // supported rates array may not be sorted. sort it and find the maximum rate + for (i=0; i<SupportedRatesLen; i++) + { + if (MaxSupportedRateIn500Kbps < (SupportedRates[i] & 0x7f)) + MaxSupportedRateIn500Kbps = SupportedRates[i] & 0x7f; + } + + DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x with StatusCode=%d, CapabilityInfo=0x%x\n", + SA[0], SA[1], SA[2], SA[3], SA[4], SA[5], StatusCode, CapabilityInfo)); + + for (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + if (StatusCode == MLME_SUCCESS) + { + MAC_TABLE_ENTRY *pEntry; + UCHAR MaxSupportedRate = RATE_11; + + pEntry = MacTableInsertDlsEntry(pAd, SA, i); + + switch (MaxSupportedRateIn500Kbps) + { + case 108: MaxSupportedRate = RATE_54; break; + case 96: MaxSupportedRate = RATE_48; break; + case 72: MaxSupportedRate = RATE_36; break; + case 48: MaxSupportedRate = RATE_24; break; + case 36: MaxSupportedRate = RATE_18; break; + case 24: MaxSupportedRate = RATE_12; break; + case 18: MaxSupportedRate = RATE_9; break; + case 12: MaxSupportedRate = RATE_6; break; + case 22: MaxSupportedRate = RATE_11; break; + case 11: MaxSupportedRate = RATE_5_5; break; + case 4: MaxSupportedRate = RATE_2; break; + case 2: MaxSupportedRate = RATE_1; break; + default: MaxSupportedRate = RATE_11; break; + } + + pEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate); + + if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) + { + pEntry->MaxHTPhyMode.field.MODE = MODE_CCK; + pEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate; + pEntry->MinHTPhyMode.field.MODE = MODE_CCK; + pEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate; + pEntry->HTPhyMode.field.MODE = MODE_CCK; + pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate; + } + else + { + pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM; + pEntry->MaxHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + pEntry->MinHTPhyMode.field.MODE = MODE_OFDM; + pEntry->MinHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + pEntry->HTPhyMode.field.MODE = MODE_OFDM; + pEntry->HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + } + + pEntry->MaxHTPhyMode.field.BW = BW_20; + pEntry->MinHTPhyMode.field.BW = BW_20; + +#ifdef DOT11_N_SUPPORT + pEntry->HTCapability.MCSSet[0] = 0; + pEntry->HTCapability.MCSSet[1] = 0; + + // If this Entry supports 802.11n, upgrade to HT rate. + if ((HtCapabilityLen != 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + { + UCHAR j, bitmask; //k,bitmask; + CHAR ii; + + DBGPRINT(RT_DEBUG_OFF, ("DLS - PeerDlsRspAction Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\n", + SA[0], SA[1], SA[2], SA[3], SA[4], SA[5])); + + if ((HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF)) + { + pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD; + } + else + { + pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; + pAd->MacTab.fAnyStationNonGF = TRUE; + pAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1; + } + + if ((HtCapability.HtCapInfo.ChannelWidth) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth)) + { + pEntry->MaxHTPhyMode.field.BW= BW_40; + pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(HtCapability.HtCapInfo.ShortGIfor40)); + } + else + { + pEntry->MaxHTPhyMode.field.BW = BW_20; + pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(HtCapability.HtCapInfo.ShortGIfor20)); + pAd->MacTab.fAnyStation20Only = TRUE; + } + + // find max fixed rate + for (ii=15; ii>=0; ii--) + { + j = ii/8; + bitmask = (1<<(ii-(j*8))); + if ( (pAd->StaCfg.DesiredHtPhyInfo.MCSSet[j]&bitmask) && (HtCapability.MCSSet[j]&bitmask)) + { + pEntry->MaxHTPhyMode.field.MCS = ii; + break; + } + if (ii==0) + break; + } + + if (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) + { + if (pAd->StaCfg.DesiredTransmitSetting.field.MCS == 32) + { + // Fix MCS as HT Duplicated Mode + pEntry->MaxHTPhyMode.field.BW = 1; + pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; + pEntry->MaxHTPhyMode.field.STBC = 0; + pEntry->MaxHTPhyMode.field.ShortGI = 0; + pEntry->MaxHTPhyMode.field.MCS = 32; + } + else if (pEntry->MaxHTPhyMode.field.MCS > pAd->StaCfg.HTPhyMode.field.MCS) + { + // STA supports fixed MCS + pEntry->MaxHTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + } + } + + pEntry->MaxHTPhyMode.field.STBC = (HtCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC)); + pEntry->MpduDensity = HtCapability.HtCapParm.MpduDensity; + pEntry->MaxRAmpduFactor = HtCapability.HtCapParm.MaxRAmpduFactor; + pEntry->MmpsMode = (UCHAR)HtCapability.HtCapInfo.MimoPs; + pEntry->AMsduSize = (UCHAR)HtCapability.HtCapInfo.AMsduSize; + pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; + + if (HtCapability.HtCapInfo.ShortGIfor20) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE); + if (HtCapability.HtCapInfo.ShortGIfor40) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE); + if (HtCapability.HtCapInfo.TxSTBC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE); + if (HtCapability.HtCapInfo.RxSTBC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE); + if (HtCapability.ExtHtCapInfo.PlusHTC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE); + if (pAd->CommonCfg.bRdg && HtCapability.ExtHtCapInfo.RDGSupport) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE); + if (HtCapability.ExtHtCapInfo.MCSFeedback == 0x03) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE); + + NdisMoveMemory(&pEntry->HTCapability, &HtCapability, sizeof(HT_CAPABILITY_IE)); + } +#endif // DOT11_N_SUPPORT // + pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; + pEntry->CurrTxRate = pEntry->MaxSupportedRate; + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); + + if (pAd->StaCfg.bAutoTxRateSwitch == TRUE) + { + PUCHAR pTable; + UCHAR TableSize = 0; + + MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &pEntry->CurrTxRateIndex); + pEntry->bAutoTxRateSwitch = TRUE; + } + else + { + pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE; + pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + pEntry->bAutoTxRateSwitch = FALSE; + + RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry); + } + pEntry->RateLen = SupportedRatesLen; + + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + { + // If support WPA or WPA2, start STAKey hand shake, + // If failed hand shake, just tear down peer DLS + if (RTMPSendSTAKeyRequest(pAd, pAd->StaCfg.DLSEntry[i].MacAddr) != NDIS_STATUS_SUCCESS) + { + MLME_DLS_REQ_STRUCT MlmeDlsReq; + USHORT reason = REASON_QOS_CIPHER_NOT_SUPPORT; + + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsRspAction failed when call RTMPSendSTAKeyRequest \n")); + } + else + { + pAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY; + DBGPRINT(RT_DEBUG_TRACE,("DLS - waiting for STAKey handshake procedure\n")); + } + } + else + { + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + pAd->StaCfg.DLSEntry[i].Status = DLS_FINISH; + DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x Succeed with WEP or no security\n", SA[0], SA[1], SA[2], SA[3], SA[4], SA[5])); + } + + //initialize seq no for DLS frames. + pAd->StaCfg.DLSEntry[i].Sequence = 0; + if (HtCapabilityLen != 0) + pAd->StaCfg.DLSEntry[i].bHTCap = TRUE; + else + pAd->StaCfg.DLSEntry[i].bHTCap = FALSE; + } + else + { + // DLS setup procedure failed. + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsRspAction failed with StatusCode=%d \n", StatusCode)); + } + } + } + + if (i >= MAX_NUM_OF_INIT_DLS_ENTRY) + { + DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsRspAction() update timeout value \n")); + for (i=(MAX_NUM_OF_DLS_ENTRY-1); i>=MAX_NUM_OF_INIT_DLS_ENTRY; i--) + { + if (pAd->StaCfg.DLSEntry[i].Valid && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + if (StatusCode == MLME_SUCCESS) + { + MAC_TABLE_ENTRY *pEntry; + UCHAR MaxSupportedRate = RATE_11; + + pEntry = MacTableInsertDlsEntry(pAd, SA, i); + + switch (MaxSupportedRateIn500Kbps) + { + case 108: MaxSupportedRate = RATE_54; break; + case 96: MaxSupportedRate = RATE_48; break; + case 72: MaxSupportedRate = RATE_36; break; + case 48: MaxSupportedRate = RATE_24; break; + case 36: MaxSupportedRate = RATE_18; break; + case 24: MaxSupportedRate = RATE_12; break; + case 18: MaxSupportedRate = RATE_9; break; + case 12: MaxSupportedRate = RATE_6; break; + case 22: MaxSupportedRate = RATE_11; break; + case 11: MaxSupportedRate = RATE_5_5; break; + case 4: MaxSupportedRate = RATE_2; break; + case 2: MaxSupportedRate = RATE_1; break; + default: MaxSupportedRate = RATE_11; break; + } + + pEntry->MaxSupportedRate = min(pAd->CommonCfg.MaxTxRate, MaxSupportedRate); + + if (pEntry->MaxSupportedRate < RATE_FIRST_OFDM_RATE) + { + pEntry->MaxHTPhyMode.field.MODE = MODE_CCK; + pEntry->MaxHTPhyMode.field.MCS = pEntry->MaxSupportedRate; + pEntry->MinHTPhyMode.field.MODE = MODE_CCK; + pEntry->MinHTPhyMode.field.MCS = pEntry->MaxSupportedRate; + pEntry->HTPhyMode.field.MODE = MODE_CCK; + pEntry->HTPhyMode.field.MCS = pEntry->MaxSupportedRate; + } + else + { + pEntry->MaxHTPhyMode.field.MODE = MODE_OFDM; + pEntry->MaxHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + pEntry->MinHTPhyMode.field.MODE = MODE_OFDM; + pEntry->MinHTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + pEntry->HTPhyMode.field.MODE = MODE_OFDM; + pEntry->HTPhyMode.field.MCS = OfdmRateToRxwiMCS[pEntry->MaxSupportedRate]; + } + + pEntry->MaxHTPhyMode.field.BW = BW_20; + pEntry->MinHTPhyMode.field.BW = BW_20; + +#ifdef DOT11_N_SUPPORT + pEntry->HTCapability.MCSSet[0] = 0; + pEntry->HTCapability.MCSSet[1] = 0; + + // If this Entry supports 802.11n, upgrade to HT rate. + if ((HtCapabilityLen != 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED)) + { + UCHAR j, bitmask; //k,bitmask; + CHAR ii; + + DBGPRINT(RT_DEBUG_TRACE, ("DLS - PeerDlsRspAction Receive Peer HT Capable STA from %02x:%02x:%02x:%02x:%02x:%02x\n", + SA[0], SA[1], SA[2], SA[3], SA[4], SA[5])); + + if ((HtCapability.HtCapInfo.GF) && (pAd->CommonCfg.DesiredHtPhy.GF)) + { + pEntry->MaxHTPhyMode.field.MODE = MODE_HTGREENFIELD; + } + else + { + pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; + pAd->MacTab.fAnyStationNonGF = TRUE; + pAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1; + } + + if ((HtCapability.HtCapInfo.ChannelWidth) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth)) + { + pEntry->MaxHTPhyMode.field.BW= BW_40; + pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(HtCapability.HtCapInfo.ShortGIfor40)); + } + else + { + pEntry->MaxHTPhyMode.field.BW = BW_20; + pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor20)&(HtCapability.HtCapInfo.ShortGIfor20)); + pAd->MacTab.fAnyStation20Only = TRUE; + } + + // find max fixed rate + for (ii=15; ii>=0; ii--) + { + j = ii/8; + bitmask = (1<<(ii-(j*8))); + if ( (pAd->StaCfg.DesiredHtPhyInfo.MCSSet[j]&bitmask) && (HtCapability.MCSSet[j]&bitmask)) + { + pEntry->MaxHTPhyMode.field.MCS = ii; + break; + } + if (ii==0) + break; + } + + if (pAd->StaCfg.DesiredTransmitSetting.field.MCS != MCS_AUTO) + { + DBGPRINT(RT_DEBUG_OFF, ("@@@ pAd->CommonCfg.RegTransmitSetting.field.MCS = %d\n", + pAd->StaCfg.DesiredTransmitSetting.field.MCS)); + if (pAd->StaCfg.DesiredTransmitSetting.field.MCS == 32) + { + // Fix MCS as HT Duplicated Mode + pEntry->MaxHTPhyMode.field.BW = 1; + pEntry->MaxHTPhyMode.field.MODE = MODE_HTMIX; + pEntry->MaxHTPhyMode.field.STBC = 0; + pEntry->MaxHTPhyMode.field.ShortGI = 0; + pEntry->MaxHTPhyMode.field.MCS = 32; + } + else if (pEntry->MaxHTPhyMode.field.MCS > pAd->StaCfg.HTPhyMode.field.MCS) + { + // STA supports fixed MCS + pEntry->MaxHTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + } + } + + pEntry->MaxHTPhyMode.field.STBC = (HtCapability.HtCapInfo.RxSTBC & (pAd->CommonCfg.DesiredHtPhy.TxSTBC)); + pEntry->MpduDensity = HtCapability.HtCapParm.MpduDensity; + pEntry->MaxRAmpduFactor = HtCapability.HtCapParm.MaxRAmpduFactor; + pEntry->MmpsMode = (UCHAR)HtCapability.HtCapInfo.MimoPs; + pEntry->AMsduSize = (UCHAR)HtCapability.HtCapInfo.AMsduSize; + pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; + + if (HtCapability.HtCapInfo.ShortGIfor20) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI20_CAPABLE); + if (HtCapability.HtCapInfo.ShortGIfor40) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_SGI40_CAPABLE); + if (HtCapability.HtCapInfo.TxSTBC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_TxSTBC_CAPABLE); + if (HtCapability.HtCapInfo.RxSTBC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RxSTBC_CAPABLE); + if (HtCapability.ExtHtCapInfo.PlusHTC) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_HTC_CAPABLE); + if (pAd->CommonCfg.bRdg && HtCapability.ExtHtCapInfo.RDGSupport) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE); + if (HtCapability.ExtHtCapInfo.MCSFeedback == 0x03) + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE); + + NdisMoveMemory(&pEntry->HTCapability, &HtCapability, sizeof(HT_CAPABILITY_IE)); + } +#endif // DOT11_N_SUPPORT // + + pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word; + pEntry->CurrTxRate = pEntry->MaxSupportedRate; + CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE); + + if (pAd->StaCfg.bAutoTxRateSwitch == TRUE) + { + PUCHAR pTable; + UCHAR TableSize = 0; + + MlmeSelectTxRateTable(pAd, pEntry, &pTable, &TableSize, &pEntry->CurrTxRateIndex); + pEntry->bAutoTxRateSwitch = TRUE; + } + else + { + pEntry->HTPhyMode.field.MODE = pAd->StaCfg.HTPhyMode.field.MODE; + pEntry->HTPhyMode.field.MCS = pAd->StaCfg.HTPhyMode.field.MCS; + pEntry->bAutoTxRateSwitch = FALSE; + + RTMPUpdateLegacyTxSetting((UCHAR)pAd->StaCfg.DesiredTransmitSetting.field.FixedTxMode, pEntry); + } + pEntry->RateLen = SupportedRatesLen; + + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + { + // If support WPA or WPA2, start STAKey hand shake, + // If failed hand shake, just tear down peer DLS + if (RTMPSendSTAKeyRequest(pAd, pAd->StaCfg.DLSEntry[i].MacAddr) != NDIS_STATUS_SUCCESS) + { + MLME_DLS_REQ_STRUCT MlmeDlsReq; + USHORT reason = REASON_QOS_CIPHER_NOT_SUPPORT; + + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsRspAction failed when call RTMPSendSTAKeyRequest \n")); + } + else + { + pAd->StaCfg.DLSEntry[i].Status = DLS_WAIT_KEY; + DBGPRINT(RT_DEBUG_TRACE,("DLS - waiting for STAKey handshake procedure\n")); + } + } + else + { + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + pAd->StaCfg.DLSEntry[i].Status = DLS_FINISH; + DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsRspAction() from %02x:%02x:%02x:%02x:%02x:%02x Succeed with WEP or no security\n", SA[0], SA[1], SA[2], SA[3], SA[4], SA[5])); + } + pAd->StaCfg.DLSEntry[i].Sequence = 0; + if (HtCapabilityLen != 0) + pAd->StaCfg.DLSEntry[i].bHTCap = TRUE; + else + pAd->StaCfg.DLSEntry[i].bHTCap = FALSE; + } + else + { + // DLS setup procedure failed. + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + DBGPRINT(RT_DEBUG_ERROR,("DLS - PeerDlsRspAction failed with StatusCode=%d \n", StatusCode)); + } + } + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID MlmeDlsTearDownAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + UCHAR Category = CATEGORY_DLS; + UCHAR Action = ACTION_DLS_TEARDOWN; + USHORT ReasonCode = REASON_QOS_UNSPECIFY; + HEADER_802_11 DlsTearDownHdr; + PRT_802_11_DLS pDLS; + BOOLEAN TimerCancelled; + UCHAR i; + + if(!MlmeDlsReqSanity(pAd, Elem->Msg, Elem->MsgLen, &pDLS, &ReasonCode)) + return; + + DBGPRINT(RT_DEBUG_TRACE,("DLS - MlmeDlsTearDownAction() with ReasonCode=%d \n", ReasonCode)); + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_ERROR,("DLS - MlmeDlsTearDownAction() allocate memory failed \n")); + return; + } + + ActHeaderInit(pAd, &DlsTearDownHdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + + // Build basic frame first + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &DlsTearDownHdr, + 1, &Category, + 1, &Action, + 6, &pDLS->MacAddr, + 6, pAd->CurrentAddress, + 2, &ReasonCode, + END_OF_ARGS); + + MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + RTMPCancelTimer(&pDLS->Timer, &TimerCancelled); + + // Remove key in local dls table entry + for (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (MAC_ADDR_EQUAL(pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + MacTableDeleteDlsEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } + + // clear peer dls table entry + for (i = MAX_NUM_OF_INIT_DLS_ENTRY; i < MAX_NUM_OF_DLS_ENTRY; i++) + { + if (MAC_ADDR_EQUAL(pDLS->MacAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + MacTableDeleteDlsEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerDlsTearDownAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR DA[MAC_ADDR_LEN], SA[MAC_ADDR_LEN]; + USHORT ReasonCode; + UINT i; + BOOLEAN TimerCancelled; + + if (!pAd->CommonCfg.bDLSCapable) + return; + + if (!INFRA_ON(pAd)) + return; + + if (!PeerDlsTearDownSanity(pAd, Elem->Msg, Elem->MsgLen, DA, SA, &ReasonCode)) + return; + + DBGPRINT(RT_DEBUG_TRACE,("DLS - PeerDlsTearDownAction() from %02x:%02x:%02x:%02x:%02x:%02x with ReasonCode=%d\n", SA[0], SA[1], SA[2], SA[3], SA[4], SA[5], ReasonCode)); + + // clear local dls table entry + for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + //AsicDelWcidTab(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID); + //AsicRemovePairwiseKeyEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID); + MacTableDeleteDlsEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } + + // clear peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && MAC_ADDR_EQUAL(SA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + //AsicDelWcidTab(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID); + //AsicRemovePairwiseKeyEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID); + MacTableDeleteDlsEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID RTMPCheckDLSTimeOut( + IN PRTMP_ADAPTER pAd) +{ + ULONG i; + MLME_DLS_REQ_STRUCT MlmeDlsReq; + USHORT reason = REASON_QOS_UNSPECIFY; + + if (! pAd->CommonCfg.bDLSCapable) + return; + + if (! INFRA_ON(pAd)) + return; + + // If timeout value is equaled to zero, it means always not be timeout. + + // update local dls table entry + for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if ((pAd->StaCfg.DLSEntry[i].Valid) && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) + && (pAd->StaCfg.DLSEntry[i].TimeOut != 0)) + { + pAd->StaCfg.DLSEntry[i].CountDownTimer --; + + if (pAd->StaCfg.DLSEntry[i].CountDownTimer == 0) + { + reason = REASON_QOS_REQUEST_TIMEOUT; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + } + } + } + + // update peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if ((pAd->StaCfg.DLSEntry[i].Valid) && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) + && (pAd->StaCfg.DLSEntry[i].TimeOut != 0)) + { + pAd->StaCfg.DLSEntry[i].CountDownTimer --; + + if (pAd->StaCfg.DLSEntry[i].CountDownTimer == 0) + { + reason = REASON_QOS_REQUEST_TIMEOUT; + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + } + } + } +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN RTMPRcvFrameDLSCheck( + IN PRTMP_ADAPTER pAd, + IN PHEADER_802_11 pHeader, + IN ULONG Len, + IN PRT28XX_RXD_STRUC pRxD) +{ + ULONG i; + BOOLEAN bFindEntry = FALSE; + BOOLEAN bSTAKeyFrame = FALSE; + PEAPOL_PACKET pEap; + PUCHAR pProto, pAddr = NULL; + PUCHAR pSTAKey = NULL; + UCHAR ZeroReplay[LEN_KEY_DESC_REPLAY]; + UCHAR Mic[16], OldMic[16]; + UCHAR digest[80]; + UCHAR DlsPTK[80]; + UCHAR temp[64]; + BOOLEAN TimerCancelled; + CIPHER_KEY PairwiseKey; + + + if (! pAd->CommonCfg.bDLSCapable) + return bSTAKeyFrame; + + if (! INFRA_ON(pAd)) + return bSTAKeyFrame; + + if (Len < LENGTH_802_11 + 6 + 2) /* LENGTH_802_11 + LLC + EAPOL protocol type */ + return bSTAKeyFrame; + + pProto = (PUCHAR)pHeader + LENGTH_802_11; + + if ((pHeader->FC.SubType & 0x08)) + pProto += 2; /* QOS Control field */ + + /* Skip 4-bytes for HTC */ + if (pHeader->FC.Order && (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED))) + { + pProto += 4; + } + + /* L2PAD bit on will pad 2 bytes at LLC */ + if (pRxD->L2PAD) + { + pProto += 2; + } + + pProto += 6; /* 0xAA 0xAA 0xAA 0x00 0x00 0x00 */ + + if ((!(pHeader->FC.SubType & 0x08)) && (!RTMPEqualMemory(EAPOL, pProto, 2))) + return bSTAKeyFrame; + + pAddr = pHeader->Addr2; + + if (RTMPEqualMemory(EAPOL, pProto, 2) && (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA)) + { + pEap = (PEAPOL_PACKET) (pProto + 2); + + DBGPRINT(RT_DEBUG_TRACE,("DLS - Sniff Len=%ld, DataLen=%d, KeyMic=%d, Install=%d, KeyAck=%d, Secure=%d, EKD_DL=%d, Error=%d, Request=%d\n", Len, + (LENGTH_802_11 + 6 + 2 + 2 + MIN_LEN_OF_EAPOL_KEY_MSG + 16), + pEap->KeyDesc.KeyInfo.KeyMic, + pEap->KeyDesc.KeyInfo.Install, + pEap->KeyDesc.KeyInfo.KeyAck, + pEap->KeyDesc.KeyInfo.Secure, + pEap->KeyDesc.KeyInfo.EKD_DL, + pEap->KeyDesc.KeyInfo.Error, + pEap->KeyDesc.KeyInfo.Request)); + + if ((Len >= (LENGTH_802_11 + 6 + 2 + 2 + MIN_LEN_OF_EAPOL_KEY_MSG + 16)) && pEap->KeyDesc.KeyInfo.KeyMic + && pEap->KeyDesc.KeyInfo.Install && pEap->KeyDesc.KeyInfo.KeyAck && pEap->KeyDesc.KeyInfo.Secure + && pEap->KeyDesc.KeyInfo.EKD_DL && !pEap->KeyDesc.KeyInfo.Error && !pEap->KeyDesc.KeyInfo.Request) + { + // First validate replay counter, only accept message with larger replay counter + // Let equal pass, some AP start with all zero replay counter + NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY); + if ((RTMPCompareMemory(pEap->KeyDesc.ReplayCounter, pAd->StaCfg.ReplayCounter, LEN_KEY_DESC_REPLAY) != 1) && + (RTMPCompareMemory(pEap->KeyDesc.ReplayCounter, ZeroReplay, LEN_KEY_DESC_REPLAY) != 0)) + return bSTAKeyFrame; + + //RTMPMoveMemory(pAd->StaCfg.ReplayCounter, pEap->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY); + RTMPMoveMemory(pAd->StaCfg.DlsReplayCounter, pEap->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY); + DBGPRINT(RT_DEBUG_TRACE,("DLS - Sniff replay counter (%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x) Len=%ld, KeyDataLen=%d\n", + pAd->StaCfg.ReplayCounter[0], pAd->StaCfg.ReplayCounter[1], pAd->StaCfg.ReplayCounter[2], + pAd->StaCfg.ReplayCounter[3], pAd->StaCfg.ReplayCounter[4], pAd->StaCfg.ReplayCounter[5], + pAd->StaCfg.ReplayCounter[6], pAd->StaCfg.ReplayCounter[7], Len, pEap->KeyDesc.KeyData[1])); + + // put these code segment to get the replay counter + if (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) + return bSTAKeyFrame; + + // Check MIC value + // Save the MIC and replace with zero + // use proprietary PTK + NdisZeroMemory(temp, 64); + NdisMoveMemory(temp, "IEEE802.11 WIRELESS ACCESS POINT", 32); + WpaDerivePTK(pAd, temp, temp, pAd->CommonCfg.Bssid, temp, pAd->CurrentAddress, DlsPTK, LEN_PTK); + + NdisMoveMemory(OldMic, pEap->KeyDesc.KeyMic, LEN_KEY_DESC_MIC); + NdisZeroMemory(pEap->KeyDesc.KeyMic, LEN_KEY_DESC_MIC); + if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) + { + // AES + RT_HMAC_SHA1(DlsPTK, LEN_PTK_KCK, (PUCHAR) pEap, pEap->Body_Len[1] + 4, digest, SHA1_DIGEST_SIZE); + NdisMoveMemory(Mic, digest, LEN_KEY_DESC_MIC); + } + else + { + RT_HMAC_MD5(DlsPTK, LEN_PTK_KCK, (PUCHAR) pEap, pEap->Body_Len[1] + 4, Mic, MD5_DIGEST_SIZE); + } + + if (!NdisEqualMemory(OldMic, Mic, LEN_KEY_DESC_MIC)) + { + DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in Msg1 of STAKey handshake! \n")); + return bSTAKeyFrame; + } + else + DBGPRINT(RT_DEBUG_TRACE, ("MIC VALID in Msg1 of STAKey handshake! \n")); + if ((pEap->KeyDesc.KeyData[0] == 0xDD) && (pEap->KeyDesc.KeyData[2] == 0x00) && (pEap->KeyDesc.KeyData[3] == 0x0C) + && (pEap->KeyDesc.KeyData[4] == 0x43) && (pEap->KeyDesc.KeyData[5] == 0x02)) + { + pAddr = pEap->KeyDesc.KeyData + 8; // Tpe(1), Len(1), OUI(3), DataType(1), Reserved(2) + pSTAKey = pEap->KeyDesc.KeyData + 14; // Tpe(1), Len(1), OUI(3), DataType(1), Reserved(2), STAKey_Mac_Addr(6) + + DBGPRINT(RT_DEBUG_TRACE,("DLS - Receive STAKey Message-1 from %02x:%02x:%02x:%02x:%02x:%02x Len=%ld, KeyDataLen=%d\n", + pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], Len, pEap->KeyDesc.KeyData[1])); + + bSTAKeyFrame = TRUE; + } + + } + else if (Len >= (LENGTH_802_11 + 6 + 2 + 2 + MIN_LEN_OF_EAPOL_KEY_MSG)) + { + RTMPMoveMemory(pAd->StaCfg.DlsReplayCounter, pEap->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY); + DBGPRINT(RT_DEBUG_TRACE,("DLS - Sniff replay counter 2(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x) Len=%ld, KeyDataLen=%d\n", + pAd->StaCfg.ReplayCounter[0], pAd->StaCfg.ReplayCounter[1], pAd->StaCfg.ReplayCounter[2], + pAd->StaCfg.ReplayCounter[3], pAd->StaCfg.ReplayCounter[4], pAd->StaCfg.ReplayCounter[5], + pAd->StaCfg.ReplayCounter[6], pAd->StaCfg.ReplayCounter[7], Len, pEap->KeyDesc.KeyData[1])); + } + } + + // If timeout value is equaled to zero, it means always not be timeout. + // update local dls table entry + for (i= 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && MAC_ADDR_EQUAL(pAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + if (bSTAKeyFrame) + { + PMAC_TABLE_ENTRY pEntry; + + // STAKey frame, add pairwise key table + pAd->StaCfg.DLSEntry[i].Status = DLS_FINISH; + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + + PairwiseKey.KeyLen = LEN_TK; + NdisMoveMemory(PairwiseKey.Key, &pSTAKey[0], LEN_TK); + NdisMoveMemory(PairwiseKey.TxMic, &pSTAKey[16], LEN_TKIP_MIC); + NdisMoveMemory(PairwiseKey.RxMic, &pSTAKey[24], LEN_TKIP_MIC); + + //PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg; + if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) + PairwiseKey.CipherAlg = CIPHER_TKIP; + else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled) + PairwiseKey.CipherAlg = CIPHER_AES; + + pEntry = DlsEntryTableLookup(pAd, pAd->StaCfg.DLSEntry[i].MacAddr, TRUE); + //AsicAddKeyEntry(pAd, (USHORT)(i + 2), BSS0, 0, &PairwiseKey, TRUE, TRUE); // reserve 0 for multicast, 1 for unicast + //AsicUpdateRxWCIDTable(pAd, (USHORT)(i + 2), pAddr); + + // Add Pair-wise key to Asic + RTMP_ASIC_PAIRWISE_KEY_TABLE(pAd, + (UCHAR)pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, + &PairwiseKey); + + RTMP_SET_WCID_SEC_INFO(pAd, + BSS0, + 0, + PairwiseKey.CipherAlg, + (UCHAR)pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, + PAIRWISEKEYTABLE); + + NdisMoveMemory(&pEntry->PairwiseKey, &PairwiseKey, sizeof(CIPHER_KEY)); + DBGPRINT(RT_DEBUG_TRACE,("DLS - Receive STAKey Message-1 (Peer STA MAC Address STAKey) \n")); + + RTMPSendSTAKeyHandShake(pAd, pAd->StaCfg.DLSEntry[i].MacAddr); + + DBGPRINT(RT_DEBUG_TRACE,("DLS - Finish STAKey handshake procedure (Initiator side)\n")); + } + else + { + // Data frame, update timeout value + if (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) + { + pAd->StaCfg.DLSEntry[i].CountDownTimer = pAd->StaCfg.DLSEntry[i].TimeOut; + //AsicUpdateRxWCIDTable(pAd, (USHORT)(i + 2), pAddr); + } + } + + bFindEntry = TRUE; + } + } + + // update peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && MAC_ADDR_EQUAL(pAddr, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + if (bSTAKeyFrame) + { + PMAC_TABLE_ENTRY pEntry = NULL; + + // STAKey frame, add pairwise key table, and send STAkey Msg-2 + pAd->StaCfg.DLSEntry[i].Status = DLS_FINISH; + RTMPCancelTimer(&pAd->StaCfg.DLSEntry[i].Timer, &TimerCancelled); + + PairwiseKey.KeyLen = LEN_TK; + NdisMoveMemory(PairwiseKey.Key, &pSTAKey[0], LEN_TK); + NdisMoveMemory(PairwiseKey.TxMic, &pSTAKey[16], LEN_TKIP_MIC); + NdisMoveMemory(PairwiseKey.RxMic, &pSTAKey[24], LEN_TKIP_MIC); + + //PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg; + if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) + PairwiseKey.CipherAlg = CIPHER_TKIP; + else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled) + PairwiseKey.CipherAlg = CIPHER_AES; + + pEntry = DlsEntryTableLookup(pAd, pAd->StaCfg.DLSEntry[i].MacAddr, TRUE); + //AsicAddKeyEntry(pAd, (USHORT)(i + 2), BSS0, 0, &PairwiseKey, TRUE, TRUE); // reserve 0 for multicast, 1 for unicast + //AsicUpdateRxWCIDTable(pAd, (USHORT)(i + 2), pAddr); + + // Add Pair-wise key to Asic + RTMP_ASIC_PAIRWISE_KEY_TABLE(pAd, + (UCHAR)pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, + &PairwiseKey); + + RTMP_SET_WCID_SEC_INFO(pAd, + BSS0, + 0, + PairwiseKey.CipherAlg, + (UCHAR)pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, + PAIRWISEKEYTABLE); + + NdisMoveMemory(&pEntry->PairwiseKey, &PairwiseKey, sizeof(CIPHER_KEY)); + DBGPRINT(RT_DEBUG_TRACE,("DLS - Receive STAKey Message-1 (Initiator STA MAC Address STAKey)\n")); + + // If support WPA or WPA2, start STAKey hand shake, + // If failed hand shake, just tear down peer DLS + if (RTMPSendSTAKeyHandShake(pAd, pAddr) != NDIS_STATUS_SUCCESS) + { + MLME_DLS_REQ_STRUCT MlmeDlsReq; + USHORT reason = REASON_QOS_CIPHER_NOT_SUPPORT; + + pAd->StaCfg.DLSEntry[i].Valid = FALSE; + pAd->StaCfg.DLSEntry[i].Status = DLS_NONE; + DlsParmFill(pAd, &MlmeDlsReq, &pAd->StaCfg.DLSEntry[i], reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + } + else + { + DBGPRINT(RT_DEBUG_TRACE,("DLS - Finish STAKey handshake procedure (Peer side)\n")); + } + } + else + { + // Data frame, update timeout value + if (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) + { + pAd->StaCfg.DLSEntry[i].CountDownTimer = pAd->StaCfg.DLSEntry[i].TimeOut; + } + } + + bFindEntry = TRUE; + } + } + + + return bSTAKeyFrame; +} + +/* + ======================================================================== + + Routine Description: + Check if the frame can be sent through DLS direct link interface + + Arguments: + pAd Pointer to adapter + + Return Value: + DLS entry index + + Note: + + ======================================================================== +*/ +INT RTMPCheckDLSFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA) +{ + INT rval = -1; + INT i; + + if (!pAd->CommonCfg.bDLSCapable) + return rval; + + if (!INFRA_ON(pAd)) + return rval; + + do{ + // check local dls table entry + for (i=0; i<MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) && + MAC_ADDR_EQUAL(pDA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + rval = i; + break; + } + } + + // check peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) && + MAC_ADDR_EQUAL(pDA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + rval = i; + break; + } + } + } while (FALSE); + + return rval; +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID RTMPSendDLSTearDownFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA) +{ + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + HEADER_802_11 DlsTearDownHdr; + ULONG FrameLen = 0; + USHORT Reason = REASON_QOS_QSTA_LEAVING_QBSS; + UCHAR Category = CATEGORY_DLS; + UCHAR Action = ACTION_DLS_TEARDOWN; + UCHAR i = 0; + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) || + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) + return; + + DBGPRINT(RT_DEBUG_TRACE, ("Send DLS TearDown Frame \n")); + + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + { + DBGPRINT(RT_DEBUG_ERROR,("ASSOC - RTMPSendDLSTearDownFrame() allocate memory failed \n")); + return; + } + + ActHeaderInit(pAd, &DlsTearDownHdr, pAd->CommonCfg.Bssid, pAd->CurrentAddress, pAd->CommonCfg.Bssid); + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &DlsTearDownHdr, + 1, &Category, + 1, &Action, + 6, pDA, + 6, pAd->CurrentAddress, + 2, &Reason, + END_OF_ARGS); + + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + + // Remove key in local dls table entry + for (i = 0; i < MAX_NUM_OF_INIT_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) + && MAC_ADDR_EQUAL(pDA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + MacTableDeleteDlsEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } + + // Remove key in peer dls table entry + for (i=MAX_NUM_OF_INIT_DLS_ENTRY; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if (pAd->StaCfg.DLSEntry[i].Valid && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH) + && MAC_ADDR_EQUAL(pDA, pAd->StaCfg.DLSEntry[i].MacAddr)) + { + MacTableDeleteDlsEntry(pAd, pAd->StaCfg.DLSEntry[i].MacTabMatchWCID, pAd->StaCfg.DLSEntry[i].MacAddr); + } + } + + DBGPRINT(RT_DEBUG_TRACE, ("Send DLS TearDown Frame and remove key in (i=%d) \n", i)); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +NDIS_STATUS RTMPSendSTAKeyRequest( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA) +{ + UCHAR Header802_3[14]; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + PEAPOL_PACKET pPacket; + UCHAR *mpool; + UCHAR Mic[16]; + UCHAR digest[80]; + PUCHAR pOutBuffer = NULL; + PNDIS_PACKET pNdisPacket; + UCHAR temp[64]; + UCHAR DlsPTK[80]; + + DBGPRINT(RT_DEBUG_TRACE,("DLS - RTMPSendSTAKeyRequest() to %02x:%02x:%02x:%02x:%02x:%02x\n", pDA[0], pDA[1], pDA[2], pDA[3], pDA[4], pDA[5])); + + pAd->Sequence ++; + MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL); + + // Allocate memory for output + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return NDIS_STATUS_FAILURE; + } + + // Zero message body + pPacket = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pPacket, TX_EAPOL_BUFFER); + + pPacket->ProVer = EAPOL_VER; + pPacket->ProType = EAPOLKey; + pPacket->Body_Len[1] = sizeof(KEY_DESCRIPTER) + 6 + MAC_ADDR_LEN; // data field contain KDE andPeer MAC address + + // STAKey Message is as EAPOL-Key(1,1,0,0,G/0,0,0, MIC, 0,Peer MAC KDE) + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) + { + pPacket->KeyDesc.Type = WPA1_KEY_DESC; + } + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + pPacket->KeyDesc.Type = WPA2_KEY_DESC; + } + + // Key descriptor version + pPacket->KeyDesc.KeyInfo.KeyDescVer = + (((pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled) || (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)) ? (KEY_DESC_AES) : (KEY_DESC_TKIP)); + + pPacket->KeyDesc.KeyInfo.KeyMic = 1; + pPacket->KeyDesc.KeyInfo.Secure = 1; + pPacket->KeyDesc.KeyInfo.Request = 1; + + pPacket->KeyDesc.KeyDataLen[1] = 12; + + // use our own OUI to distinguish proprietary with standard. + pPacket->KeyDesc.KeyData[0] = 0xDD; + pPacket->KeyDesc.KeyData[1] = 0x0A; + pPacket->KeyDesc.KeyData[2] = 0x00; + pPacket->KeyDesc.KeyData[3] = 0x0C; + pPacket->KeyDesc.KeyData[4] = 0x43; + pPacket->KeyDesc.KeyData[5] = 0x03; + NdisMoveMemory(&pPacket->KeyDesc.KeyData[6], pDA, MAC_ADDR_LEN); + + NdisMoveMemory(pPacket->KeyDesc.ReplayCounter, pAd->StaCfg.DlsReplayCounter, LEN_KEY_DESC_REPLAY); + + // Allocate buffer for transmitting message + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); + if (NStatus != NDIS_STATUS_SUCCESS) + { + os_free_mem(NULL, mpool); + return NStatus; + } + // Prepare EAPOL frame for MIC calculation + // Be careful, only EAPOL frame is counted for MIC calculation + MakeOutgoingFrame(pOutBuffer, &FrameLen, + pPacket->Body_Len[1] + 4, pPacket, + END_OF_ARGS); + + // use proprietary PTK + NdisZeroMemory(temp, 64); + NdisMoveMemory(temp, "IEEE802.11 WIRELESS ACCESS POINT", 32); + WpaDerivePTK(pAd, temp, temp, pAd->CommonCfg.Bssid, temp, pAd->CurrentAddress, DlsPTK, LEN_PTK); + + // calculate MIC + if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) + { + // AES + NdisZeroMemory(digest, sizeof(digest)); + RT_HMAC_SHA1(DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE); + NdisMoveMemory(pPacket->KeyDesc.KeyMic, digest, LEN_KEY_DESC_MIC); + } + else + { + NdisZeroMemory(Mic, sizeof(Mic)); + RT_HMAC_MD5(DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, Mic, MD5_DIGEST_SIZE); + NdisMoveMemory(pPacket->KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC); + } + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(Header802_3), Header802_3, + pPacket->Body_Len[1] + 4, pPacket, + END_OF_ARGS); + + NStatus = RTMPAllocateNdisPacket(pAd, &pNdisPacket, NULL, 0, pOutBuffer, FrameLen); + if (NStatus == NDIS_STATUS_SUCCESS) + { + RTMP_SET_PACKET_WCID(pNdisPacket, BSSID_WCID); + STASendPacket(pAd, pNdisPacket); + RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); + } + + MlmeFreeMemory(pAd, pOutBuffer); + os_free_mem(NULL, mpool); + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPSendSTAKeyRequest- Send STAKey request (NStatus=%x, FrameLen=%ld)\n", NStatus, FrameLen)); + + return NStatus; +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +NDIS_STATUS RTMPSendSTAKeyHandShake( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA) +{ + UCHAR Header802_3[14]; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + PEAPOL_PACKET pPacket; + UCHAR *mpool; + UCHAR Mic[16]; + UCHAR digest[80]; + PUCHAR pOutBuffer = NULL; + PNDIS_PACKET pNdisPacket; + UCHAR temp[64]; + UCHAR DlsPTK[80]; // Due to dirver can not get PTK, use proprietary PTK + + DBGPRINT(RT_DEBUG_TRACE,("DLS - RTMPSendSTAKeyHandShake() to %02x:%02x:%02x:%02x:%02x:%02x\n", pDA[0], pDA[1], pDA[2], pDA[3], pDA[4], pDA[5])); + + pAd->Sequence ++; + MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL); + + // Allocate memory for output + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return NDIS_STATUS_FAILURE; + } + + // Zero message body + pPacket = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pPacket, TX_EAPOL_BUFFER); + + pPacket->ProVer = EAPOL_VER; + pPacket->ProType = EAPOLKey; + pPacket->Body_Len[1] = sizeof(KEY_DESCRIPTER) + 6 + MAC_ADDR_LEN; // data field contain KDE and Peer MAC address + + // STAKey Message is as EAPOL-Key(1,1,0,0,G/0,0,0, MIC, 0,Peer MAC KDE) + if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK)) + { + pPacket->KeyDesc.Type = WPA1_KEY_DESC; + } + else if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK)) + { + pPacket->KeyDesc.Type = WPA2_KEY_DESC; + } + + // Key descriptor version + pPacket->KeyDesc.KeyInfo.KeyDescVer = + (((pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled) || (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled)) ? (KEY_DESC_AES) : (KEY_DESC_TKIP)); + + pPacket->KeyDesc.KeyInfo.KeyMic = 1; + pPacket->KeyDesc.KeyInfo.Secure = 1; + + pPacket->KeyDesc.KeyDataLen[1] = 12; + + // use our own OUI to distinguish proprietary with standard. + pPacket->KeyDesc.KeyData[0] = 0xDD; + pPacket->KeyDesc.KeyData[1] = 0x0A; + pPacket->KeyDesc.KeyData[2] = 0x00; + pPacket->KeyDesc.KeyData[3] = 0x0C; + pPacket->KeyDesc.KeyData[4] = 0x43; + pPacket->KeyDesc.KeyData[5] = 0x03; + NdisMoveMemory(&pPacket->KeyDesc.KeyData[6], pDA, MAC_ADDR_LEN); + + NdisMoveMemory(pPacket->KeyDesc.ReplayCounter, pAd->StaCfg.DlsReplayCounter, LEN_KEY_DESC_REPLAY); + + // Allocate buffer for transmitting message + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); + if (NStatus != NDIS_STATUS_SUCCESS) + { + os_free_mem(NULL, mpool); + return NStatus; + } + // Prepare EAPOL frame for MIC calculation + // Be careful, only EAPOL frame is counted for MIC calculation + MakeOutgoingFrame(pOutBuffer, &FrameLen, + pPacket->Body_Len[1] + 4, pPacket, + END_OF_ARGS); + + // use proprietary PTK + NdisZeroMemory(temp, 64); + NdisMoveMemory(temp, "IEEE802.11 WIRELESS ACCESS POINT", 32); + WpaDerivePTK(pAd, temp, temp, pAd->CommonCfg.Bssid, temp, pAd->CurrentAddress, DlsPTK, LEN_PTK); + + // calculate MIC + if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) + { + // AES + NdisZeroMemory(digest, sizeof(digest)); + RT_HMAC_SHA1(DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE); + NdisMoveMemory(pPacket->KeyDesc.KeyMic, digest, LEN_KEY_DESC_MIC); + } + else + { + NdisZeroMemory(Mic, sizeof(Mic)); + RT_HMAC_MD5(DlsPTK, LEN_PTK_KCK, pOutBuffer, FrameLen, Mic, MD5_DIGEST_SIZE); + NdisMoveMemory(pPacket->KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC); + } + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(Header802_3), Header802_3, + pPacket->Body_Len[1] + 4, pPacket, + END_OF_ARGS); + + NStatus = RTMPAllocateNdisPacket(pAd, &pNdisPacket, NULL, 0, pOutBuffer, FrameLen); + if (NStatus == NDIS_STATUS_SUCCESS) + { + RTMP_SET_PACKET_WCID(pNdisPacket, BSSID_WCID); + STASendPacket(pAd, pNdisPacket); + RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); + } + + MlmeFreeMemory(pAd, pOutBuffer); + os_free_mem(NULL, mpool); + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPSendSTAKeyHandShake- Send STAKey Message-2 (NStatus=%x, FrameLen=%ld)\n", NStatus, FrameLen)); + + return NStatus; +} + +VOID DlsTimeoutAction( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + MLME_DLS_REQ_STRUCT MlmeDlsReq; + USHORT reason; + PRT_802_11_DLS pDLS = (PRT_802_11_DLS)FunctionContext; + PRTMP_ADAPTER pAd = pDLS->pAd; + + DBGPRINT(RT_DEBUG_TRACE, ("DlsTimeout - Tear down DLS links (%02x:%02x:%02x:%02x:%02x:%02x)\n", + pDLS->MacAddr[0], pDLS->MacAddr[1], pDLS->MacAddr[2], pDLS->MacAddr[3], pDLS->MacAddr[4], pDLS->MacAddr[5])); + + if ((pDLS) && (pDLS->Valid)) + { + reason = REASON_QOS_REQUEST_TIMEOUT; + pDLS->Valid = FALSE; + pDLS->Status = DLS_NONE; + DlsParmFill(pAd, &MlmeDlsReq, pDLS, reason); + MlmeEnqueue(pAd, DLS_STATE_MACHINE, MT2_MLME_DLS_TEAR_DOWN, sizeof(MLME_DLS_REQ_STRUCT), &MlmeDlsReq, 0); + RTMP_MLME_HANDLER(pAd); + } +} + +/* +================================================================ +Description : because DLS and CLI share the same WCID table in ASIC. +Mesh entry also insert to pAd->MacTab.content[]. +Also fills the pairwise key. +Because front MAX_AID_BA entries have direct mapping to BAEntry, which is only used as CLI. So we insert Dls +from index MAX_AID_BA. +================================================================ +*/ +MAC_TABLE_ENTRY *MacTableInsertDlsEntry( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN UINT DlsEntryIdx) +{ + PMAC_TABLE_ENTRY pEntry = NULL; + + DBGPRINT(RT_DEBUG_TRACE, ("====> MacTableInsertDlsEntry\n")); + // if FULL, return + if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) + return NULL; + + do + { + if((pEntry = DlsEntryTableLookup(pAd, pAddr, TRUE)) != NULL) + break; + + // allocate one MAC entry + pEntry = MacTableInsertEntry(pAd, pAddr, DlsEntryIdx + MIN_NET_DEVICE_FOR_DLS, TRUE); + if (pEntry) + { + pAd->StaCfg.DLSEntry[DlsEntryIdx].MacTabMatchWCID = pEntry->Aid; + pEntry->MatchDlsEntryIdx = DlsEntryIdx; + pEntry->AuthMode = pAd->StaCfg.AuthMode; + pEntry->WepStatus = pAd->StaCfg.WepStatus; + pEntry->PortSecured = WPA_802_1X_PORT_SECURED; + + DBGPRINT(RT_DEBUG_TRACE, ("MacTableInsertDlsEntry - allocate entry #%d, Total= %d\n",pEntry->Aid, pAd->MacTab.Size)); + + // If legacy WEP is used, set pair-wise cipherAlg into WCID attribute table for this entry + if (IS_ENTRY_DLS(pEntry) && (pAd->StaCfg.WepStatus == Ndis802_11WEPEnabled)) + { + UCHAR KeyIdx = 0; + UCHAR CipherAlg = 0; + + KeyIdx = pAd->StaCfg.DefaultKeyId; + + CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg; + + RTMPSetWcidSecurityInfo(pAd, + BSS0, + pAd->StaCfg.DefaultKeyId, + pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg, + pEntry->Aid, + SHAREDKEYTABLE); + } + + break; + } + } while(FALSE); + + DBGPRINT(RT_DEBUG_TRACE, ("<==== MacTableInsertDlsEntry\n")); + + return pEntry; +} + + +/* + ========================================================================== + Description: + Delete all Mesh Entry in pAd->MacTab + ========================================================================== + */ +BOOLEAN MacTableDeleteDlsEntry( + IN PRTMP_ADAPTER pAd, + IN USHORT wcid, + IN PUCHAR pAddr) +{ + DBGPRINT(RT_DEBUG_TRACE, ("====> MacTableDeleteDlsEntry\n")); + + if (!VALID_WCID(wcid)) + return FALSE; + + MacTableDeleteEntry(pAd, wcid, pAddr); + + DBGPRINT(RT_DEBUG_TRACE, ("<==== MacTableDeleteDlsEntry\n")); + + return TRUE; +} + +MAC_TABLE_ENTRY *DlsEntryTableLookup( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pAddr, + IN BOOLEAN bResetIdelCount) +{ + ULONG HashIdx; + MAC_TABLE_ENTRY *pEntry = NULL; + + RTMP_SEM_LOCK(&pAd->MacTabLock); + HashIdx = MAC_ADDR_HASH_INDEX(pAddr); + pEntry = pAd->MacTab.Hash[HashIdx]; + + while (pEntry) + { + if (IS_ENTRY_DLS(pEntry) + && MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) + { + if(bResetIdelCount) + pEntry->NoDataIdleCount = 0; + break; + } + else + pEntry = pEntry->pNext; + } + + RTMP_SEM_UNLOCK(&pAd->MacTabLock); + return pEntry; +} + +MAC_TABLE_ENTRY *DlsEntryTableLookupByWcid( + IN PRTMP_ADAPTER pAd, + IN UCHAR wcid, + IN PUCHAR pAddr, + IN BOOLEAN bResetIdelCount) +{ + ULONG DLsIndex; + PMAC_TABLE_ENTRY pCurEntry = NULL; + PMAC_TABLE_ENTRY pEntry = NULL; + + if (!VALID_WCID(wcid)) + return NULL; + + RTMP_SEM_LOCK(&pAd->MacTabLock); + + do + { + pCurEntry = &pAd->MacTab.Content[wcid]; + + DLsIndex = 0xff; + if ((pCurEntry) && IS_ENTRY_DLS(pCurEntry)) + { + DLsIndex = pCurEntry->MatchDlsEntryIdx; + } + + if (DLsIndex == 0xff) + break; + + if (MAC_ADDR_EQUAL(pCurEntry->Addr, pAddr)) + { + if(bResetIdelCount) + pCurEntry->NoDataIdleCount = 0; + pEntry = pCurEntry; + break; + } + } while(FALSE); + + RTMP_SEM_UNLOCK(&pAd->MacTabLock); + + return pEntry; +} + +INT Set_DlsEntryInfo_Display_Proc( + IN PRTMP_ADAPTER pAd, + IN PUCHAR arg) +{ + INT i; + + DBGPRINT(RT_DEBUG_OFF, ("\n%-19s%-8s\n", "MAC", "TIMEOUT\n")); + for (i=0; i<MAX_NUM_OF_DLS_ENTRY; i++) + { + if ((pAd->StaCfg.DLSEntry[i].Valid) && (pAd->StaCfg.DLSEntry[i].Status == DLS_FINISH)) + { + PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[pAd->StaCfg.DLSEntry[i].MacTabMatchWCID]; + + DBGPRINT(RT_DEBUG_OFF, ("%02x:%02x:%02x:%02x:%02x:%02x ", + pAd->StaCfg.DLSEntry[i].MacAddr[0], pAd->StaCfg.DLSEntry[i].MacAddr[1], pAd->StaCfg.DLSEntry[i].MacAddr[2], + pAd->StaCfg.DLSEntry[i].MacAddr[3], pAd->StaCfg.DLSEntry[i].MacAddr[4], pAd->StaCfg.DLSEntry[i].MacAddr[5])); + DBGPRINT(RT_DEBUG_OFF, ("%-8d\n", pAd->StaCfg.DLSEntry[i].TimeOut)); + + DBGPRINT(RT_DEBUG_OFF, ("\n")); + DBGPRINT(RT_DEBUG_OFF, ("\n%-19s%-4s%-4s%-4s%-4s%-7s%-7s%-7s","MAC", "AID", "BSS", "PSM", "WMM", "RSSI0", "RSSI1", "RSSI2")); +#ifdef DOT11_N_SUPPORT + DBGPRINT(RT_DEBUG_OFF, ("%-8s%-10s%-6s%-6s%-6s%-6s", "MIMOPS", "PhMd", "BW", "MCS", "SGI", "STBC")); +#endif // DOT11_N_SUPPORT // + DBGPRINT(RT_DEBUG_OFF, ("\n%02X:%02X:%02X:%02X:%02X:%02X ", + pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], + pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5])); + DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)pEntry->Aid)); + DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)pEntry->apidx)); + DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)pEntry->PsMode)); + DBGPRINT(RT_DEBUG_OFF, ("%-4d", (int)CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE))); + DBGPRINT(RT_DEBUG_OFF, ("%-7d", pEntry->RssiSample.AvgRssi0)); + DBGPRINT(RT_DEBUG_OFF, ("%-7d", pEntry->RssiSample.AvgRssi1)); + DBGPRINT(RT_DEBUG_OFF, ("%-7d", pEntry->RssiSample.AvgRssi2)); +#ifdef DOT11_N_SUPPORT + DBGPRINT(RT_DEBUG_OFF, ("%-8d", (int)pEntry->MmpsMode)); + DBGPRINT(RT_DEBUG_OFF, ("%-10s", GetPhyMode(pEntry->HTPhyMode.field.MODE))); + DBGPRINT(RT_DEBUG_OFF, ("%-6s", GetBW(pEntry->HTPhyMode.field.BW))); + DBGPRINT(RT_DEBUG_OFF, ("%-6d", pEntry->HTPhyMode.field.MCS)); + DBGPRINT(RT_DEBUG_OFF, ("%-6d", pEntry->HTPhyMode.field.ShortGI)); + DBGPRINT(RT_DEBUG_OFF, ("%-6d", pEntry->HTPhyMode.field.STBC)); +#endif // DOT11_N_SUPPORT // + DBGPRINT(RT_DEBUG_OFF, ("%-10d, %d, %d%%\n", pEntry->DebugFIFOCount, pEntry->DebugTxCount, + (pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0)); + DBGPRINT(RT_DEBUG_OFF, ("\n")); + + } + } + + return TRUE; +} + +INT Set_DlsAddEntry_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR mac[MAC_ADDR_LEN]; + USHORT Timeout; + PSTRING token; + STRING sepValue[] = ":", DASH = '-'; + INT i; + RT_802_11_DLS Dls; + + if(strlen(arg) < 19) //Mac address acceptable format 01:02:03:04:05:06 length 17 plus the "-" and timeout value in decimal format. + return FALSE; + + token = strchr(arg, DASH); + if ((token != NULL) && (strlen(token)>1)) + { + Timeout = (USHORT) simple_strtol((token+1), 0, 10); + + *token = '\0'; + for (i = 0, token = rstrtok(arg, &sepValue[0]); token; token = rstrtok(NULL, &sepValue[0]), i++) + { + if((strlen(token) != 2) || (!isxdigit(*token)) || (!isxdigit(*(token+1)))) + return FALSE; + AtoH(token, (&mac[i]), 1); + } + if(i != 6) + return FALSE; + + DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x-%d", mac[0], mac[1], + mac[2], mac[3], mac[4], mac[5], (int)Timeout)); + + NdisZeroMemory(&Dls, sizeof(RT_802_11_DLS)); + Dls.TimeOut = Timeout; + COPY_MAC_ADDR(Dls.MacAddr, mac); + Dls.Valid = 1; + + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + RT_OID_802_11_SET_DLS_PARAM, + sizeof(RT_802_11_DLS), + &Dls, 0); + + return TRUE; + } + + return FALSE; + +} + +INT Set_DlsTearDownEntry_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UCHAR macAddr[MAC_ADDR_LEN]; + PSTRING value; + INT i; + RT_802_11_DLS Dls; + + if(strlen(arg) != 17) //Mac address acceptable format 01:02:03:04:05:06 length 17 + return FALSE; + + for (i=0, value = rstrtok(arg,":"); value; value = rstrtok(NULL,":")) + { + if((strlen(value) != 2) || (!isxdigit(*value)) || (!isxdigit(*(value+1))) ) + return FALSE; //Invalid + + AtoH(value, &macAddr[i++], 2); + } + + DBGPRINT(RT_DEBUG_OFF, ("\n%02x:%02x:%02x:%02x:%02x:%02x", macAddr[0], macAddr[1], + macAddr[2], macAddr[3], macAddr[4], macAddr[5])); + + NdisZeroMemory(&Dls, sizeof(RT_802_11_DLS)); + COPY_MAC_ADDR(Dls.MacAddr, macAddr); + Dls.Valid = 0; + + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + RT_OID_802_11_SET_DLS_PARAM, + sizeof(RT_802_11_DLS), + &Dls, 0); + + return TRUE; +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/rtmp_ckipmic.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/rtmp_ckipmic.c new file mode 100644 index 000000000..45aace8b0 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/rtmp_ckipmic.c @@ -0,0 +1,578 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_ckipmic.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Name Date Modification logs +*/ +#include "rt_config.h" +#include "rtmp_ckipmic.h" + +#define MIC_ACCUM(v) pContext->accum += (ULONGLONG)v * RTMPMicGetCoefficient(pContext) +#define GB(p,i,s) ( ((ULONG) *((UCHAR*)(p)+i) ) << (s) ) +#define GETBIG32(p) GB(p,0,24)|GB(p,1,16)|GB(p,2,8)|GB(p,3,0) + +/*****************************/ +/******** SBOX Table *********/ +/*****************************/ + +UCHAR SboxTable[256] = +{ + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, + 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, + 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, + 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, + 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, + 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, + 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, + 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, + 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, + 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, + 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, + 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, + 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, + 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, + 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, + 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +/*===========================================================================*/ +/*=================== CKIP KEY PERMUTATION ==================================*/ +/*===========================================================================*/ + +/* 2-byte by 2-byte subset of the full AES table */ +static const USHORT Sbox[256] = +{ + 0xC6A5,0xF884,0xEE99,0xF68D,0xFF0D,0xD6BD,0xDEB1,0x9154, + 0x6050,0x0203,0xCEA9,0x567D,0xE719,0xB562,0x4DE6,0xEC9A, + 0x8F45,0x1F9D,0x8940,0xFA87,0xEF15,0xB2EB,0x8EC9,0xFB0B, + 0x41EC,0xB367,0x5FFD,0x45EA,0x23BF,0x53F7,0xE496,0x9B5B, + 0x75C2,0xE11C,0x3DAE,0x4C6A,0x6C5A,0x7E41,0xF502,0x834F, + 0x685C,0x51F4,0xD134,0xF908,0xE293,0xAB73,0x6253,0x2A3F, + 0x080C,0x9552,0x4665,0x9D5E,0x3028,0x37A1,0x0A0F,0x2FB5, + 0x0E09,0x2436,0x1B9B,0xDF3D,0xCD26,0x4E69,0x7FCD,0xEA9F, + 0x121B,0x1D9E,0x5874,0x342E,0x362D,0xDCB2,0xB4EE,0x5BFB, + 0xA4F6,0x764D,0xB761,0x7DCE,0x527B,0xDD3E,0x5E71,0x1397, + 0xA6F5,0xB968,0x0000,0xC12C,0x4060,0xE31F,0x79C8,0xB6ED, + 0xD4BE,0x8D46,0x67D9,0x724B,0x94DE,0x98D4,0xB0E8,0x854A, + 0xBB6B,0xC52A,0x4FE5,0xED16,0x86C5,0x9AD7,0x6655,0x1194, + 0x8ACF,0xE910,0x0406,0xFE81,0xA0F0,0x7844,0x25BA,0x4BE3, + 0xA2F3,0x5DFE,0x80C0,0x058A,0x3FAD,0x21BC,0x7048,0xF104, + 0x63DF,0x77C1,0xAF75,0x4263,0x2030,0xE51A,0xFD0E,0xBF6D, + 0x814C,0x1814,0x2635,0xC32F,0xBEE1,0x35A2,0x88CC,0x2E39, + 0x9357,0x55F2,0xFC82,0x7A47,0xC8AC,0xBAE7,0x322B,0xE695, + 0xC0A0,0x1998,0x9ED1,0xA37F,0x4466,0x547E,0x3BAB,0x0B83, + 0x8CCA,0xC729,0x6BD3,0x283C,0xA779,0xBCE2,0x161D,0xAD76, + 0xDB3B,0x6456,0x744E,0x141E,0x92DB,0x0C0A,0x486C,0xB8E4, + 0x9F5D,0xBD6E,0x43EF,0xC4A6,0x39A8,0x31A4,0xD337,0xF28B, + 0xD532,0x8B43,0x6E59,0xDAB7,0x018C,0xB164,0x9CD2,0x49E0, + 0xD8B4,0xACFA,0xF307,0xCF25,0xCAAF,0xF48E,0x47E9,0x1018, + 0x6FD5,0xF088,0x4A6F,0x5C72,0x3824,0x57F1,0x73C7,0x9751, + 0xCB23,0xA17C,0xE89C,0x3E21,0x96DD,0x61DC,0x0D86,0x0F85, + 0xE090,0x7C42,0x71C4,0xCCAA,0x90D8,0x0605,0xF701,0x1C12, + 0xC2A3,0x6A5F,0xAEF9,0x69D0,0x1791,0x9958,0x3A27,0x27B9, + 0xD938,0xEB13,0x2BB3,0x2233,0xD2BB,0xA970,0x0789,0x33A7, + 0x2DB6,0x3C22,0x1592,0xC920,0x8749,0xAAFF,0x5078,0xA57A, + 0x038F,0x59F8,0x0980,0x1A17,0x65DA,0xD731,0x84C6,0xD0B8, + 0x82C3,0x29B0,0x5A77,0x1E11,0x7BCB,0xA8FC,0x6DD6,0x2C3A + }; + +#define Lo8(v16) ((v16) & 0xFF) +#define Hi8(v16) (((v16) >> 8) & 0xFF) +#define u16Swap(i) ( (((i) >> 8) & 0xFF) | (((i) << 8) & 0xFF00) ) +#define _S_(i) (Sbox[Lo8(i)] ^ u16Swap(Sbox[Hi8(i)])) + +#define rotLeft_1(x) ((((x) << 1) | ((x) >> 15)) & 0xFFFF) +VOID CKIP_key_permute + ( + OUT UCHAR *PK, /* output permuted key */ + IN UCHAR *CK, /* input CKIP key */ + IN UCHAR toDsFromDs, /* input toDs/FromDs bits */ + IN UCHAR *piv /* input pointer to IV */ + ) +{ + int i; + USHORT H[2], tmp; /* H=32-bits of per-packet hash value */ + USHORT L[8], R[8]; /* L=u16 array of CK, R=u16 array of PK */ + + /* build L from input key */ + memset(L, 0, sizeof(L)); + for (i=0; i<16; i++) { + L[i>>1] |= ( ((USHORT)(CK[i])) << ( i & 1 ? 8 : 0) ); + } + + H[0] = (((USHORT)piv[0]) << 8) + piv[1]; + H[1] = ( ((USHORT)toDsFromDs) << 8) | piv[2]; + + for (i=0; i<8; i++) { + H[0] ^= L[i]; /* 16-bits of key material */ + tmp = _S_(H[0]); /* 16x16 permutation */ + H[0] = tmp ^ H[1]; /* set up for next round */ + H[1] = tmp; + R[i] = H[0]; /* store into key array */ + } + + /* sweep in the other direction */ + tmp=L[0]; + for (i=7; i>0; i--) { + R[i] = tmp = rotLeft_1(tmp) + R[i]; + } + + /* IV of the permuted key is unchanged */ + PK[0] = piv[0]; + PK[1] = piv[1]; + PK[2] = piv[2]; + + /* key portion of the permuted key is changed */ + for (i=3; i<16; i++) { + PK[i] = (UCHAR) (R[i>>1] >> (i & 1 ? 8 : 0)); + } +} + +/* prepare for calculation of a new mic */ +VOID RTMPCkipMicInit( + IN PMIC_CONTEXT pContext, + IN PUCHAR CK) +{ + /* prepare for new mic calculation */ + NdisMoveMemory(pContext->CK, CK, sizeof(pContext->CK)); + pContext->accum = 0; + pContext->position = 0; +} + +/* add some bytes to the mic calculation */ +VOID RTMPMicUpdate( + IN PMIC_CONTEXT pContext, + IN PUCHAR pOctets, + IN INT len) +{ + INT byte_position; + ULONG val; + + byte_position = (pContext->position & 3); + while (len > 0) { + /* build a 32-bit word for MIC multiply accumulate */ + do { + if (len == 0) return; + pContext->part[byte_position++] = *pOctets++; + pContext->position++; + len--; + } while (byte_position < 4); + /* have a full 32-bit word to process */ + val = GETBIG32(&pContext->part[0]); + MIC_ACCUM(val); + byte_position = 0; + } +} + +ULONG RTMPMicGetCoefficient( + IN PMIC_CONTEXT pContext) +{ + UCHAR aes_counter[16]; + INT coeff_position; + UCHAR *p; + + coeff_position = (pContext->position - 1) >> 2; + if ( (coeff_position & 3) == 0) { + /* fetching the first coefficient -- get new 16-byte aes counter output */ + u32 counter = (coeff_position >> 2); + + /* new counter value */ + memset(&aes_counter[0], 0, sizeof(aes_counter)); + aes_counter[15] = (UINT8)(counter >> 0); + aes_counter[14] = (UINT8)(counter >> 8); + aes_counter[13] = (UINT8)(counter >> 16); + aes_counter[12] = (UINT8)(counter >> 24); + + RTMPAesEncrypt(&pContext->CK[0], &aes_counter[0], pContext->coefficient); + } + p = &(pContext->coefficient[ (coeff_position & 3) << 2 ]); + return GETBIG32(p); +} + +/****************************************/ +/* aes128k128d() */ +/* Performs a 128 bit AES encrypt with */ +/* 128 bit data. */ +/****************************************/ +VOID xor_128( + IN PUCHAR a, + IN PUCHAR b, + OUT PUCHAR out) +{ + INT i; + + for (i=0;i<16; i++) + { + out[i] = a[i] ^ b[i]; + } +} + +UCHAR RTMPCkipSbox( + IN UCHAR a) +{ + return SboxTable[(int)a]; +} + +VOID xor_32( + IN PUCHAR a, + IN PUCHAR b, + OUT PUCHAR out) +{ + INT i; + + for (i=0;i<4; i++) + { + out[i] = a[i] ^ b[i]; + } +} + +VOID next_key( + IN PUCHAR key, + IN INT round) +{ + UCHAR rcon; + UCHAR sbox_key[4]; + UCHAR rcon_table[12] = + { + 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, + 0x1b, 0x36, 0x36, 0x36 + }; + + sbox_key[0] = RTMPCkipSbox(key[13]); + sbox_key[1] = RTMPCkipSbox(key[14]); + sbox_key[2] = RTMPCkipSbox(key[15]); + sbox_key[3] = RTMPCkipSbox(key[12]); + + rcon = rcon_table[round]; + + xor_32(&key[0], sbox_key, &key[0]); + key[0] = key[0] ^ rcon; + + xor_32(&key[4], &key[0], &key[4]); + xor_32(&key[8], &key[4], &key[8]); + xor_32(&key[12], &key[8], &key[12]); +} + +VOID byte_sub( + IN PUCHAR in, + OUT PUCHAR out) +{ + INT i; + + for (i=0; i< 16; i++) + { + out[i] = RTMPCkipSbox(in[i]); + } +} + +VOID shift_row( + IN PUCHAR in, + OUT PUCHAR out) +{ + out[0] = in[0]; + out[1] = in[5]; + out[2] = in[10]; + out[3] = in[15]; + out[4] = in[4]; + out[5] = in[9]; + out[6] = in[14]; + out[7] = in[3]; + out[8] = in[8]; + out[9] = in[13]; + out[10] = in[2]; + out[11] = in[7]; + out[12] = in[12]; + out[13] = in[1]; + out[14] = in[6]; + out[15] = in[11]; +} + +VOID mix_column( + IN PUCHAR in, + OUT PUCHAR out) +{ + INT i; + UCHAR add1b[4]; + UCHAR add1bf7[4]; + UCHAR rotl[4]; + UCHAR swap_halfs[4]; + UCHAR andf7[4]; + UCHAR rotr[4]; + UCHAR temp[4]; + UCHAR tempb[4]; + + for (i=0 ; i<4; i++) + { + if ((in[i] & 0x80)== 0x80) + add1b[i] = 0x1b; + else + add1b[i] = 0x00; + } + + swap_halfs[0] = in[2]; /* Swap halfs */ + swap_halfs[1] = in[3]; + swap_halfs[2] = in[0]; + swap_halfs[3] = in[1]; + + rotl[0] = in[3]; /* Rotate left 8 bits */ + rotl[1] = in[0]; + rotl[2] = in[1]; + rotl[3] = in[2]; + + andf7[0] = in[0] & 0x7f; + andf7[1] = in[1] & 0x7f; + andf7[2] = in[2] & 0x7f; + andf7[3] = in[3] & 0x7f; + + for (i = 3; i>0; i--) /* logical shift left 1 bit */ + { + andf7[i] = andf7[i] << 1; + if ((andf7[i-1] & 0x80) == 0x80) + { + andf7[i] = (andf7[i] | 0x01); + } + } + andf7[0] = andf7[0] << 1; + andf7[0] = andf7[0] & 0xfe; + + xor_32(add1b, andf7, add1bf7); + + xor_32(in, add1bf7, rotr); + + temp[0] = rotr[0]; /* Rotate right 8 bits */ + rotr[0] = rotr[1]; + rotr[1] = rotr[2]; + rotr[2] = rotr[3]; + rotr[3] = temp[0]; + + xor_32(add1bf7, rotr, temp); + xor_32(swap_halfs, rotl,tempb); + xor_32(temp, tempb, out); +} + +VOID RTMPAesEncrypt( + IN PUCHAR key, + IN PUCHAR data, + IN PUCHAR ciphertext) +{ + INT round; + INT i; + UCHAR intermediatea[16]; + UCHAR intermediateb[16]; + UCHAR round_key[16]; + + for(i=0; i<16; i++) round_key[i] = key[i]; + + for (round = 0; round < 11; round++) + { + if (round == 0) + { + xor_128(round_key, data, ciphertext); + next_key(round_key, round); + } + else if (round == 10) + { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + xor_128(intermediateb, round_key, ciphertext); + } + else /* 1 - 9 */ + { + byte_sub(ciphertext, intermediatea); + shift_row(intermediatea, intermediateb); + mix_column(&intermediateb[0], &intermediatea[0]); + mix_column(&intermediateb[4], &intermediatea[4]); + mix_column(&intermediateb[8], &intermediatea[8]); + mix_column(&intermediateb[12], &intermediatea[12]); + xor_128(intermediatea, round_key, ciphertext); + next_key(round_key, round); + } + } + +} + +/* calculate the mic */ +VOID RTMPMicFinal( + IN PMIC_CONTEXT pContext, + OUT UCHAR digest[4]) +{ + INT byte_position; + ULONG val; + ULONGLONG sum, utmp; + LONGLONG stmp; + + /* deal with partial 32-bit word left over from last update */ + if ( (byte_position = (pContext->position & 3)) != 0) { + /* have a partial word in part to deal with -- zero unused bytes */ + do { + pContext->part[byte_position++] = 0; + pContext->position++; + } while (byte_position < 4); + val = GETBIG32(&pContext->part[0]); + MIC_ACCUM(val); + } + + /* reduce the accumulated u64 to a 32-bit MIC */ + sum = pContext->accum; + stmp = (sum & 0xffffffffL) - ((sum >> 32) * 15); + utmp = (stmp & 0xffffffffL) - ((stmp >> 32) * 15); + sum = utmp & 0xffffffffL; + if (utmp > 0x10000000fL) + sum -= 15; + + val = (ULONG)sum; + digest[0] = (UCHAR)((val>>24) & 0xFF); + digest[1] = (UCHAR) ((val>>16) & 0xFF); + digest[2] = (UCHAR) ((val>>8) & 0xFF); + digest[3] = (UCHAR)((val>>0) & 0xFF); +} + +VOID RTMPCkipInsertCMIC( + IN PRTMP_ADAPTER pAd, + OUT PUCHAR pMIC, + IN PUCHAR p80211hdr, + IN PNDIS_PACKET pPacket, + IN PCIPHER_KEY pKey, + IN PUCHAR mic_snap) +{ + PACKET_INFO PacketInfo; + PUCHAR pSrcBufVA; + ULONG SrcBufLen; + PUCHAR pDA, pSA, pProto; + UCHAR bigethlen[2]; + UCHAR ckip_ck[16]; + MIC_CONTEXT mic_ctx; + USHORT payloadlen; + UCHAR i; + + if (pKey == NULL) + { + DBGPRINT_ERR(("RTMPCkipInsertCMIC, Before to form the CKIP key (CK), pKey can't be NULL\n")); + return; + } + + switch (*(p80211hdr+1) & 3) + { + case 0: /* FromDs=0, ToDs=0 */ + pDA = p80211hdr+4; + pSA = p80211hdr+10; + break; + case 1: /* FromDs=0, ToDs=1 */ + pDA = p80211hdr+16; + pSA = p80211hdr+10; + break; + case 2: /* FromDs=1, ToDs=0 */ + pDA = p80211hdr+4; + pSA = p80211hdr+16; + break; + case 3: /* FromDs=1, ToDs=1 */ + pDA = p80211hdr+16; + pSA = p80211hdr+24; + break; + } + + RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); + + if (SrcBufLen < LENGTH_802_3) + return; + + pProto = pSrcBufVA + 12; + payloadlen = PacketInfo.TotalPacketLength - LENGTH_802_3 + 18; // CKIP_LLC(8)+CMIC(4)+TxSEQ(4)+PROTO(2)=18 + + bigethlen[0] = (unsigned char)(payloadlen >> 8); + bigethlen[1] = (unsigned char)payloadlen; + + // + // Encryption Key expansion to form the CKIP Key (CKIP_CK). + // + if (pKey->KeyLen < 16) + { + for(i = 0; i < (16 / pKey->KeyLen); i++) + { + NdisMoveMemory(ckip_ck + i * pKey->KeyLen, + pKey->Key, + pKey->KeyLen); + } + NdisMoveMemory(ckip_ck + i * pKey->KeyLen, + pKey->Key, + 16 - (i * pKey->KeyLen)); + } + else + { + NdisMoveMemory(ckip_ck, pKey->Key, pKey->KeyLen); + } + RTMPCkipMicInit(&mic_ctx, ckip_ck); + RTMPMicUpdate(&mic_ctx, pDA, MAC_ADDR_LEN); // MIC <-- DA + RTMPMicUpdate(&mic_ctx, pSA, MAC_ADDR_LEN); // MIC <-- SA + RTMPMicUpdate(&mic_ctx, bigethlen, 2); // MIC <-- payload length starting from CKIP SNAP + RTMPMicUpdate(&mic_ctx, mic_snap, 8); // MIC <-- snap header + RTMPMicUpdate(&mic_ctx, pAd->StaCfg.TxSEQ, 4); // MIC <-- TxSEQ + RTMPMicUpdate(&mic_ctx, pProto, 2); // MIC <-- Protocol + + pSrcBufVA += LENGTH_802_3; + SrcBufLen -= LENGTH_802_3; + + // Mic <-- original payload. loop until all payload processed + do + { + if (SrcBufLen > 0) + RTMPMicUpdate(&mic_ctx, pSrcBufVA, SrcBufLen); + + NdisGetNextBuffer(PacketInfo.pFirstBuffer, &PacketInfo.pFirstBuffer); + if (PacketInfo.pFirstBuffer) + { + NDIS_QUERY_BUFFER(PacketInfo.pFirstBuffer, &pSrcBufVA, &SrcBufLen); + } + else + break; + } while (TRUE); + + RTMPMicFinal(&mic_ctx, pMIC); // update MIC +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/rtmp_data.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/rtmp_data.c new file mode 100644 index 000000000..01ffda3a1 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/rtmp_data.c @@ -0,0 +1,3062 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + rtmp_data.c + + Abstract: + Data path subroutines + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- +*/ +#include "rt_config.h" + + + +VOID STARxEAPOLFrameIndicate( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + PRXWI_STRUC pRxWI = pRxBlk->pRxWI; + UCHAR *pTmpBuf; + + +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP) + { + // All EAPoL frames have to pass to upper layer (ex. WPA_SUPPLICANT daemon) + // TBD : process fragmented EAPol frames + { + // In 802.1x mode, if the received frame is EAP-SUCCESS packet, turn on the PortSecured variable + if ( pAd->StaCfg.IEEE8021X == TRUE && + (EAP_CODE_SUCCESS == WpaCheckEapCode(pAd, pRxBlk->pData, pRxBlk->DataSize, LENGTH_802_1_H))) + { + PUCHAR Key; + UCHAR CipherAlg; + int idx = 0; + + DBGPRINT_RAW(RT_DEBUG_TRACE, ("Receive EAP-SUCCESS Packet\n")); + //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAd); + + if (pAd->StaCfg.IEEE8021x_required_keys == FALSE) + { + idx = pAd->StaCfg.DesireSharedKeyId; + CipherAlg = pAd->StaCfg.DesireSharedKey[idx].CipherAlg; + Key = pAd->StaCfg.DesireSharedKey[idx].Key; + + if (pAd->StaCfg.DesireSharedKey[idx].KeyLen > 0) + { + // Set key material and cipherAlg to Asic + RTMP_ASIC_SHARED_KEY_TABLE(pAd, BSS0, idx, &pAd->StaCfg.DesireSharedKey[idx]); + + /* STA doesn't need to set WCID attribute for group key */ + + // Assign pairwise key info + RTMP_SET_WCID_SEC_INFO(pAd, BSS0, idx, CipherAlg, BSSID_WCID, SHAREDKEYTABLE); + + pAd->IndicateMediaState = NdisMediaStateConnected; + pAd->ExtraInfo = GENERAL_LINK_UP; + + // For Preventing ShardKey Table is cleared by remove key procedure. + pAd->SharedKey[BSS0][idx].CipherAlg = CipherAlg; + pAd->SharedKey[BSS0][idx].KeyLen = pAd->StaCfg.DesireSharedKey[idx].KeyLen; + NdisMoveMemory(pAd->SharedKey[BSS0][idx].Key, + pAd->StaCfg.DesireSharedKey[idx].Key, + pAd->StaCfg.DesireSharedKey[idx].KeyLen); + } + } + } + + Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID); + return; + } + } + else +#endif // WPA_SUPPLICANT_SUPPORT // + { + // Special DATA frame that has to pass to MLME + // 1. Cisco Aironet frames for CCX2. We need pass it to MLME for special process + // 2. EAPOL handshaking frames when driver supplicant enabled, pass to MLME for special process + { + pTmpBuf = pRxBlk->pData - LENGTH_802_11; + NdisMoveMemory(pTmpBuf, pRxBlk->pHeader, LENGTH_802_11); + REPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->WirelessCliID, pTmpBuf, pRxBlk->DataSize + LENGTH_802_11, pRxWI->RSSI0, pRxWI->RSSI1, pRxWI->RSSI2, 0); + DBGPRINT_RAW(RT_DEBUG_TRACE, ("!!! report EAPOL/AIRONET DATA to MLME (len=%d) !!!\n", pRxBlk->DataSize)); + } + } + + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + +} + +VOID STARxDataFrameAnnounce( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN RX_BLK *pRxBlk, + IN UCHAR FromWhichBSSID) +{ + + // non-EAP frame + if (!RTMPCheckWPAframe(pAd, pEntry, pRxBlk->pData, pRxBlk->DataSize, FromWhichBSSID)) + { + + + + { + // drop all non-EAP DATA frame before + // this client's Port-Access-Control is secured + if (pRxBlk->pHeader->FC.Wep) + { + // unsupported cipher suite + if (pAd->StaCfg.WepStatus == Ndis802_11EncryptionDisabled) + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + } + } + else + { + // encryption in-use but receive a non-EAPOL clear text frame, drop it + if ((pAd->StaCfg.WepStatus != Ndis802_11EncryptionDisabled) && + (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return; + } + } + } + RX_BLK_CLEAR_FLAG(pRxBlk, fRX_EAP); + + + if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_ARALINK)) + { + // Normal legacy, AMPDU or AMSDU + CmmRxnonRalinkFrameIndicate(pAd, pRxBlk, FromWhichBSSID); + + } + else + { + // ARALINK + CmmRxRalinkFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID); + } +#ifdef QOS_DLS_SUPPORT + RX_BLK_CLEAR_FLAG(pRxBlk, fRX_DLS); +#endif // QOS_DLS_SUPPORT // + } + else + { + RX_BLK_SET_FLAG(pRxBlk, fRX_EAP); +#ifdef DOT11_N_SUPPORT + if (RX_BLK_TEST_FLAG(pRxBlk, fRX_AMPDU) && (pAd->CommonCfg.bDisableReordering == 0)) + { + Indicate_AMPDU_Packet(pAd, pRxBlk, FromWhichBSSID); + } + else +#endif // DOT11_N_SUPPORT // + { + // Determin the destination of the EAP frame + // to WPA state machine or upper layer + STARxEAPOLFrameIndicate(pAd, pEntry, pRxBlk, FromWhichBSSID); + } + } +} + + +// For TKIP frame, calculate the MIC value +BOOLEAN STACheckTkipMICValue( + IN PRTMP_ADAPTER pAd, + IN MAC_TABLE_ENTRY *pEntry, + IN RX_BLK *pRxBlk) +{ + PHEADER_802_11 pHeader = pRxBlk->pHeader; + UCHAR *pData = pRxBlk->pData; + USHORT DataSize = pRxBlk->DataSize; + UCHAR UserPriority = pRxBlk->UserPriority; + PCIPHER_KEY pWpaKey; + UCHAR *pDA, *pSA; + + pWpaKey = &pAd->SharedKey[BSS0][pRxBlk->pRxWI->KeyIndex]; + + pDA = pHeader->Addr1; + if (RX_BLK_TEST_FLAG(pRxBlk, fRX_INFRA)) + { + pSA = pHeader->Addr3; + } + else + { + pSA = pHeader->Addr2; + } + + if (RTMPTkipCompareMICValue(pAd, + pData, + pDA, + pSA, + pWpaKey->RxMic, + UserPriority, + DataSize) == FALSE) + { + DBGPRINT_RAW(RT_DEBUG_ERROR,("Rx MIC Value error 2\n")); + +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.WpaSupplicantUP) + { + WpaSendMicFailureToWpaSupplicant(pAd, (pWpaKey->Type == PAIRWISEKEY) ? TRUE : FALSE); + } + else +#endif // WPA_SUPPLICANT_SUPPORT // + { + RTMPReportMicError(pAd, pWpaKey); + } + + // release packet + RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); + return FALSE; + } + + return TRUE; +} + + +// +// All Rx routines use RX_BLK structure to hande rx events +// It is very important to build pRxBlk attributes +// 1. pHeader pointer to 802.11 Header +// 2. pData pointer to payload including LLC (just skip Header) +// 3. set payload size including LLC to DataSize +// 4. set some flags with RX_BLK_SET_FLAG() +// +VOID STAHandleRxDataFrame( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk) +{ + PRT28XX_RXD_STRUC pRxD = &(pRxBlk->RxD); + PRXWI_STRUC pRxWI = pRxBlk->pRxWI; + PHEADER_802_11 pHeader = pRxBlk->pHeader; + PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; + BOOLEAN bFragment = FALSE; + MAC_TABLE_ENTRY *pEntry = NULL; + UCHAR FromWhichBSSID = BSS0; + UCHAR UserPriority = 0; + + if ((pHeader->FC.FrDs == 1) && (pHeader->FC.ToDs == 1)) + { +#ifdef CLIENT_WDS + if ((pRxWI->WirelessCliID < MAX_LEN_OF_MAC_TABLE) + && IS_ENTRY_CLIENT(&pAd->MacTab.Content[pRxWI->WirelessCliID])) + { + RX_BLK_SET_FLAG(pRxBlk, fRX_WDS); + } + else +#endif // CLIENT_WDS // + { // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + } + else + { + // before LINK UP, all DATA frames are rejected + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + +#ifdef QOS_DLS_SUPPORT + //if ((pHeader->FC.FrDs == 0) && (pHeader->FC.ToDs == 0)) + if (RTMPRcvFrameDLSCheck(pAd, pHeader, pRxWI->MPDUtotalByteCount, pRxD)) + { + return; + } +#endif // QOS_DLS_SUPPORT // + + // Drop not my BSS frames + if (pRxD->MyBss == 0) + { + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + } + + pAd->RalinkCounters.RxCountSinceLastNULL++; + if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable && (pHeader->FC.SubType & 0x08)) + { + UCHAR *pData; + DBGPRINT(RT_DEBUG_INFO,("bAPSDCapable\n")); + + // Qos bit 4 + pData = (PUCHAR)pHeader + LENGTH_802_11; + if ((*pData >> 4) & 0x01) + { + DBGPRINT(RT_DEBUG_INFO,("RxDone- Rcv EOSP frame, driver may fall into sleep\n")); + pAd->CommonCfg.bInServicePeriod = FALSE; + + // Force driver to fall into sleep mode when rcv EOSP frame + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { +#ifdef RTMP_MAC_PCI + USHORT TbttNumToNextWakeUp; + USHORT NextDtim = pAd->StaCfg.DtimPeriod; + ULONG Now; + + NdisGetSystemUpTime(&Now); + NextDtim -= (USHORT)(Now - pAd->StaCfg.LastBeaconRxTime)/pAd->CommonCfg.BeaconPeriod; + + TbttNumToNextWakeUp = pAd->StaCfg.DefaultListenCount; + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim)) + TbttNumToNextWakeUp = NextDtim; + + RTMP_SET_PSM_BIT(pAd, PWR_SAVE); + // if WMM-APSD is failed, try to disable following line + AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp); +#endif // RTMP_MAC_PCI // + + } + } + + if ((pHeader->FC.MoreData) && (pAd->CommonCfg.bInServicePeriod)) + { + DBGPRINT(RT_DEBUG_TRACE,("Sending another trigger frame when More Data bit is set to 1\n")); + } + } + + // Drop NULL, CF-ACK(no data), CF-POLL(no data), and CF-ACK+CF-POLL(no data) data frame + if ((pHeader->FC.SubType & 0x04)) // bit 2 : no DATA + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + // Drop not my BSS frame (we can not only check the MyBss bit in RxD) + if (INFRA_ON(pAd)) + { + // Infrastructure mode, check address 2 for BSSID + if (1 +#ifdef QOS_DLS_SUPPORT + && (!pAd->CommonCfg.bDLSCapable) +#endif // QOS_DLS_SUPPORT // + ) + { + if (!RTMPEqualMemory(&pHeader->Addr2, &pAd->CommonCfg.Bssid, 6)) + { + // Receive frame not my BSSID + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + } + } + else // Ad-Hoc mode or Not associated + { + // Ad-Hoc mode, check address 3 for BSSID + if (!RTMPEqualMemory(&pHeader->Addr3, &pAd->CommonCfg.Bssid, 6)) + { + // Receive frame not my BSSID + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + } + + // + // find pEntry + // + if (pRxWI->WirelessCliID < MAX_LEN_OF_MAC_TABLE) + { + pEntry = &pAd->MacTab.Content[pRxWI->WirelessCliID]; + + } + else + { + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + // infra or ad-hoc + if (INFRA_ON(pAd)) + { + RX_BLK_SET_FLAG(pRxBlk, fRX_INFRA); +#if defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT) + if ((pHeader->FC.FrDs == 0) && (pHeader->FC.ToDs == 0)) + RX_BLK_SET_FLAG(pRxBlk, fRX_DLS); + else +#endif + ASSERT(pRxWI->WirelessCliID == BSSID_WCID); + } + + // check Atheros Client + if ((pEntry->bIAmBadAtheros == FALSE) && (pRxD->AMPDU == 1) && (pHeader->FC.Retry )) + { + pEntry->bIAmBadAtheros = TRUE; + pAd->CommonCfg.IOTestParm.bCurrentAtheros = TRUE; + pAd->CommonCfg.IOTestParm.bLastAtheros = TRUE; + if (!STA_AES_ON(pAd)) + { + AsicUpdateProtect(pAd, 8, ALLN_SETPROTECT, TRUE, FALSE); + } + } + } + + pRxBlk->pData = (UCHAR *)pHeader; + + // + // update RxBlk->pData, DataSize + // 802.11 Header, QOS, HTC, Hw Padding + // + + // 1. skip 802.11 HEADER +#ifdef CLIENT_WDS + if (RX_BLK_TEST_FLAG(pRxBlk, fRX_WDS)) + { + pRxBlk->pData += LENGTH_802_11_WITH_ADDR4; + pRxBlk->DataSize -= LENGTH_802_11_WITH_ADDR4; + } + else +#endif // CLIENT_WDS // + { + pRxBlk->pData += LENGTH_802_11; + pRxBlk->DataSize -= LENGTH_802_11; + } + + // 2. QOS + if (pHeader->FC.SubType & 0x08) + { + RX_BLK_SET_FLAG(pRxBlk, fRX_QOS); + UserPriority = *(pRxBlk->pData) & 0x0f; + // bit 7 in QoS Control field signals the HT A-MSDU format + if ((*pRxBlk->pData) & 0x80) + { + RX_BLK_SET_FLAG(pRxBlk, fRX_AMSDU); + } + + // skip QOS contorl field + pRxBlk->pData += 2; + pRxBlk->DataSize -=2; + } + pRxBlk->UserPriority = UserPriority; + + /* check if need to resend PS Poll when received packet with MoreData = 1 */ + if ((pAd->StaCfg.Psm == PWR_SAVE) && (pHeader->FC.MoreData == 1)) + { + if ((((UserPriority == 0) || (UserPriority == 3)) && + pAd->CommonCfg.bAPSDAC_BE == 0) || + (((UserPriority == 1) || (UserPriority == 2)) && + pAd->CommonCfg.bAPSDAC_BK == 0) || + (((UserPriority == 4) || (UserPriority == 5)) && + pAd->CommonCfg.bAPSDAC_VI == 0) || + (((UserPriority == 6) || (UserPriority == 7)) && + pAd->CommonCfg.bAPSDAC_VO == 0)) + { + /* non-UAPSD delivery-enabled AC */ + RTMP_PS_POLL_ENQUEUE(pAd); + } + } + + // 3. Order bit: A-Ralink or HTC+ + if (pHeader->FC.Order) + { +#ifdef AGGREGATION_SUPPORT + if ((pRxWI->PHYMODE <= MODE_OFDM) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED))) + { + RX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK); + } + else +#endif // AGGREGATION_SUPPORT // + { +#ifdef DOT11_N_SUPPORT + RX_BLK_SET_FLAG(pRxBlk, fRX_HTC); + // skip HTC contorl field + pRxBlk->pData += 4; + pRxBlk->DataSize -= 4; +#endif // DOT11_N_SUPPORT // + } + } + + // 4. skip HW padding + if (pRxD->L2PAD) + { + // just move pData pointer + // because DataSize excluding HW padding + RX_BLK_SET_FLAG(pRxBlk, fRX_PAD); + pRxBlk->pData += 2; + } + +#ifdef DOT11_N_SUPPORT + if (pRxD->BA) + { + RX_BLK_SET_FLAG(pRxBlk, fRX_AMPDU); + } +#endif // DOT11_N_SUPPORT // + +//#ifdef SOFT_ENCRYPT + /* Use software to decrypt the encrypted frame if necessary. + If a received "encrypted" unicast packet(its WEP bit as 1) + and it's passed to driver with "Decrypted" marked as 0 in RxD. */ + if ((pHeader->FC.Wep == 1) && (pRxD->Decrypted == 0)) + { + PCIPHER_KEY pSwKey = NULL; + + /* Cipher key table selection */ + if ((pSwKey = RTMPSwCipherKeySelection(pAd, + pRxBlk->pData, + pRxBlk, + pEntry)) == NULL) + { + DBGPRINT(RT_DEBUG_TRACE, ("No vaild cipher key for SW decryption!!!\n")); + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + /* Decryption by Software */ + if (RTMPSoftDecryptionAction(pAd, + (PUCHAR)pHeader, + UserPriority, + pSwKey, + pRxBlk->pData, + &(pRxBlk->DataSize)) != NDIS_STATUS_SUCCESS) + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + /* Record the Decrypted bit as 1 */ + pRxD->Decrypted = 1; + } +//#endif // SOFT_ENCRYPT // + + + // + // Case I Process Broadcast & Multicast data frame + // + if (pRxD->Bcast || pRxD->Mcast) + { +#ifdef STATS_COUNT_SUPPORT + INC_COUNTER64(pAd->WlanCounters.MulticastReceivedFrameCount); +#endif // STATS_COUNT_SUPPORT // + + // Drop Mcast/Bcast frame with fragment bit on + if (pHeader->FC.MoreFrag) + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + // Filter out Bcast frame which AP relayed for us + if (pHeader->FC.FrDs && MAC_ADDR_EQUAL(pHeader->Addr3, pAd->CurrentAddress)) + { + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + return; + } + + if (ADHOC_ON(pAd)) + { + MAC_TABLE_ENTRY *pAdhocEntry = NULL; + pAdhocEntry = MacTableLookup(pAd, pHeader->Addr2); + if (pAdhocEntry) + Update_Rssi_Sample(pAd, &pAdhocEntry->RssiSample, pRxWI); + } + + Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID); + return; + } + else if (pRxD->U2M) + { + pAd->LastRxRate = (USHORT)((pRxWI->MCS) + (pRxWI->BW <<7) + (pRxWI->ShortGI <<8)+ (pRxWI->PHYMODE <<14)) ; + + +#if defined(DOT11Z_TDLS_SUPPORT) || defined(QOS_DLS_SUPPORT) + if (RX_BLK_TEST_FLAG(pRxBlk, fRX_DLS)) + { + MAC_TABLE_ENTRY *pDlsEntry = NULL; + + //pDlsEntry = MacTableLookup(pAd, pHeader->Addr2); + pDlsEntry = &pAd->MacTab.Content[pRxWI->WirelessCliID]; + //if (pDlsEntry && (IS_ENTRY_DLS(pDlsEntry)|| IS_ENTRY_TDLS(pDlsEntry))) + if (pDlsEntry && (pRxWI->WirelessCliID < MAX_LEN_OF_MAC_TABLE)) + { + Update_Rssi_Sample(pAd, &pDlsEntry->RssiSample, pRxWI); + NdisAcquireSpinLock(&pAd->MacTabLock); + pDlsEntry->NoDataIdleCount = 0; + NdisReleaseSpinLock(&pAd->MacTabLock); + } + } + else +#endif + if (ADHOC_ON(pAd)) + { + MAC_TABLE_ENTRY *pAdhocEntry = NULL; + pAdhocEntry = MacTableLookup(pAd, pHeader->Addr2); + if (pAdhocEntry) + Update_Rssi_Sample(pAd, &pAdhocEntry->RssiSample, pRxWI); + } + + + Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI); + + pAd->StaCfg.LastSNR0 = (UCHAR)(pRxWI->SNR0); + pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1); + + pAd->RalinkCounters.OneSecRxOkDataCnt++; + + + if (!((pHeader->Frag == 0) && (pHeader->FC.MoreFrag == 0))) + { + // re-assemble the fragmented packets + // return complete frame (pRxPacket) or NULL + bFragment = TRUE; + pRxPacket = RTMPDeFragmentDataFrame(pAd, pRxBlk); + } + + if (pRxPacket) + { + pEntry = &pAd->MacTab.Content[pRxWI->WirelessCliID]; + + // process complete frame + if (bFragment && (pRxD->Decrypted) && (pEntry->WepStatus == Ndis802_11Encryption2Enabled)) + { + // Minus MIC length + pRxBlk->DataSize -= 8; + + // For TKIP frame, calculate the MIC value + if (STACheckTkipMICValue(pAd, pEntry, pRxBlk) == FALSE) + { + return; + } + } + + STARxDataFrameAnnounce(pAd, pEntry, pRxBlk, FromWhichBSSID); + return; + } + else + { + // just return + // because RTMPDeFragmentDataFrame() will release rx packet, + // if packet is fragmented + return; + } + } +#ifdef XLINK_SUPPORT + else if (pAd->StaCfg.PSPXlink) + { + Indicate_Legacy_Packet(pAd, pRxBlk, FromWhichBSSID); + return; + } +#endif // XLINK_SUPPORT // + + ASSERT(0); + // release packet + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); +} + +VOID STAHandleRxMgmtFrame( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk) +{ + PRXWI_STRUC pRxWI = pRxBlk->pRxWI; + PHEADER_802_11 pHeader = pRxBlk->pHeader; + PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; + UCHAR MinSNR = 0; + + do + { + + + /* check if need to resend PS Poll when received packet with MoreData = 1 */ + if ((pAd->StaCfg.Psm == PWR_SAVE) && (pHeader->FC.MoreData == 1)) + { + /* for UAPSD, all management frames will be VO priority */ + if (pAd->CommonCfg.bAPSDAC_VO == 0) + { + /* non-UAPSD delivery-enabled AC */ + RTMP_PS_POLL_ENQUEUE(pAd); + } + } + + /* TODO: if MoreData == 0, station can go to sleep */ + + + // We should collect RSSI not only U2M data but also my beacon + if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)) + && (pAd->RxAnt.EvaluatePeriod == 0)) + { + Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI); + + pAd->StaCfg.LastSNR0 = (UCHAR)(pRxWI->SNR0); + pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1); + } + + if ((pHeader->FC.SubType == SUBTYPE_BEACON) && + (ADHOC_ON(pAd)) && + (pRxWI->WirelessCliID < MAX_LEN_OF_MAC_TABLE)) + { + MAC_TABLE_ENTRY *pEntry = NULL; + pEntry = &pAd->MacTab.Content[pRxWI->WirelessCliID]; + if (pEntry) + Update_Rssi_Sample(pAd, &pEntry->RssiSample, pRxWI); + } + + + // First check the size, it MUST not exceed the mlme queue size + if (pRxWI->MPDUtotalByteCount > MGMT_DMA_BUFFER_SIZE) + { + DBGPRINT_ERR(("STAHandleRxMgmtFrame: frame too large, size = %d \n", pRxWI->MPDUtotalByteCount)); + break; + } + + MinSNR = min((CHAR)pRxWI->SNR0, (CHAR)pRxWI->SNR1); + + /* + Signal in MLME_QUEUE isn't used, therefore take this item to save min SNR. + */ + REPORT_MGMT_FRAME_TO_MLME(pAd, pRxWI->WirelessCliID, pHeader, pRxWI->MPDUtotalByteCount, + pRxWI->RSSI0, pRxWI->RSSI1, pRxWI->RSSI2, MinSNR); + } while (FALSE); + + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS); +} + +VOID STAHandleRxControlFrame( + IN PRTMP_ADAPTER pAd, + IN RX_BLK *pRxBlk) +{ +#ifdef DOT11_N_SUPPORT + PRXWI_STRUC pRxWI = pRxBlk->pRxWI; +#endif // DOT11_N_SUPPORT // + PHEADER_802_11 pHeader = pRxBlk->pHeader; + PNDIS_PACKET pRxPacket = pRxBlk->pRxPacket; + BOOLEAN retStatus; + NDIS_STATUS status = NDIS_STATUS_FAILURE; + + switch (pHeader->FC.SubType) + { + case SUBTYPE_BLOCK_ACK_REQ: +#ifdef DOT11_N_SUPPORT + { + retStatus = CntlEnqueueForRecv(pAd, pRxWI->WirelessCliID, (pRxWI->MPDUtotalByteCount), (PFRAME_BA_REQ)pHeader); + status = (retStatus == TRUE) ? NDIS_STATUS_SUCCESS : NDIS_STATUS_FAILURE; + } + break; +#endif // DOT11_N_SUPPORT // + case SUBTYPE_BLOCK_ACK: + case SUBTYPE_ACK: + default: + break; + } + + RELEASE_NDIS_PACKET(pAd, pRxPacket, status); +} + + +/* + ======================================================================== + + Routine Description: + Process RxDone interrupt, running in DPC level + + Arguments: + pAd Pointer to our adapter + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + This routine has to maintain Rx ring read pointer. + Need to consider QOS DATA format when converting to 802.3 + ======================================================================== +*/ +BOOLEAN STARxDoneInterruptHandle( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN argc) +{ + NDIS_STATUS Status; + UINT32 RxProcessed, RxPending; + BOOLEAN bReschedule = FALSE; + RT28XX_RXD_STRUC *pRxD; + UCHAR *pData; + PRXWI_STRUC pRxWI; + PNDIS_PACKET pRxPacket; + PHEADER_802_11 pHeader; + RX_BLK RxCell; + + RxProcessed = RxPending = 0; + + // process whole rx ring + while (1) + { + + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF | + fRTMP_ADAPTER_RESET_IN_PROGRESS | + fRTMP_ADAPTER_HALT_IN_PROGRESS | + fRTMP_ADAPTER_NIC_NOT_EXIST) || + !RTMP_TEST_FLAG(pAd,fRTMP_ADAPTER_START_UP)) + { + break; + } + +#ifdef RTMP_MAC_PCI + if (RxProcessed++ > MAX_RX_PROCESS_CNT) + { + // need to reschedule rx handle + bReschedule = TRUE; + break; + } +#endif // RTMP_MAC_PCI // + + RxProcessed ++; // test + + // 1. allocate a new data packet into rx ring to replace received packet + // then processing the received packet + // 2. the callee must take charge of release of packet + // 3. As far as driver is concerned , + // the rx packet must + // a. be indicated to upper layer or + // b. be released if it is discarded + pRxPacket = GetPacketFromRxRing(pAd, &(RxCell.RxD), &bReschedule, &RxPending); + if (pRxPacket == NULL) + { + // no more packet to process + break; + } + + // get rx ring descriptor + pRxD = &(RxCell.RxD); + // get rx data buffer + pData = GET_OS_PKT_DATAPTR(pRxPacket); + pRxWI = (PRXWI_STRUC) pData; + pHeader = (PHEADER_802_11) (pData+RXWI_SIZE) ; + +#ifdef RT_BIG_ENDIAN + RTMPFrameEndianChange(pAd, (PUCHAR)pHeader, DIR_READ, TRUE); + RTMPWIEndianChange((PUCHAR)pRxWI, TYPE_RXWI); +#endif + + // build RxCell + RxCell.pRxWI = pRxWI; + RxCell.pHeader = pHeader; + RxCell.pRxPacket = pRxPacket; + RxCell.pData = (UCHAR *) pHeader; + RxCell.DataSize = pRxWI->MPDUtotalByteCount; + RxCell.Flags = 0; + + // Increase Total receive byte counter after real data received no mater any error or not + pAd->RalinkCounters.ReceivedByteCount += pRxWI->MPDUtotalByteCount; + pAd->RalinkCounters.OneSecReceivedByteCount += pRxWI->MPDUtotalByteCount; + pAd->RalinkCounters.RxCount ++; + +#ifdef STATS_COUNT_SUPPORT + INC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount); +#endif // STATS_COUNT_SUPPORT // + + if (pRxWI->MPDUtotalByteCount < 14) + Status = NDIS_STATUS_FAILURE; + + if (MONITOR_ON(pAd)) + { + send_monitor_packets(pAd, &RxCell, RTMPMaxRssi, ConvertToRssi); + break; + } + + /* STARxDoneInterruptHandle() is called in rtusb_bulk.c */ +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + { + pAd->ate.RxCntPerSec++; + ATESampleRssi(pAd, pRxWI); +#ifdef RALINK_28xx_QA + if (pAd->ate.bQARxStart == TRUE) + { + /* (*pRxD) has been swapped in GetPacketFromRxRing() */ + ATE_QA_Statistics(pAd, pRxWI, pRxD, pHeader); + } +#endif // RALINK_28xx_QA // + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_SUCCESS); + continue; + } +#endif // RALINK_ATE // + + // Check for all RxD errors + Status = RTMPCheckRxError(pAd, pHeader, pRxWI, pRxD); + + // Handle the received frame + if (Status == NDIS_STATUS_SUCCESS) + { + switch (pHeader->FC.Type) + { + // CASE I, receive a DATA frame + case BTYPE_DATA: + { + // process DATA frame + STAHandleRxDataFrame(pAd, &RxCell); + } + break; + // CASE II, receive a MGMT frame + case BTYPE_MGMT: + { + STAHandleRxMgmtFrame(pAd, &RxCell); + } + break; + // CASE III. receive a CNTL frame + case BTYPE_CNTL: + { + STAHandleRxControlFrame(pAd, &RxCell); + } + break; + // discard other type + default: + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + break; + } + } + else + { + pAd->Counters8023.RxErrors++; + // discard this frame + RELEASE_NDIS_PACKET(pAd, pRxPacket, NDIS_STATUS_FAILURE); + } + } + + return bReschedule; +} + +/* + ======================================================================== + + Routine Description: + Arguments: + pAd Pointer to our adapter + + IRQL = DISPATCH_LEVEL + + ======================================================================== +*/ +VOID RTMPHandleTwakeupInterrupt( + IN PRTMP_ADAPTER pAd) +{ + AsicForceWakeup(pAd, FALSE); +} + +/* +======================================================================== +Routine Description: + Early checking and OS-depened parsing for Tx packet send to our STA driver. + +Arguments: + NDIS_HANDLE MiniportAdapterContext Pointer refer to the device handle, i.e., the pAd. + PPNDIS_PACKET ppPacketArray The packet array need to do transmission. + UINT NumberOfPackets Number of packet in packet array. + +Return Value: + NONE + +Note: + This function do early checking and classification for send-out packet. + You only can put OS-depened & STA related code in here. +======================================================================== +*/ +VOID STASendPackets( + IN NDIS_HANDLE MiniportAdapterContext, + IN PPNDIS_PACKET ppPacketArray, + IN UINT NumberOfPackets) +{ + UINT Index; + PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) MiniportAdapterContext; + PNDIS_PACKET pPacket; + BOOLEAN allowToSend = FALSE; + + + for (Index = 0; Index < NumberOfPackets; Index++) + { + pPacket = ppPacketArray[Index]; + + do + { + + 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_RADIO_OFF)) + { + // Drop send request since hardware is in reset state + break; + } + else if (!INFRA_ON(pAd) && !ADHOC_ON(pAd)) + { + // Drop send request since there are no physical connection yet + break; + } + else + { + // Record that orignal packet source is from NDIS layer,so that + // later on driver knows how to release this NDIS PACKET + if (0 +#ifdef QOS_DLS_SUPPORT + || (pAd->CommonCfg.bDLSCapable) +#endif // QOS_DLS_SUPPORT // + ) + { + MAC_TABLE_ENTRY *pEntry; + PUCHAR pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket); + + pEntry = MacTableLookup(pAd, pSrcBufVA); + + if (pEntry && (IS_ENTRY_DLS(pEntry) || IS_ENTRY_TDLS(pEntry))) + { + RTMP_SET_PACKET_WCID(pPacket, pEntry->Aid); + } + else + { + RTMP_SET_PACKET_WCID(pPacket, 0); + } + } + else + { + RTMP_SET_PACKET_WCID(pPacket, 0); + } + + RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS); + NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_PENDING); + pAd->RalinkCounters.PendingNdisPacketCount++; + + allowToSend = TRUE; + } + } while(FALSE); + + if (allowToSend == TRUE) + STASendPacket(pAd, pPacket); + else + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + } + + // Dequeue outgoing frames from TxSwQueue[] and process it + RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS); + +} + + +/* +======================================================================== +Routine Description: + This routine is used to do packet parsing and classification for Tx packet + to STA device, and it will en-queue packets to our TxSwQueue depends on AC + class. + +Arguments: + pAd Pointer to our adapter + pPacket Pointer to send packet + +Return Value: + NDIS_STATUS_SUCCESS If succes to queue the packet into TxSwQueue. + NDIS_STATUS_FAILURE If failed to do en-queue. + +Note: + You only can put OS-indepened & STA related code in here. +======================================================================== +*/ +NDIS_STATUS STASendPacket( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket) +{ + PACKET_INFO PacketInfo; + PUCHAR pSrcBufVA; + UINT SrcBufLen; + UINT AllowFragSize; + UCHAR NumberOfFrag; + UCHAR RTSRequired; + UCHAR QueIdx, UserPriority; + MAC_TABLE_ENTRY *pEntry = NULL; + unsigned int IrqFlags; + UCHAR Rate; + + // Prepare packet information structure for buffer descriptor + // chained within a single NDIS packet. + RTMP_QueryPacketInfo(pPacket, &PacketInfo, &pSrcBufVA, &SrcBufLen); + + if (pSrcBufVA == NULL) + { + DBGPRINT(RT_DEBUG_ERROR,("STASendPacket --> pSrcBufVA == NULL !!!SrcBufLen=%x\n",SrcBufLen)); + // Resourece is low, system did not allocate virtual address + // return NDIS_STATUS_FAILURE directly to upper layer + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + return NDIS_STATUS_FAILURE; + } + + + if (SrcBufLen < 14) + { + DBGPRINT(RT_DEBUG_ERROR,("STASendPacket --> Ndis Packet buffer error !!!\n")); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + return (NDIS_STATUS_FAILURE); + } + + + // In HT rate adhoc mode, A-MPDU is often used. So need to lookup BA Table and MAC Entry. + // Note multicast packets in adhoc also use BSSID_WCID index. + { + if(INFRA_ON(pAd)) + { +#if defined(QOS_DLS_SUPPORT) || defined(DOT11Z_TDLS_SUPPORT) + USHORT tmpWcid; + + tmpWcid = RTMP_GET_PACKET_WCID(pPacket); + + if (VALID_WCID(tmpWcid) && + (IS_ENTRY_DLS(&pAd->MacTab.Content[tmpWcid]) || + IS_ENTRY_TDLS(&pAd->MacTab.Content[tmpWcid]))) + { + pEntry = &pAd->MacTab.Content[tmpWcid]; + Rate = pAd->MacTab.Content[tmpWcid].CurrTxRate; + } + else +#endif + { + pEntry = &pAd->MacTab.Content[BSSID_WCID]; + RTMP_SET_PACKET_WCID(pPacket, BSSID_WCID); + Rate = pAd->CommonCfg.TxRate; + } + } + else if (ADHOC_ON(pAd)) + { + if (*pSrcBufVA & 0x01) + { + RTMP_SET_PACKET_WCID(pPacket, MCAST_WCID); + pEntry = &pAd->MacTab.Content[MCAST_WCID]; + } + else + { +#ifdef XLINK_SUPPORT + if (pAd->StaCfg.PSPXlink) + { + pEntry = &pAd->MacTab.Content[MCAST_WCID]; + pEntry->Aid = MCAST_WCID; + } + else +#endif // XLINK_SUPPORT // + pEntry = MacTableLookup(pAd, pSrcBufVA); + + if (pEntry) + RTMP_SET_PACKET_WCID(pPacket, pEntry->Aid); + } + Rate = pAd->CommonCfg.TxRate; + } + } + + if (!pEntry) + { + DBGPRINT(RT_DEBUG_ERROR,("STASendPacket->Cannot find pEntry(%2x:%2x:%2x:%2x:%2x:%2x) in MacTab!\n", PRINT_MAC(pSrcBufVA))); + // Resourece is low, system did not allocate virtual address + // return NDIS_STATUS_FAILURE directly to upper layer + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + return NDIS_STATUS_FAILURE; + } + + if (ADHOC_ON(pAd) + ) + { + RTMP_SET_PACKET_WCID(pPacket, (UCHAR)pEntry->Aid); + } + + // + // Check the Ethernet Frame type of this packet, and set the RTMP_SET_PACKET_SPECIFIC flags. + // Here we set the PACKET_SPECIFIC flags(LLC, VLAN, DHCP/ARP, EAPOL). + UserPriority = 0; + QueIdx = QID_AC_BE; + RTMPCheckEtherType(pAd, pPacket, pEntry, &UserPriority, &QueIdx); + + + + // + // WPA 802.1x secured port control - drop all non-802.1x frame before port secured + // + if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) +#ifdef WPA_SUPPLICANT_SUPPORT + || (pAd->StaCfg.IEEE8021X == TRUE) +#endif // WPA_SUPPLICANT_SUPPORT // + ) + && ((pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED) || (pAd->StaCfg.MicErrCnt >= 2)) + && (RTMP_GET_PACKET_EAPOL(pPacket)== FALSE) + ) + { + DBGPRINT(RT_DEBUG_TRACE,("STASendPacket --> Drop packet before port secured !!!\n")); + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + + return (NDIS_STATUS_FAILURE); + } + + + // STEP 1. Decide number of fragments required to deliver this MSDU. + // The estimation here is not very accurate because difficult to + // take encryption overhead into consideration here. The result + // "NumberOfFrag" is then just used to pre-check if enough free + // TXD are available to hold this MSDU. + + + if (*pSrcBufVA & 0x01) // fragmentation not allowed on multicast & broadcast + NumberOfFrag = 1; + else if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)) + NumberOfFrag = 1; // Aggregation overwhelms fragmentation + else if (CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_AMSDU_INUSED)) + NumberOfFrag = 1; // Aggregation overwhelms fragmentation +#ifdef DOT11_N_SUPPORT + else if ((pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTMIX) || (pAd->StaCfg.HTPhyMode.field.MODE == MODE_HTGREENFIELD)) + NumberOfFrag = 1; // MIMO RATE overwhelms fragmentation +#endif // DOT11_N_SUPPORT // + else + { + // The calculated "NumberOfFrag" is a rough estimation because of various + // encryption/encapsulation overhead not taken into consideration. This number is just + // used to make sure enough free TXD are available before fragmentation takes place. + // In case the actual required number of fragments of an NDIS packet + // excceeds "NumberOfFrag"caculated here and not enough free TXD available, the + // last fragment (i.e. last MPDU) will be dropped in RTMPHardTransmit() due to out of + // resource, and the NDIS packet will be indicated NDIS_STATUS_FAILURE. This should + // rarely happen and the penalty is just like a TX RETRY fail. Affordable. + + AllowFragSize = (pAd->CommonCfg.FragmentThreshold) - LENGTH_802_11 - LENGTH_CRC; + NumberOfFrag = ((PacketInfo.TotalPacketLength - LENGTH_802_3 + LENGTH_802_1_H) / AllowFragSize) + 1; + // To get accurate number of fragmentation, Minus 1 if the size just match to allowable fragment size + if (((PacketInfo.TotalPacketLength - LENGTH_802_3 + LENGTH_802_1_H) % AllowFragSize) == 0) + { + NumberOfFrag--; + } + } + + // Save fragment number to Ndis packet reserved field + RTMP_SET_PACKET_FRAGMENTS(pPacket, NumberOfFrag); + + + // STEP 2. Check the requirement of RTS: + // If multiple fragment required, RTS is required only for the first fragment + // if the fragment size large than RTS threshold + // For RT28xx, Let ASIC send RTS/CTS +// RTMP_SET_PACKET_RTS(pPacket, 0); + if (NumberOfFrag > 1) + RTSRequired = (pAd->CommonCfg.FragmentThreshold > pAd->CommonCfg.RtsThreshold) ? 1 : 0; + else + RTSRequired = (PacketInfo.TotalPacketLength > pAd->CommonCfg.RtsThreshold) ? 1 : 0; + + // Save RTS requirement to Ndis packet reserved field + RTMP_SET_PACKET_RTS(pPacket, RTSRequired); + RTMP_SET_PACKET_TXRATE(pPacket, pAd->CommonCfg.TxRate); + + + RTMP_SET_PACKET_UP(pPacket, UserPriority); + + + // Make sure SendTxWait queue resource won't be used by other threads + RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); + if (pAd->TxSwQueue[QueIdx].Number >= MAX_PACKETS_IN_QUEUE) + { + RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); +#ifdef BLOCK_NET_IF + StopNetIfQueue(pAd, QueIdx, pPacket); +#endif // BLOCK_NET_IF // + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + + return NDIS_STATUS_FAILURE; + } + else + { + InsertTailQueueAc(pAd, pEntry, &pAd->TxSwQueue[QueIdx], PACKET_TO_QUEUE_ENTRY(pPacket)); + } + RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); + +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE)&& + (pEntry->NoBADataCountDown == 0) && + IS_HT_STA(pEntry)) + { + //PMAC_TABLE_ENTRY pMacEntry = &pAd->MacTab.Content[BSSID_WCID]; + if (((pEntry->TXBAbitmap & (1<<UserPriority)) == 0) && + ((pEntry->BADeclineBitmap & (1<<UserPriority)) == 0) && + (pEntry->PortSecured == WPA_802_1X_PORT_SECURED) + // For IOT compatibility, if + // 1. It is Ralink chip or + // 2. It is OPEN or AES mode, + // then BA session can be bulit. + && ((IS_ENTRY_CLIENT(pEntry) && pAd->MlmeAux.APRalinkIe != 0x0) || + (pEntry->WepStatus != Ndis802_11WEPEnabled && pEntry->WepStatus != Ndis802_11Encryption2Enabled)) + && (!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))) + ) + { + BAOriSessionSetUp(pAd, pEntry, UserPriority, 0, 10, FALSE); + } + } +#endif // DOT11_N_SUPPORT // + + pAd->RalinkCounters.OneSecOsTxCount[QueIdx]++; // TODO: for debug only. to be removed + return NDIS_STATUS_SUCCESS; +} + + +/* + ======================================================================== + + Routine Description: + This subroutine will scan through releative ring descriptor to find + out avaliable free ring descriptor and compare with request size. + + Arguments: + pAd Pointer to our adapter + QueIdx Selected TX Ring + + Return Value: + NDIS_STATUS_FAILURE Not enough free descriptor + NDIS_STATUS_SUCCESS Enough free descriptor + + IRQL = PASSIVE_LEVEL + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +#ifdef RTMP_MAC_PCI +NDIS_STATUS RTMPFreeTXDRequest( + IN PRTMP_ADAPTER pAd, + IN UCHAR QueIdx, + IN UCHAR NumberRequired, + IN PUCHAR FreeNumberIs) +{ + ULONG FreeNumber = 0; + NDIS_STATUS Status = NDIS_STATUS_FAILURE; + + switch (QueIdx) + { + case QID_AC_BK: + case QID_AC_BE: + case QID_AC_VI: + case QID_AC_VO: + case QID_HCCA: + if (pAd->TxRing[QueIdx].TxSwFreeIdx > pAd->TxRing[QueIdx].TxCpuIdx) + FreeNumber = pAd->TxRing[QueIdx].TxSwFreeIdx - pAd->TxRing[QueIdx].TxCpuIdx - 1; + else + FreeNumber = pAd->TxRing[QueIdx].TxSwFreeIdx + TX_RING_SIZE - pAd->TxRing[QueIdx].TxCpuIdx - 1; + + if (FreeNumber >= NumberRequired) + Status = NDIS_STATUS_SUCCESS; + break; + + case QID_MGMT: + if (pAd->MgmtRing.TxSwFreeIdx > pAd->MgmtRing.TxCpuIdx) + FreeNumber = pAd->MgmtRing.TxSwFreeIdx - pAd->MgmtRing.TxCpuIdx - 1; + else + FreeNumber = pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - pAd->MgmtRing.TxCpuIdx - 1; + + if (FreeNumber >= NumberRequired) + Status = NDIS_STATUS_SUCCESS; + break; + + default: + DBGPRINT(RT_DEBUG_ERROR,("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx)); + break; + } + *FreeNumberIs = (UCHAR)FreeNumber; + + return (Status); +} +#endif // RTMP_MAC_PCI // + + + +VOID RTMPSendDisassociationFrame( + IN PRTMP_ADAPTER pAd) +{ +} + +VOID RTMPSendNullFrame( + IN PRTMP_ADAPTER pAd, + IN UCHAR TxRate, + IN BOOLEAN bQosNull) +{ + UCHAR NullFrame[48]; + ULONG Length; + PHEADER_802_11 pHeader_802_11; + + +#ifdef RALINK_ATE + if(ATE_ON(pAd)) + { + return; + } +#endif // RALINK_ATE // + + // WPA 802.1x secured port control + if (((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPAPSK) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) || + (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) +#ifdef WPA_SUPPLICANT_SUPPORT + || (pAd->StaCfg.IEEE8021X == TRUE) +#endif + ) && + (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) + { + return; + } + + NdisZeroMemory(NullFrame, 48); + Length = sizeof(HEADER_802_11); + + pHeader_802_11 = (PHEADER_802_11) NullFrame; + + pHeader_802_11->FC.Type = BTYPE_DATA; + pHeader_802_11->FC.SubType = SUBTYPE_NULL_FUNC; + pHeader_802_11->FC.ToDs = 1; + COPY_MAC_ADDR(pHeader_802_11->Addr1, pAd->CommonCfg.Bssid); + COPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress); + COPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid); + + if (pAd->CommonCfg.bAPSDForcePowerSave) + { + pHeader_802_11->FC.PwrMgmt = PWR_SAVE; + } + else + { + pHeader_802_11->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE) ? 1: 0; + } + pHeader_802_11->Duration = pAd->CommonCfg.Dsifs + RTMPCalcDuration(pAd, TxRate, 14); + + // sequence is increased in MlmeHardTx + pHeader_802_11->Sequence = pAd->Sequence; + pAd->Sequence = (pAd->Sequence+1) & MAXSEQ; // next sequence + + // Prepare QosNull function frame + if (bQosNull) + { + pHeader_802_11->FC.SubType = SUBTYPE_QOS_NULL; + + // copy QOS control bytes + NullFrame[Length] = 0; + NullFrame[Length+1] = 0; + Length += 2;// if pad with 2 bytes for alignment, APSD will fail + } + + HAL_KickOutNullFrameTx(pAd, 0, NullFrame, Length); + +} + +// IRQL = DISPATCH_LEVEL +VOID RTMPSendRTSFrame( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pDA, + IN unsigned int NextMpduSize, + IN UCHAR TxRate, + IN UCHAR RTSRate, + IN USHORT AckDuration, + IN UCHAR QueIdx, + IN UCHAR FrameGap) +{ +} + + + +// -------------------------------------------------------- +// FIND ENCRYPT KEY AND DECIDE CIPHER ALGORITHM +// Find the WPA key, either Group or Pairwise Key +// LEAP + TKIP also use WPA key. +// -------------------------------------------------------- +// Decide WEP bit and cipher suite to be used. Same cipher suite should be used for whole fragment burst +// In Cisco CCX 2.0 Leap Authentication +// WepStatus is Ndis802_11Encryption1Enabled but the key will use PairwiseKey +// Instead of the SharedKey, SharedKey Length may be Zero. +VOID STAFindCipherAlgorithm( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk) +{ + NDIS_802_11_ENCRYPTION_STATUS Cipher; // To indicate cipher used for this packet + UCHAR CipherAlg = CIPHER_NONE; // cipher alogrithm + UCHAR KeyIdx = 0xff; + PUCHAR pSrcBufVA; + PCIPHER_KEY pKey = NULL; + PMAC_TABLE_ENTRY pMacEntry; + + pSrcBufVA = GET_OS_PKT_DATAPTR(pTxBlk->pPacket); + pMacEntry = pTxBlk->pMacEntry; + + { + // Select Cipher + if ((*pSrcBufVA & 0x01) && (ADHOC_ON(pAd))) + Cipher = pAd->StaCfg.GroupCipher; // Cipher for Multicast or Broadcast + else + Cipher = pAd->StaCfg.PairCipher; // Cipher for Unicast + + if (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket)) + { + ASSERT(pAd->SharedKey[BSS0][0].CipherAlg <= CIPHER_CKIP128); + + // 4-way handshaking frame must be clear + if (!(TX_BLK_TEST_FLAG(pTxBlk, fTX_bClearEAPFrame)) && + (pAd->SharedKey[BSS0][0].CipherAlg) && + (pAd->SharedKey[BSS0][0].KeyLen)) + { + CipherAlg = pAd->SharedKey[BSS0][0].CipherAlg; + KeyIdx = 0; + } + } + else if (Cipher == Ndis802_11Encryption1Enabled) + { + KeyIdx = pAd->StaCfg.DefaultKeyId; + } + else if ((Cipher == Ndis802_11Encryption2Enabled) || + (Cipher == Ndis802_11Encryption3Enabled)) + { + if ((*pSrcBufVA & 0x01) && (ADHOC_ON(pAd))) // multicast + KeyIdx = pAd->StaCfg.DefaultKeyId; + else if (pAd->SharedKey[BSS0][0].KeyLen) + KeyIdx = 0; + else + KeyIdx = pAd->StaCfg.DefaultKeyId; + } + + if (KeyIdx == 0xff) + CipherAlg = CIPHER_NONE; + else if ((Cipher == Ndis802_11EncryptionDisabled) || (pAd->SharedKey[BSS0][KeyIdx].KeyLen == 0)) + CipherAlg = CIPHER_NONE; +#ifdef WPA_SUPPLICANT_SUPPORT + else if ( pAd->StaCfg.WpaSupplicantUP && + (Cipher == Ndis802_11Encryption1Enabled) && + (pAd->StaCfg.IEEE8021X == TRUE) && + (pAd->StaCfg.PortSecured == WPA_802_1X_PORT_NOT_SECURED)) + CipherAlg = CIPHER_NONE; +#endif // WPA_SUPPLICANT_SUPPORT // + else + { + //Header_802_11.FC.Wep = 1; + CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg; + pKey = &pAd->SharedKey[BSS0][KeyIdx]; + } + } + + pTxBlk->CipherAlg = CipherAlg; + pTxBlk->pKey = pKey; + pTxBlk->KeyIdx = KeyIdx; +} + + +VOID STABuildCommon802_11Header( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk) +{ + + HEADER_802_11 *pHeader_802_11; +#ifdef QOS_DLS_SUPPORT + BOOLEAN bDLSFrame = FALSE; + INT DlsEntryIndex = 0; +#endif // QOS_DLS_SUPPORT // + + // + // MAKE A COMMON 802.11 HEADER + // + + // normal wlan header size : 24 octets + pTxBlk->MpduHeaderLen = sizeof(HEADER_802_11); + + pHeader_802_11 = (HEADER_802_11 *) &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; + + NdisZeroMemory(pHeader_802_11, sizeof(HEADER_802_11)); + + pHeader_802_11->FC.FrDs = 0; + pHeader_802_11->FC.Type = BTYPE_DATA; + pHeader_802_11->FC.SubType = ((TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) ? SUBTYPE_QDATA : SUBTYPE_DATA); + +#ifdef QOS_DLS_SUPPORT + if (INFRA_ON(pAd)) + { + // Check if the frame can be sent through DLS direct link interface + // If packet can be sent through DLS, then force aggregation disable. (Hard to determine peer STA's capability) + DlsEntryIndex = RTMPCheckDLSFrame(pAd, pTxBlk->pSrcBufHeader); + if (DlsEntryIndex >= 0) + bDLSFrame = TRUE; + else + bDLSFrame = FALSE; + } +#endif // QOS_DLS_SUPPORT // + + if (pTxBlk->pMacEntry) + { + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bForceNonQoS)) + { + pHeader_802_11->Sequence = pTxBlk->pMacEntry->NonQosDataSeq; + pTxBlk->pMacEntry->NonQosDataSeq = (pTxBlk->pMacEntry->NonQosDataSeq+1) & MAXSEQ; + } + else + { + pHeader_802_11->Sequence = pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority]; + pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority] = (pTxBlk->pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ; + } + } + else + { + pHeader_802_11->Sequence = pAd->Sequence; + pAd->Sequence = (pAd->Sequence+1) & MAXSEQ; // next sequence + } + + pHeader_802_11->Frag = 0; + + pHeader_802_11->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData); + + { + if (INFRA_ON(pAd)) + { +#ifdef QOS_DLS_SUPPORT + if (bDLSFrame) + { + COPY_MAC_ADDR(pHeader_802_11->Addr1, pTxBlk->pSrcBufHeader); + COPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress); + COPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid); + pHeader_802_11->FC.ToDs = 0; + } + else +#endif // QOS_DLS_SUPPORT // + { + COPY_MAC_ADDR(pHeader_802_11->Addr1, pAd->CommonCfg.Bssid); + COPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress); + COPY_MAC_ADDR(pHeader_802_11->Addr3, pTxBlk->pSrcBufHeader); + pHeader_802_11->FC.ToDs = 1; +#ifdef CLIENT_WDS + if (!MAC_ADDR_EQUAL((pTxBlk->pSrcBufHeader + MAC_ADDR_LEN), + pAd->CurrentAddress)) + { + pHeader_802_11->FC.FrDs = 1; + COPY_MAC_ADDR(&pHeader_802_11->Octet[0], pTxBlk->pSrcBufHeader + MAC_ADDR_LEN); // ADDR4 = SA + pTxBlk->MpduHeaderLen += MAC_ADDR_LEN; + } +#endif // CLIENT_WDS // + } + } + else if (ADHOC_ON(pAd)) + { + COPY_MAC_ADDR(pHeader_802_11->Addr1, pTxBlk->pSrcBufHeader); +#ifdef XLINK_SUPPORT + if (pAd->StaCfg.PSPXlink) + /* copy the SA of ether frames to address 2 of 802.11 frame */ + COPY_MAC_ADDR(pHeader_802_11->Addr2, pTxBlk->pSrcBufHeader + MAC_ADDR_LEN); + else +#endif // XLINK_SUPPORT // + COPY_MAC_ADDR(pHeader_802_11->Addr2, pAd->CurrentAddress); + COPY_MAC_ADDR(pHeader_802_11->Addr3, pAd->CommonCfg.Bssid); + pHeader_802_11->FC.ToDs = 0; + } + } + + if (pTxBlk->CipherAlg != CIPHER_NONE) + pHeader_802_11->FC.Wep = 1; + + // ----------------------------------------------------------------- + // STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later. + // ----------------------------------------------------------------- + if (pAd->CommonCfg.bAPSDForcePowerSave) + pHeader_802_11->FC.PwrMgmt = PWR_SAVE; + else + pHeader_802_11->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE); +} + +#ifdef DOT11_N_SUPPORT +VOID STABuildCache802_11Header( + IN RTMP_ADAPTER *pAd, + IN TX_BLK *pTxBlk, + IN UCHAR *pHeader) +{ + MAC_TABLE_ENTRY *pMacEntry; + PHEADER_802_11 pHeader80211; + + pHeader80211 = (PHEADER_802_11)pHeader; + pMacEntry = pTxBlk->pMacEntry; + + // + // Update the cached 802.11 HEADER + // + + // normal wlan header size : 24 octets + pTxBlk->MpduHeaderLen = sizeof(HEADER_802_11); + + // More Bit + pHeader80211->FC.MoreData = TX_BLK_TEST_FLAG(pTxBlk, fTX_bMoreData); + + // Sequence + pHeader80211->Sequence = pMacEntry->TxSeq[pTxBlk->UserPriority]; + pMacEntry->TxSeq[pTxBlk->UserPriority] = (pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ; + + { + // Check if the frame can be sent through DLS direct link interface + // If packet can be sent through DLS, then force aggregation disable. (Hard to determine peer STA's capability) +#ifdef QOS_DLS_SUPPORT + BOOLEAN bDLSFrame = FALSE; + INT DlsEntryIndex = 0; + + DlsEntryIndex = RTMPCheckDLSFrame(pAd, pTxBlk->pSrcBufHeader); + if (DlsEntryIndex >= 0) + bDLSFrame = TRUE; + else + bDLSFrame = FALSE; +#endif // QOS_DLS_SUPPORT // + + // The addr3 of normal packet send from DS is Dest Mac address. +#ifdef QOS_DLS_SUPPORT + if (bDLSFrame) + { + COPY_MAC_ADDR(pHeader80211->Addr1, pTxBlk->pSrcBufHeader); + COPY_MAC_ADDR(pHeader80211->Addr3, pAd->CommonCfg.Bssid); + pHeader80211->FC.ToDs = 0; + } + else +#endif // QOS_DLS_SUPPORT // + if (ADHOC_ON(pAd)) + COPY_MAC_ADDR(pHeader80211->Addr3, pAd->CommonCfg.Bssid); + else + { + COPY_MAC_ADDR(pHeader80211->Addr3, pTxBlk->pSrcBufHeader); +#ifdef CLIENT_WDS + if (!MAC_ADDR_EQUAL((pTxBlk->pSrcBufHeader + MAC_ADDR_LEN), + pAd->CurrentAddress)) + { + pHeader80211->FC.FrDs = 1; + COPY_MAC_ADDR(&pHeader80211->Octet[0], pTxBlk->pSrcBufHeader + MAC_ADDR_LEN); // ADDR4 = SA + pTxBlk->MpduHeaderLen += MAC_ADDR_LEN; + } +#endif // CLIENT_WDS // + } + } + + // ----------------------------------------------------------------- + // STEP 2. MAKE A COMMON 802.11 HEADER SHARED BY ENTIRE FRAGMENT BURST. Fill sequence later. + // ----------------------------------------------------------------- + if (pAd->CommonCfg.bAPSDForcePowerSave) + pHeader80211->FC.PwrMgmt = PWR_SAVE; + else + pHeader80211->FC.PwrMgmt = (pAd->StaCfg.Psm == PWR_SAVE); +} +#endif // DOT11_N_SUPPORT // + +static inline PUCHAR STA_Build_ARalink_Frame_Header( + IN RTMP_ADAPTER *pAd, + IN TX_BLK *pTxBlk) +{ + PUCHAR pHeaderBufPtr; + HEADER_802_11 *pHeader_802_11; + PNDIS_PACKET pNextPacket; + UINT32 nextBufLen; + PQUEUE_ENTRY pQEntry; + + STAFindCipherAlgorithm(pAd, pTxBlk); + STABuildCommon802_11Header(pAd, pTxBlk); + + + pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; + pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr; + + // steal "order" bit to mark "aggregation" + pHeader_802_11->FC.Order = 1; + + // skip common header + pHeaderBufPtr += pTxBlk->MpduHeaderLen; + + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) + { + // + // build QOS Control bytes + // + *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); + + *(pHeaderBufPtr+1) = 0; + pHeaderBufPtr +=2; + pTxBlk->MpduHeaderLen += 2; + } + + // padding at front of LLC header. LLC header should at 4-bytes aligment. + pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; + pHeaderBufPtr = (PUCHAR)ROUND_UP(pHeaderBufPtr, 4); + pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); + + // For RA Aggregation, + // put the 2nd MSDU length(extra 2-byte field) after QOS_CONTROL in little endian format + pQEntry = pTxBlk->TxPacketList.Head; + pNextPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); + nextBufLen = GET_OS_PKT_LEN(pNextPacket); + if (RTMP_GET_PACKET_VLAN(pNextPacket)) + nextBufLen -= LENGTH_802_1Q; + + *pHeaderBufPtr = (UCHAR)nextBufLen & 0xff; + *(pHeaderBufPtr+1) = (UCHAR)(nextBufLen >> 8); + + pHeaderBufPtr += 2; + pTxBlk->MpduHeaderLen += 2; + + return pHeaderBufPtr; + +} + +#ifdef DOT11_N_SUPPORT +static inline PUCHAR STA_Build_AMSDU_Frame_Header( + IN RTMP_ADAPTER *pAd, + IN TX_BLK *pTxBlk) +{ + PUCHAR pHeaderBufPtr;//, pSaveBufPtr; + HEADER_802_11 *pHeader_802_11; + + + STAFindCipherAlgorithm(pAd, pTxBlk); + STABuildCommon802_11Header(pAd, pTxBlk); + + pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; + pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr; + + // skip common header + pHeaderBufPtr += pTxBlk->MpduHeaderLen; + + // + // build QOS Control bytes + // + *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx]<<5); + + // + // A-MSDU packet + // + *pHeaderBufPtr |= 0x80; + + *(pHeaderBufPtr+1) = 0; + pHeaderBufPtr +=2; + pTxBlk->MpduHeaderLen += 2; + + //pSaveBufPtr = pHeaderBufPtr; + + // + // padding at front of LLC header + // LLC header should locate at 4-octets aligment + // + // @@@ MpduHeaderLen excluding padding @@@ + // + pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; + pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4); + pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); + + return pHeaderBufPtr; + +} + + +VOID STA_AMPDU_Frame_Tx( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk) +{ + HEADER_802_11 *pHeader_802_11; + PUCHAR pHeaderBufPtr; + USHORT FreeNumber; + MAC_TABLE_ENTRY *pMacEntry; + BOOLEAN bVLANPkt; + PQUEUE_ENTRY pQEntry; + + ASSERT(pTxBlk); + + while(pTxBlk->TxPacketList.Head) + { + pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); + pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); + if ( RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) + { + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + continue; + } + + bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); + + pMacEntry = pTxBlk->pMacEntry; + if (pMacEntry->isCached) + { + // NOTE: Please make sure the size of pMacEntry->CachedBuf[] is smaller than pTxBlk->HeaderBuf[]!!!! +#ifndef VENDOR_FEATURE1_SUPPORT + NdisMoveMemory((PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (PUCHAR)(&pMacEntry->CachedBuf[0]), TXWI_SIZE + sizeof(HEADER_802_11)); +#else + pTxBlk->HeaderBuf = pMacEntry->HeaderBuf; +#endif // VENDOR_FEATURE1_SUPPORT // + + pHeaderBufPtr = (PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]); + STABuildCache802_11Header(pAd, pTxBlk, pHeaderBufPtr); + +#ifdef SOFT_ENCRYPT + RTMPUpdateSwCacheCipherInfo(pAd, pTxBlk, pHeaderBufPtr); +#endif // SOFT_ENCRYPT // + } + else + { + STAFindCipherAlgorithm(pAd, pTxBlk); + STABuildCommon802_11Header(pAd, pTxBlk); + + pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; + } + +#ifdef SOFT_ENCRYPT + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + /* Check if the original data has enough buffer + to insert or append WPI related field. */ + if (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE) + { + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + continue; + } + } +#endif // SOFT_ENCRYPT // + + +#ifdef VENDOR_FEATURE1_SUPPORT + if(pMacEntry->isCached + && (pMacEntry->Protocol == RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket)) +#ifdef SOFT_ENCRYPT + && !TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt) +#endif // SOFT_ENCRYPT // + ) + { + pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr; + + // skip common header + pHeaderBufPtr += pTxBlk->MpduHeaderLen; + + // + // build QOS Control bytes + // + *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); + pTxBlk->MpduHeaderLen = pMacEntry->MpduHeaderLen; + pHeaderBufPtr = ((PUCHAR)pHeader_802_11) + pTxBlk->MpduHeaderLen; + + pTxBlk->HdrPadLen = pMacEntry->HdrPadLen; + + // skip 802.3 header + pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; + pTxBlk->SrcBufLen -= LENGTH_802_3; + + // skip vlan tag + if (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket)) + { + pTxBlk->pSrcBufData += LENGTH_802_1Q; + pTxBlk->SrcBufLen -= LENGTH_802_1Q; + } + } + else +#endif // VENDOR_FEATURE1_SUPPORT // + { + pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr; + + // skip common header + pHeaderBufPtr += pTxBlk->MpduHeaderLen; + + // + // build QOS Control bytes + // + *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); + *(pHeaderBufPtr+1) = 0; + pHeaderBufPtr +=2; + pTxBlk->MpduHeaderLen += 2; + + // + // build HTC+ + // HTC control filed following QoS field + // + if ((pAd->CommonCfg.bRdg == TRUE) && CLIENT_STATUS_TEST_FLAG(pTxBlk->pMacEntry, fCLIENT_STATUS_RDG_CAPABLE)) + { + if (pMacEntry->isCached == FALSE) + { + // mark HTC bit + pHeader_802_11->FC.Order = 1; + + NdisZeroMemory(pHeaderBufPtr, 4); + *(pHeaderBufPtr+3) |= 0x80; + } + pHeaderBufPtr += 4; + pTxBlk->MpduHeaderLen += 4; + } + + //pTxBlk->MpduHeaderLen = pHeaderBufPtr - pTxBlk->HeaderBuf - TXWI_SIZE - TXINFO_SIZE; + ASSERT(pTxBlk->MpduHeaderLen >= 24); + + // skip 802.3 header + pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; + pTxBlk->SrcBufLen -= LENGTH_802_3; + + // skip vlan tag + if (bVLANPkt) + { + pTxBlk->pSrcBufData += LENGTH_802_1Q; + pTxBlk->SrcBufLen -= LENGTH_802_1Q; + } + + // + // padding at front of LLC header + // LLC header should locate at 4-octets aligment + // + // @@@ MpduHeaderLen excluding padding @@@ + // + pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; + pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4); + pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); + +#ifdef VENDOR_FEATURE1_SUPPORT + pMacEntry->HdrPadLen = pTxBlk->HdrPadLen; +#endif // VENDOR_FEATURE1_SUPPORT // + +#ifdef SOFT_ENCRYPT + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + UCHAR iv_offset = 0, ext_offset = 0; + + // if original Ethernet frame contains no LLC/SNAP, + // then an extra LLC/SNAP encap is required + EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap); + + // Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer + if (pTxBlk->pExtraLlcSnapEncap) + { + // Reserve the front 8 bytes of data for LLC header + pTxBlk->pSrcBufData -= LENGTH_802_1_H; + pTxBlk->SrcBufLen += LENGTH_802_1_H; + + NdisMoveMemory(pTxBlk->pSrcBufData, pTxBlk->pExtraLlcSnapEncap, 6); + } + + /* Construct and insert specific IV header to MPDU header */ + RTMPSoftConstructIVHdr(pTxBlk->CipherAlg, + pTxBlk->KeyIdx, + pTxBlk->pKey->TxTsc, + pHeaderBufPtr, + &iv_offset); + pHeaderBufPtr += iv_offset; + pTxBlk->MpduHeaderLen += iv_offset; + + /* Encrypt the MPDU data by software */ + RTMPSoftEncryptionAction(pAd, + pTxBlk->CipherAlg, + (PUCHAR)pHeader_802_11, + pTxBlk->pSrcBufData, + pTxBlk->SrcBufLen, + pTxBlk->KeyIdx, + pTxBlk->pKey, + &ext_offset); + pTxBlk->SrcBufLen += ext_offset; + pTxBlk->TotalFrameLen += ext_offset; + + } + else +#endif // SOFT_ENCRYPT // + { + + // + // Insert LLC-SNAP encapsulation - 8 octets + // + EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap); + if (pTxBlk->pExtraLlcSnapEncap) + { + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); + pHeaderBufPtr += 6; + // get 2 octets (TypeofLen) + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2); + pHeaderBufPtr += 2; + pTxBlk->MpduHeaderLen += LENGTH_802_1_H; + } + + } + +#ifdef VENDOR_FEATURE1_SUPPORT + pMacEntry->Protocol = RTMP_GET_PACKET_PROTOCOL(pTxBlk->pPacket); + pMacEntry->MpduHeaderLen = pTxBlk->MpduHeaderLen; +#endif // VENDOR_FEATURE1_SUPPORT // + } + + if (pMacEntry->isCached) + { + RTMPWriteTxWI_Cache(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); + } + else + { + RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); + + NdisZeroMemory((PUCHAR)(&pMacEntry->CachedBuf[0]), sizeof(pMacEntry->CachedBuf)); + NdisMoveMemory((PUCHAR)(&pMacEntry->CachedBuf[0]), (PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), (pHeaderBufPtr - (PUCHAR)(&pTxBlk->HeaderBuf[TXINFO_SIZE]))); + +#ifdef VENDOR_FEATURE1_SUPPORT + /* use space to get performance enhancement */ + NdisZeroMemory((PUCHAR)(&pMacEntry->HeaderBuf[0]), sizeof(pMacEntry->HeaderBuf)); + NdisMoveMemory((PUCHAR)(&pMacEntry->HeaderBuf[0]), (PUCHAR)(&pTxBlk->HeaderBuf[0]), (pHeaderBufPtr - (PUCHAR)(&pTxBlk->HeaderBuf[0]))); +#endif // VENDOR_FEATURE1_SUPPORT // + + pMacEntry->isCached = TRUE; + } + +#ifdef STATS_COUNT_SUPPORT + // calculate Transmitted AMPDU count and ByteCount + { + pAd->RalinkCounters.TransmittedMPDUsInAMPDUCount.u.LowPart ++; + pAd->RalinkCounters.TransmittedOctetsInAMPDUCount.QuadPart += pTxBlk->SrcBufLen; + } +#endif // STATS_COUNT_SUPPORT // + + //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); + + HAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber); + + // + // Kick out Tx + // +#ifdef PCIE_PS_SUPPORT + if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) +#endif // PCIE_PS_SUPPORT // + HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); + + pAd->RalinkCounters.KickTxCount++; + pAd->RalinkCounters.OneSecTxDoneCount++; + } + +} + + +VOID STA_AMSDU_Frame_Tx( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk) +{ + PUCHAR pHeaderBufPtr; + USHORT FreeNumber; + USHORT subFramePayloadLen = 0; // AMSDU Subframe length without AMSDU-Header / Padding. + USHORT totalMPDUSize=0; + UCHAR *subFrameHeader; + UCHAR padding = 0; + USHORT FirstTx = 0, LastTxIdx = 0; + BOOLEAN bVLANPkt; + int frameNum = 0; + PQUEUE_ENTRY pQEntry; + + + ASSERT(pTxBlk); + + ASSERT((pTxBlk->TxPacketList.Number > 1)); + + while(pTxBlk->TxPacketList.Head) + { + pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); + pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); + if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) + { + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + continue; + } + + bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); + + // skip 802.3 header + pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; + pTxBlk->SrcBufLen -= LENGTH_802_3; + + // skip vlan tag + if (bVLANPkt) + { + pTxBlk->pSrcBufData += LENGTH_802_1Q; + pTxBlk->SrcBufLen -= LENGTH_802_1Q; + } + + if (frameNum == 0) + { + pHeaderBufPtr = STA_Build_AMSDU_Frame_Header(pAd, pTxBlk); + + // NOTE: TxWI->MPDUtotalByteCount will be updated after final frame was handled. + RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); + } + else + { + pHeaderBufPtr = &pTxBlk->HeaderBuf[0]; + padding = ROUND_UP(LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen, 4) - (LENGTH_AMSDU_SUBFRAMEHEAD + subFramePayloadLen); + NdisZeroMemory(pHeaderBufPtr, padding + LENGTH_AMSDU_SUBFRAMEHEAD); + pHeaderBufPtr += padding; + pTxBlk->MpduHeaderLen = padding; + } + + // + // A-MSDU subframe + // DA(6)+SA(6)+Length(2) + LLC/SNAP Encap + // + subFrameHeader = pHeaderBufPtr; + subFramePayloadLen = pTxBlk->SrcBufLen; + + NdisMoveMemory(subFrameHeader, pTxBlk->pSrcBufHeader, 12); + + + pHeaderBufPtr += LENGTH_AMSDU_SUBFRAMEHEAD; + pTxBlk->MpduHeaderLen += LENGTH_AMSDU_SUBFRAMEHEAD; + + + // + // Insert LLC-SNAP encapsulation - 8 octets + // + EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap); + + subFramePayloadLen = pTxBlk->SrcBufLen; + + if (pTxBlk->pExtraLlcSnapEncap) + { + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); + pHeaderBufPtr += 6; + // get 2 octets (TypeofLen) + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2); + pHeaderBufPtr += 2; + pTxBlk->MpduHeaderLen += LENGTH_802_1_H; + subFramePayloadLen += LENGTH_802_1_H; + } + + // update subFrame Length field + subFrameHeader[12] = (subFramePayloadLen & 0xFF00) >> 8; + subFrameHeader[13] = subFramePayloadLen & 0xFF; + + totalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; + + if (frameNum ==0) + FirstTx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber); + else + LastTxIdx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber); + + frameNum++; + + pAd->RalinkCounters.KickTxCount++; + pAd->RalinkCounters.OneSecTxDoneCount++; + + // calculate Transmitted AMSDU Count and ByteCount + { + pAd->RalinkCounters.TransmittedAMSDUCount.u.LowPart ++; + pAd->RalinkCounters.TransmittedOctetsInAMSDU.QuadPart += totalMPDUSize; + } + + } + + HAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, FirstTx); + HAL_LastTxIdx(pAd, pTxBlk->QueIdx, LastTxIdx); + + // + // Kick out Tx + // +#ifdef PCIE_PS_SUPPORT + if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) +#endif // PCIE_PS_SUPPORT // + HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); +} +#endif // DOT11_N_SUPPORT // + +VOID STA_Legacy_Frame_Tx( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk) +{ + HEADER_802_11 *pHeader_802_11; + PUCHAR pHeaderBufPtr; + USHORT FreeNumber; + BOOLEAN bVLANPkt; + PQUEUE_ENTRY pQEntry; + + ASSERT(pTxBlk); + + + pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); + pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); + if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) + { + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + return; + } + +#ifdef STATS_COUNT_SUPPORT + if (pTxBlk->TxFrameType == TX_MCAST_FRAME) + { + INC_COUNTER64(pAd->WlanCounters.MulticastTransmittedFrameCount); + } +#endif // STATS_COUNT_SUPPORT // + + if (RTMP_GET_PACKET_RTS(pTxBlk->pPacket)) + TX_BLK_SET_FLAG(pTxBlk, fTX_bRtsRequired); + else + TX_BLK_CLEAR_FLAG(pTxBlk, fTX_bRtsRequired); + + bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); + + if (pTxBlk->TxRate < pAd->CommonCfg.MinTxRate) + pTxBlk->TxRate = pAd->CommonCfg.MinTxRate; + + STAFindCipherAlgorithm(pAd, pTxBlk); + STABuildCommon802_11Header(pAd, pTxBlk); + +#ifdef SOFT_ENCRYPT + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + /* Check if the original data has enough buffer + to insert or append WPI related field. */ + if (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE) + { + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + return; + } + } +#endif // SOFT_ENCRYPT // + + // skip 802.3 header + pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; + pTxBlk->SrcBufLen -= LENGTH_802_3; + + // skip vlan tag + if (bVLANPkt) + { + pTxBlk->pSrcBufData += LENGTH_802_1Q; + pTxBlk->SrcBufLen -= LENGTH_802_1Q; + } + + pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; + pHeader_802_11 = (HEADER_802_11 *) pHeaderBufPtr; + + // skip common header + pHeaderBufPtr += pTxBlk->MpduHeaderLen; + + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) + { + // + // build QOS Control bytes + // + *(pHeaderBufPtr) = ((pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx]<<5)); + *(pHeaderBufPtr+1) = 0; + pHeaderBufPtr +=2; + pTxBlk->MpduHeaderLen += 2; + } + + // The remaining content of MPDU header should locate at 4-octets aligment + pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; + pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4); + pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); + +#ifdef SOFT_ENCRYPT + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + UCHAR iv_offset = 0, ext_offset = 0; + + // if original Ethernet frame contains no LLC/SNAP, + // then an extra LLC/SNAP encap is required + EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2, pTxBlk->pExtraLlcSnapEncap); + + // Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer + if (pTxBlk->pExtraLlcSnapEncap) + { + // Reserve the front 8 bytes of data for LLC header + pTxBlk->pSrcBufData -= LENGTH_802_1_H; + pTxBlk->SrcBufLen += LENGTH_802_1_H; + + NdisMoveMemory(pTxBlk->pSrcBufData, pTxBlk->pExtraLlcSnapEncap, 6); + } + + /* Construct and insert specific IV header to MPDU header */ + RTMPSoftConstructIVHdr(pTxBlk->CipherAlg, + pTxBlk->KeyIdx, + pTxBlk->pKey->TxTsc, + pHeaderBufPtr, + &iv_offset); + pHeaderBufPtr += iv_offset; + pTxBlk->MpduHeaderLen += iv_offset; + + /* Encrypt the MPDU data by software */ + RTMPSoftEncryptionAction(pAd, + pTxBlk->CipherAlg, + (PUCHAR)pHeader_802_11, + pTxBlk->pSrcBufData, + pTxBlk->SrcBufLen, + pTxBlk->KeyIdx, + pTxBlk->pKey, + &ext_offset); + pTxBlk->SrcBufLen += ext_offset; + pTxBlk->TotalFrameLen += ext_offset; + + } + else +#endif // SOFT_ENCRYPT // + { + + // + // Insert LLC-SNAP encapsulation - 8 octets + // + // + // if original Ethernet frame contains no LLC/SNAP, + // then an extra LLC/SNAP encap is required + // + EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap); + if (pTxBlk->pExtraLlcSnapEncap) + { + UCHAR vlan_size; + + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); + pHeaderBufPtr += 6; + // skip vlan tag + vlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0; + // get 2 octets (TypeofLen) + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2); + pHeaderBufPtr += 2; + pTxBlk->MpduHeaderLen += LENGTH_802_1_H; + } + + } + + // + // prepare for TXWI + // use Wcid as Key Index + // + + RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); + + //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); + + HAL_WriteTxResource(pAd, pTxBlk, TRUE, &FreeNumber); + + pAd->RalinkCounters.KickTxCount++; + pAd->RalinkCounters.OneSecTxDoneCount++; + + // + // Kick out Tx + // +#ifdef PCIE_PS_SUPPORT + if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) +#endif // PCIE_PS_SUPPORT // + HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); +} + + +VOID STA_ARalink_Frame_Tx( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk) +{ + PUCHAR pHeaderBufPtr; + USHORT FreeNumber; + USHORT totalMPDUSize=0; + USHORT FirstTx, LastTxIdx; + int frameNum = 0; + BOOLEAN bVLANPkt; + PQUEUE_ENTRY pQEntry; + + + ASSERT(pTxBlk); + + ASSERT((pTxBlk->TxPacketList.Number== 2)); + + + FirstTx = LastTxIdx = 0; // Is it ok init they as 0? + while(pTxBlk->TxPacketList.Head) + { + pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); + pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); + + if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) + { + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + continue; + } + + bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); + + // skip 802.3 header + pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; + pTxBlk->SrcBufLen -= LENGTH_802_3; + + // skip vlan tag + if (bVLANPkt) + { + pTxBlk->pSrcBufData += LENGTH_802_1Q; + pTxBlk->SrcBufLen -= LENGTH_802_1Q; + } + + if (frameNum == 0) + { // For first frame, we need to create the 802.11 header + padding(optional) + RA-AGG-LEN + SNAP Header + + pHeaderBufPtr = STA_Build_ARalink_Frame_Header(pAd, pTxBlk); + + // It's ok write the TxWI here, because the TxWI->MPDUtotalByteCount + // will be updated after final frame was handled. + RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); + + + // + // Insert LLC-SNAP encapsulation - 8 octets + // + EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData-2, pTxBlk->pExtraLlcSnapEncap); + + if (pTxBlk->pExtraLlcSnapEncap) + { + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); + pHeaderBufPtr += 6; + // get 2 octets (TypeofLen) + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2); + pHeaderBufPtr += 2; + pTxBlk->MpduHeaderLen += LENGTH_802_1_H; + } + } + else + { // For second aggregated frame, we need create the 802.3 header to headerBuf, because PCI will copy it to SDPtr0. + + pHeaderBufPtr = &pTxBlk->HeaderBuf[0]; + pTxBlk->MpduHeaderLen = 0; + + // A-Ralink sub-sequent frame header is the same as 802.3 header. + // DA(6)+SA(6)+FrameType(2) + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader, 12); + pHeaderBufPtr += 12; + // get 2 octets (TypeofLen) + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufData-2, 2); + pHeaderBufPtr += 2; + pTxBlk->MpduHeaderLen = LENGTH_ARALINK_SUBFRAMEHEAD; + } + + totalMPDUSize += pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; + + //FreeNumber = GET_TXRING_FREENO(pAd, QueIdx); + if (frameNum ==0) + FirstTx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber); + else + LastTxIdx = HAL_WriteMultiTxResource(pAd, pTxBlk, frameNum, &FreeNumber); + + frameNum++; + + pAd->RalinkCounters.OneSecTxAggregationCount++; + pAd->RalinkCounters.KickTxCount++; + pAd->RalinkCounters.OneSecTxDoneCount++; + + } + + HAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, FirstTx); + HAL_LastTxIdx(pAd, pTxBlk->QueIdx, LastTxIdx); + + // + // Kick out Tx + // +#ifdef PCIE_PS_SUPPORT + if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) +#endif // PCIE_PS_SUPPORT // + HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); + +} + + +VOID STA_Fragment_Frame_Tx( + IN RTMP_ADAPTER *pAd, + IN TX_BLK *pTxBlk) +{ + HEADER_802_11 *pHeader_802_11; + PUCHAR pHeaderBufPtr; + USHORT FreeNumber; + UCHAR fragNum = 0; + PACKET_INFO PacketInfo; + USHORT EncryptionOverhead = 0; + UINT32 FreeMpduSize, SrcRemainingBytes; + USHORT AckDuration; + UINT NextMpduSize; + BOOLEAN bVLANPkt; + PQUEUE_ENTRY pQEntry; + HTTRANSMIT_SETTING *pTransmit; +#ifdef SOFT_ENCRYPT + PUCHAR tmp_ptr = NULL; + UINT32 buf_offset = 0; +#endif // SOFT_ENCRYPT // + + + ASSERT(pTxBlk); + + pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); + pTxBlk->pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); + if (RTMP_FillTxBlkInfo(pAd, pTxBlk) != TRUE) + { + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + return; + } + + ASSERT(TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag)); + bVLANPkt = (RTMP_GET_PACKET_VLAN(pTxBlk->pPacket) ? TRUE : FALSE); + + STAFindCipherAlgorithm(pAd, pTxBlk); + STABuildCommon802_11Header(pAd, pTxBlk); + +#ifdef SOFT_ENCRYPT + // Check if the original data has enough buffer + // to insert or append extended field. + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + if (RTMPExpandPacketForSwEncrypt(pAd, pTxBlk) == FALSE) + { + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + return; + } + } +#endif // SOFT_ENCRYPT // + + if (pTxBlk->CipherAlg == CIPHER_TKIP) + { + pTxBlk->pPacket = duplicate_pkt_with_TKIP_MIC(pAd, pTxBlk->pPacket); + if (pTxBlk->pPacket == NULL) + return; + RTMP_QueryPacketInfo(pTxBlk->pPacket, &PacketInfo, &pTxBlk->pSrcBufHeader, &pTxBlk->SrcBufLen); + } + + // skip 802.3 header + pTxBlk->pSrcBufData = pTxBlk->pSrcBufHeader + LENGTH_802_3; + pTxBlk->SrcBufLen -= LENGTH_802_3; + + + // skip vlan tag + if (bVLANPkt) + { + pTxBlk->pSrcBufData += LENGTH_802_1Q; + pTxBlk->SrcBufLen -= LENGTH_802_1Q; + } + + pHeaderBufPtr = &pTxBlk->HeaderBuf[TXINFO_SIZE + TXWI_SIZE]; + pHeader_802_11 = (HEADER_802_11 *)pHeaderBufPtr; + + + // skip common header + pHeaderBufPtr += pTxBlk->MpduHeaderLen; + + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bWMM)) + { + // + // build QOS Control bytes + // + *pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F); + + *(pHeaderBufPtr+1) = 0; + pHeaderBufPtr +=2; + pTxBlk->MpduHeaderLen += 2; + } + + // + // padding at front of LLC header + // LLC header should locate at 4-octets aligment + // + pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr; + pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4); + pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen); + +#ifdef SOFT_ENCRYPT + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + UCHAR iv_offset = 0; + + // if original Ethernet frame contains no LLC/SNAP, + // then an extra LLC/SNAP encap is required + EXTRA_LLCSNAP_ENCAP_FROM_PKT_OFFSET(pTxBlk->pSrcBufData - 2, pTxBlk->pExtraLlcSnapEncap); + + // Insert LLC-SNAP encapsulation (8 octets) to MPDU data buffer + if (pTxBlk->pExtraLlcSnapEncap) + { + // Reserve the front 8 bytes of data for LLC header + pTxBlk->pSrcBufData -= LENGTH_802_1_H; + pTxBlk->SrcBufLen += LENGTH_802_1_H; + + NdisMoveMemory(pTxBlk->pSrcBufData, pTxBlk->pExtraLlcSnapEncap, 6); + } + + /* Construct and insert specific IV header to MPDU header */ + RTMPSoftConstructIVHdr(pTxBlk->CipherAlg, + pTxBlk->KeyIdx, + pTxBlk->pKey->TxTsc, + pHeaderBufPtr, + &iv_offset); + pHeaderBufPtr += iv_offset; + pTxBlk->MpduHeaderLen += iv_offset; + + } + else +#endif // SOFT_ENCRYPT // + { + + + // + // Insert LLC-SNAP encapsulation - 8 octets + // + // + // if original Ethernet frame contains no LLC/SNAP, + // then an extra LLC/SNAP encap is required + // + EXTRA_LLCSNAP_ENCAP_FROM_PKT_START(pTxBlk->pSrcBufHeader, pTxBlk->pExtraLlcSnapEncap); + if (pTxBlk->pExtraLlcSnapEncap) + { + UCHAR vlan_size; + + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pExtraLlcSnapEncap, 6); + pHeaderBufPtr += 6; + // skip vlan tag + vlan_size = (bVLANPkt) ? LENGTH_802_1Q : 0; + // get 2 octets (TypeofLen) + NdisMoveMemory(pHeaderBufPtr, pTxBlk->pSrcBufHeader+12+vlan_size, 2); + pHeaderBufPtr += 2; + pTxBlk->MpduHeaderLen += LENGTH_802_1_H; + } + } + + // If TKIP is used and fragmentation is required. Driver has to + // append TKIP MIC at tail of the scatter buffer + // MAC ASIC will only perform IV/EIV/ICV insertion but no TKIP MIC + if (pTxBlk->CipherAlg == CIPHER_TKIP) + { + RTMPCalculateMICValue(pAd, pTxBlk->pPacket, pTxBlk->pExtraLlcSnapEncap, pTxBlk->pKey, 0); + + // NOTE: DON'T refer the skb->len directly after following copy. Becasue the length is not adjust + // to correct lenght, refer to pTxBlk->SrcBufLen for the packet length in following progress. + NdisMoveMemory(pTxBlk->pSrcBufData + pTxBlk->SrcBufLen, &pAd->PrivateInfo.Tx.MIC[0], 8); + //skb_put((RTPKT_TO_OSPKT(pTxBlk->pPacket))->tail, 8); + pTxBlk->SrcBufLen += 8; + pTxBlk->TotalFrameLen += 8; + } + + // + // calcuate the overhead bytes that encryption algorithm may add. This + // affects the calculate of "duration" field + // + if ((pTxBlk->CipherAlg == CIPHER_WEP64) || (pTxBlk->CipherAlg == CIPHER_WEP128)) + EncryptionOverhead = 8; //WEP: IV[4] + ICV[4]; + else if (pTxBlk->CipherAlg == CIPHER_TKIP) + EncryptionOverhead = 12;//TKIP: IV[4] + EIV[4] + ICV[4], MIC will be added to TotalPacketLength + else if (pTxBlk->CipherAlg == CIPHER_AES) + EncryptionOverhead = 16; // AES: IV[4] + EIV[4] + MIC[8] + else + EncryptionOverhead = 0; + + pTransmit = pTxBlk->pTransmit; + // Decide the TX rate + if (pTransmit->field.MODE == MODE_CCK) + pTxBlk->TxRate = pTransmit->field.MCS; + else if (pTransmit->field.MODE == MODE_OFDM) + pTxBlk->TxRate = pTransmit->field.MCS + RATE_FIRST_OFDM_RATE; + else + pTxBlk->TxRate = RATE_6_5; + + // decide how much time an ACK/CTS frame will consume in the air + if (pTxBlk->TxRate <= RATE_LAST_OFDM_RATE) + AckDuration = RTMPCalcDuration(pAd, pAd->CommonCfg.ExpectedACKRate[pTxBlk->TxRate], 14); + else + AckDuration = RTMPCalcDuration(pAd, RATE_6_5, 14); + + // Init the total payload length of this frame. + SrcRemainingBytes = pTxBlk->SrcBufLen; + + pTxBlk->TotalFragNum = 0xff; + +#ifdef SOFT_ENCRYPT + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + // store the outgoing frame for calculating MIC per fragmented frame + os_alloc_mem(pAd, (PUCHAR *)&tmp_ptr, pTxBlk->SrcBufLen); + if (tmp_ptr == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory for SW MIC calculation !!!\n", + __FUNCTION__)); + RELEASE_NDIS_PACKET(pAd, pTxBlk->pPacket, NDIS_STATUS_FAILURE); + return; + } + NdisMoveMemory(tmp_ptr, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen); + } +#endif // SOFT_ENCRYPT // + + do { + + FreeMpduSize = pAd->CommonCfg.FragmentThreshold - LENGTH_CRC; + + FreeMpduSize -= pTxBlk->MpduHeaderLen; + + if (SrcRemainingBytes <= FreeMpduSize) + { // this is the last or only fragment + + pTxBlk->SrcBufLen = SrcRemainingBytes; + + pHeader_802_11->FC.MoreFrag = 0; + pHeader_802_11->Duration = pAd->CommonCfg.Dsifs + AckDuration; + + // Indicate the lower layer that this's the last fragment. + pTxBlk->TotalFragNum = fragNum; + } + else + { // more fragment is required + + pTxBlk->SrcBufLen = FreeMpduSize; + + NextMpduSize = min(((UINT)SrcRemainingBytes - pTxBlk->SrcBufLen), ((UINT)pAd->CommonCfg.FragmentThreshold)); + pHeader_802_11->FC.MoreFrag = 1; + pHeader_802_11->Duration = (3 * pAd->CommonCfg.Dsifs) + (2 * AckDuration) + RTMPCalcDuration(pAd, pTxBlk->TxRate, NextMpduSize + EncryptionOverhead); + } + + //DBGPRINT(RT_DEBUG_INFO, ("!!!%s : Frag#%d !!!\n", __FUNCTION__, pHeader_802_11->Frag)); + + SrcRemainingBytes -= pTxBlk->SrcBufLen; + + if (fragNum == 0) + pTxBlk->FrameGap = IFS_HTTXOP; + else + pTxBlk->FrameGap = IFS_SIFS; + +#ifdef SOFT_ENCRYPT + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + UCHAR ext_offset = 0; + + NdisMoveMemory(pTxBlk->pSrcBufData, tmp_ptr + buf_offset, pTxBlk->SrcBufLen); + buf_offset += pTxBlk->SrcBufLen; + + /* Encrypt the MPDU data by software */ + RTMPSoftEncryptionAction(pAd, + pTxBlk->CipherAlg, + (PUCHAR)pHeader_802_11, + pTxBlk->pSrcBufData, + pTxBlk->SrcBufLen, + pTxBlk->KeyIdx, + pTxBlk->pKey, + &ext_offset); + pTxBlk->SrcBufLen += ext_offset; + pTxBlk->TotalFrameLen += ext_offset; + + } +#endif // SOFT_ENCRYPT // + + RTMPWriteTxWI_Data(pAd, (PTXWI_STRUC)(&pTxBlk->HeaderBuf[TXINFO_SIZE]), pTxBlk); + + HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, &FreeNumber); + + pAd->RalinkCounters.KickTxCount++; + pAd->RalinkCounters.OneSecTxDoneCount++; + + // Update the frame number, remaining size of the NDIS packet payload. + +#ifdef SOFT_ENCRYPT + if (TX_BLK_TEST_FLAG(pTxBlk, fTX_bSwEncrypt)) + { + if ((pTxBlk->CipherAlg == CIPHER_WEP64) || (pTxBlk->CipherAlg == CIPHER_WEP128)) + { + inc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WEP_TSC, 1); + /* Construct and insert 4-bytes WEP IV header to MPDU header */ + RTMPConstructWEPIVHdr(pTxBlk->KeyIdx, pTxBlk->pKey->TxTsc, + pHeaderBufPtr - (LEN_WEP_IV_HDR)); + } + else if (pTxBlk->CipherAlg == CIPHER_TKIP) + ; + else if (pTxBlk->CipherAlg == CIPHER_AES) + { + inc_iv_byte(pTxBlk->pKey->TxTsc, LEN_WPA_TSC, 1); + /* Construct and insert 8-bytes CCMP header to MPDU header */ + RTMPConstructCCMPHdr(pTxBlk->KeyIdx, pTxBlk->pKey->TxTsc, + pHeaderBufPtr - (LEN_CCMP_HDR)); + } + } + else +#endif // SOFT_ENCRYPT // + { + // space for 802.11 header. + if (fragNum == 0 && pTxBlk->pExtraLlcSnapEncap) + pTxBlk->MpduHeaderLen -= LENGTH_802_1_H; + } + + fragNum++; + //SrcRemainingBytes -= pTxBlk->SrcBufLen; + pTxBlk->pSrcBufData += pTxBlk->SrcBufLen; + + pHeader_802_11->Frag++; // increase Frag # + + }while(SrcRemainingBytes > 0); + +#ifdef SOFT_ENCRYPT + if (tmp_ptr != NULL) + os_free_mem(pAd, tmp_ptr); +#endif // SOFT_ENCRYPT // + + // + // Kick out Tx + // +#ifdef PCIE_PS_SUPPORT + if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX)) +#endif // PCIE_PS_SUPPORT // + HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx); +} + + +#define RELEASE_FRAMES_OF_TXBLK(_pAd, _pTxBlk, _pQEntry, _Status) \ + while(_pTxBlk->TxPacketList.Head) \ + { \ + _pQEntry = RemoveHeadQueue(&_pTxBlk->TxPacketList); \ + RELEASE_NDIS_PACKET(_pAd, QUEUE_ENTRY_TO_PACKET(_pQEntry), _Status); \ + } + + +/* + ======================================================================== + + Routine Description: + Copy frame from waiting queue into relative ring buffer and set + appropriate ASIC register to kick hardware encryption before really + sent out to air. + + Arguments: + pAd Pointer to our adapter + PNDIS_PACKET Pointer to outgoing Ndis frame + NumberOfFrag Number of fragment required + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +NDIS_STATUS STAHardTransmit( + IN PRTMP_ADAPTER pAd, + IN TX_BLK *pTxBlk, + IN UCHAR QueIdx) +{ + NDIS_PACKET *pPacket; + PQUEUE_ENTRY pQEntry; + + // --------------------------------------------- + // STEP 0. DO SANITY CHECK AND SOME EARLY PREPARATION. + // --------------------------------------------- + // + ASSERT(pTxBlk->TxPacketList.Number); + if (pTxBlk->TxPacketList.Head == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("pTxBlk->TotalFrameNum == %ld!\n", pTxBlk->TxPacketList.Number)); + return NDIS_STATUS_FAILURE; + } + + pPacket = QUEUE_ENTRY_TO_PACKET(pTxBlk->TxPacketList.Head); + + + // ------------------------------------------------------------------ + // STEP 1. WAKE UP PHY + // outgoing frame always wakeup PHY to prevent frame lost and + // turn off PSM bit to improve performance + // ------------------------------------------------------------------ + // not to change PSM bit, just send this frame out? + if ((pAd->StaCfg.Psm == PWR_SAVE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { + DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicForceWakeup At HardTx\n")); +#ifdef RTMP_MAC_PCI + AsicForceWakeup(pAd, TRUE); +#endif // RTMP_MAC_PCI // + } + + // It should not change PSM bit, when APSD turn on. + if ((!(pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable) && (pAd->CommonCfg.bAPSDForcePowerSave == FALSE)) + || (RTMP_GET_PACKET_EAPOL(pTxBlk->pPacket)) + || (RTMP_GET_PACKET_WAI(pTxBlk->pPacket))) + { + if ((pAd->StaCfg.Psm == PWR_SAVE) && + (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeFast_PSP)) + RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE); + } + + switch (pTxBlk->TxFrameType) + { +#ifdef DOT11_N_SUPPORT + case TX_AMPDU_FRAME: + STA_AMPDU_Frame_Tx(pAd, pTxBlk); + break; + case TX_AMSDU_FRAME: + STA_AMSDU_Frame_Tx(pAd, pTxBlk); + break; +#endif // DOT11_N_SUPPORT // + case TX_LEGACY_FRAME: + STA_Legacy_Frame_Tx(pAd, pTxBlk); + break; + case TX_MCAST_FRAME: + STA_Legacy_Frame_Tx(pAd, pTxBlk); + break; + case TX_RALINK_FRAME: + STA_ARalink_Frame_Tx(pAd, pTxBlk); + break; + case TX_FRAG_FRAME: + STA_Fragment_Frame_Tx(pAd, pTxBlk); + break; + default: + { + // It should not happened! + DBGPRINT(RT_DEBUG_ERROR, ("Send a pacekt was not classified!! It should not happen!\n")); + while(pTxBlk->TxPacketList.Number) + { + pQEntry = RemoveHeadQueue(&pTxBlk->TxPacketList); + pPacket = QUEUE_ENTRY_TO_PACKET(pQEntry); + if (pPacket) + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + } + } + break; + } + + return (NDIS_STATUS_SUCCESS); + +} + +ULONG HashBytesPolynomial(UCHAR *value, unsigned int len) +{ + unsigned char *word = value; + unsigned int ret = 0; + unsigned int i; + + for(i=0; i < len; i++) + { + int mod = i % 32; + ret ^=(unsigned int) (word[i]) << mod; + ret ^=(unsigned int) (word[i]) >> (32 - mod); + } + return ret; +} + +VOID Sta_Announce_or_Forward_802_3_Packet( + IN PRTMP_ADAPTER pAd, + IN PNDIS_PACKET pPacket, + IN UCHAR FromWhichBSSID) +{ + if (TRUE + ) + { + announce_802_3_packet(pAd, pPacket); + } + else + { + // release packet + RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); + } +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sanity.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sanity.c new file mode 100644 index 000000000..6ff216923 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sanity.c @@ -0,0 +1,335 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + sanity.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John Chang 2004-09-01 add WMM support +*/ +#include "rt_config.h" + +extern UCHAR CISCO_OUI[]; + +extern UCHAR WPA_OUI[]; +extern UCHAR RSN_OUI[]; +extern UCHAR WME_INFO_ELEM[]; +extern UCHAR WME_PARM_ELEM[]; +extern UCHAR Ccx2QosInfo[]; +extern UCHAR RALINK_OUI[]; +extern UCHAR BROADCOM_OUI[]; + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== + */ +BOOLEAN MlmeStartReqSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *Msg, + IN ULONG MsgLen, + OUT CHAR Ssid[], + OUT UCHAR *pSsidLen) +{ + MLME_START_REQ_STRUCT *Info; + + Info = (MLME_START_REQ_STRUCT *)(Msg); + + if (Info->SsidLen > MAX_LEN_OF_SSID) + { + DBGPRINT(RT_DEBUG_TRACE, ("MlmeStartReqSanity fail - wrong SSID length\n")); + return FALSE; + } + + *pSsidLen = Info->SsidLen; + NdisMoveMemory(Ssid, Info->Ssid, *pSsidLen); + + return TRUE; +} + +/* + ========================================================================== + Description: + MLME message sanity check + Return: + TRUE if all parameters are OK, FALSE otherwise + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN PeerAssocRspSanity( + IN PRTMP_ADAPTER pAd, + IN VOID *pMsg, + IN ULONG MsgLen, + OUT PUCHAR pAddr2, + OUT USHORT *pCapabilityInfo, + OUT USHORT *pStatus, + OUT USHORT *pAid, + OUT UCHAR SupRate[], + OUT UCHAR *pSupRateLen, + OUT UCHAR ExtRate[], + OUT UCHAR *pExtRateLen, + OUT HT_CAPABILITY_IE *pHtCapability, + OUT ADD_HT_INFO_IE *pAddHtInfo, // AP might use this additional ht info IE + OUT UCHAR *pHtCapabilityLen, + OUT UCHAR *pAddHtInfoLen, + OUT UCHAR *pNewExtChannelOffset, + OUT PEDCA_PARM pEdcaParm, + OUT EXT_CAP_INFO_ELEMENT *pExtCapInfo, + OUT UCHAR *pCkipFlag) +{ + CHAR IeType, *Ptr; + PFRAME_802_11 pFrame = (PFRAME_802_11)pMsg; + PEID_STRUCT pEid; + ULONG Length = 0; + + *pNewExtChannelOffset = 0xff; + *pHtCapabilityLen = 0; + *pAddHtInfoLen = 0; + COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2); + Ptr = (PCHAR)pFrame->Octet; + Length += LENGTH_802_11; + + NdisMoveMemory(pCapabilityInfo, &pFrame->Octet[0], 2); + Length += 2; + NdisMoveMemory(pStatus, &pFrame->Octet[2], 2); + Length += 2; + *pCkipFlag = 0; + *pExtRateLen = 0; + pEdcaParm->bValid = FALSE; + + if (*pStatus != MLME_SUCCESS) + return TRUE; + + NdisMoveMemory(pAid, &pFrame->Octet[4], 2); + Length += 2; + + // Aid already swaped byte order in RTMPFrameEndianChange() for big endian platform + *pAid = (*pAid) & 0x3fff; // AID is low 14-bit + + // -- get supported rates from payload and advance the pointer + IeType = pFrame->Octet[6]; + *pSupRateLen = pFrame->Octet[7]; + if ((IeType != IE_SUPP_RATES) || (*pSupRateLen > MAX_LEN_OF_SUPPORTED_RATES)) + { + DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspSanity fail - wrong SupportedRates IE\n")); + return FALSE; + } + else + NdisMoveMemory(SupRate, &pFrame->Octet[8], *pSupRateLen); + + + Length = Length + 2 + *pSupRateLen; + + // many AP implement proprietary IEs in non-standard order, we'd better + // tolerate mis-ordered IEs to get best compatibility + pEid = (PEID_STRUCT) &pFrame->Octet[8 + (*pSupRateLen)]; + + // get variable fields from payload and advance the pointer + while ((Length + 2 + pEid->Len) <= MsgLen) + { + switch (pEid->Eid) + { + case IE_EXT_SUPP_RATES: + if (pEid->Len <= MAX_LEN_OF_SUPPORTED_RATES) + { + NdisMoveMemory(ExtRate, pEid->Octet, pEid->Len); + *pExtRateLen = pEid->Len; + } + break; + + case IE_HT_CAP: + case IE_HT_CAP2: + if (pEid->Len >= SIZE_HT_CAP_IE) //Note: allow extension.!! + { + NdisMoveMemory(pHtCapability, pEid->Octet, SIZE_HT_CAP_IE); + + *(USHORT *)(&pHtCapability->HtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->HtCapInfo)); + *(USHORT *)(&pHtCapability->ExtHtCapInfo) = cpu2le16(*(USHORT *)(&pHtCapability->ExtHtCapInfo)); + + *pHtCapabilityLen = SIZE_HT_CAP_IE; + } + else + { + DBGPRINT(RT_DEBUG_WARN, ("PeerAssocRspSanity - wrong IE_HT_CAP. \n")); + } + + break; +#ifdef DOT11_N_SUPPORT + case IE_ADD_HT: + case IE_ADD_HT2: + if (pEid->Len >= sizeof(ADD_HT_INFO_IE)) + { + // This IE allows extension, but we can ignore extra bytes beyond our knowledge , so only + // copy first sizeof(ADD_HT_INFO_IE) + NdisMoveMemory(pAddHtInfo, pEid->Octet, sizeof(ADD_HT_INFO_IE)); + + *(USHORT *)(&pAddHtInfo->AddHtInfo2) = cpu2le16(*(USHORT *)(&pAddHtInfo->AddHtInfo2)); + *(USHORT *)(&pAddHtInfo->AddHtInfo3) = cpu2le16(*(USHORT *)(&pAddHtInfo->AddHtInfo3)); + + *pAddHtInfoLen = SIZE_ADD_HT_INFO_IE; + } + else + { + DBGPRINT(RT_DEBUG_WARN, ("PeerAssocRspSanity - wrong IE_ADD_HT. \n")); + } + + break; + case IE_SECONDARY_CH_OFFSET: + if (pEid->Len == 1) + { + *pNewExtChannelOffset = pEid->Octet[0]; + } + else + { + DBGPRINT(RT_DEBUG_WARN, ("PeerAssocRspSanity - wrong IE_SECONDARY_CH_OFFSET. \n")); + } +#endif // DOT11_N_SUPPORT // + break; + + case IE_VENDOR_SPECIFIC: + // handle WME PARAMTER ELEMENT + if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24)) + { + PUCHAR ptr; + int i; + + // parsing EDCA parameters + pEdcaParm->bValid = TRUE; + pEdcaParm->bQAck = FALSE; // pEid->Octet[0] & 0x10; + pEdcaParm->bQueueRequest = FALSE; // pEid->Octet[0] & 0x20; + pEdcaParm->bTxopRequest = FALSE; // pEid->Octet[0] & 0x40; + //pEdcaParm->bMoreDataAck = FALSE; // pEid->Octet[0] & 0x80; + pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f; + pEdcaParm->bAPSDCapable = (pEid->Octet[6] & 0x80) ? 1 : 0; + ptr = (PUCHAR)&pEid->Octet[8]; + for (i=0; i<4; i++) + { + UCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX + pEdcaParm->bACM[aci] = (((*ptr) & 0x10) == 0x10); // b5 is ACM + pEdcaParm->Aifsn[aci] = (*ptr) & 0x0f; // b0~3 is AIFSN + pEdcaParm->Cwmin[aci] = *(ptr+1) & 0x0f; // b0~4 is Cwmin + pEdcaParm->Cwmax[aci] = *(ptr+1) >> 4; // b5~8 is Cwmax + pEdcaParm->Txop[aci] = *(ptr+2) + 256 * (*(ptr+3)); // in unit of 32-us + ptr += 4; // point to next AC + } + } + break; + case IE_EXT_CAPABILITY: + if (pEid->Len >= sizeof(EXT_CAP_INFO_ELEMENT)) + { + NdisMoveMemory(pExtCapInfo, &pEid->Octet[0], 4); + DBGPRINT(RT_DEBUG_WARN, ("PeerAssocReqSanity - IE_EXT_CAPABILITY!\n")); + } + break; + + default: + DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspSanity - ignore unrecognized EID = %d\n", pEid->Eid)); + break; + } + + Length = Length + 2 + pEid->Len; + pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len); + } + + + return TRUE; +} +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +BOOLEAN GetTimBit( + IN CHAR *Ptr, + IN USHORT Aid, + OUT UCHAR *TimLen, + OUT UCHAR *BcastFlag, + OUT UCHAR *DtimCount, + OUT UCHAR *DtimPeriod, + OUT UCHAR *MessageToMe) +{ + UCHAR BitCntl, N1, N2, MyByte, MyBit; + CHAR *IdxPtr; + + IdxPtr = Ptr; + + IdxPtr ++; + *TimLen = *IdxPtr; + + // get DTIM Count from TIM element + IdxPtr ++; + *DtimCount = *IdxPtr; + + // get DTIM Period from TIM element + IdxPtr++; + *DtimPeriod = *IdxPtr; + + // get Bitmap Control from TIM element + IdxPtr++; + BitCntl = *IdxPtr; + + if ((*DtimCount == 0) && (BitCntl & 0x01)) + *BcastFlag = TRUE; + else + *BcastFlag = FALSE; + + // Parse Partial Virtual Bitmap from TIM element + N1 = BitCntl & 0xfe; // N1 is the first bitmap byte# + N2 = *TimLen - 4 + N1; // N2 is the last bitmap byte# + + if ((Aid < (N1 << 3)) || (Aid >= ((N2 + 1) << 3))) + *MessageToMe = FALSE; + else + { + MyByte = (Aid >> 3) - N1; // my byte position in the bitmap byte-stream + MyBit = Aid % 16 - ((MyByte & 0x01)? 8:0); + + IdxPtr += (MyByte + 1); + + //if (*IdxPtr) + // DBGPRINT(RT_DEBUG_WARN, ("TIM bitmap = 0x%02x\n", *IdxPtr)); + + if (*IdxPtr & (0x01 << MyBit)) + *MessageToMe = TRUE; + else + *MessageToMe = FALSE; + } + + return TRUE; +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sta_cfg.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sta_cfg.c new file mode 100644 index 000000000..b9164245b --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sta_cfg.c @@ -0,0 +1,1679 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + sta_ioctl.c + + Abstract: + IOCTL related subroutines + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Rory Chen 01-03-2003 created + Rory Chen 02-14-2005 modify to support RT61 +*/ + +#include "rt_config.h" + + + +INT Set_AutoReconnect_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +INT Set_AdhocN_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg); + +char * rtstrchr(const char * s, int c) +{ + for(; *s != (char) c; ++s) + if (*s == '\0') + return NULL; + return (char *) s; +} + +static struct { + PSTRING name; + INT (*set_proc)(PRTMP_ADAPTER pAdapter, PSTRING arg); +} *PRTMP_PRIVATE_SET_PROC, RTMP_PRIVATE_SUPPORT_PROC[] = { + {"DriverVersion", Set_DriverVersion_Proc}, + {"CountryRegion", Set_CountryRegion_Proc}, + {"CountryRegionABand", Set_CountryRegionABand_Proc}, + {"SSID", Set_SSID_Proc}, + {"WirelessMode", Set_WirelessMode_Proc}, + {"TxBurst", Set_TxBurst_Proc}, + {"TxPreamble", Set_TxPreamble_Proc}, + {"TxPower", Set_TxPower_Proc}, + {"Channel", Set_Channel_Proc}, + {"BGProtection", Set_BGProtection_Proc}, + {"RTSThreshold", Set_RTSThreshold_Proc}, + {"FragThreshold", Set_FragThreshold_Proc}, +#ifdef DOT11_N_SUPPORT + {"HtBw", Set_HtBw_Proc}, + {"HtMcs", Set_HtMcs_Proc}, + {"HtGi", Set_HtGi_Proc}, + {"HtOpMode", Set_HtOpMode_Proc}, + {"HtExtcha", Set_HtExtcha_Proc}, + {"HtMpduDensity", Set_HtMpduDensity_Proc}, + {"HtBaWinSize", Set_HtBaWinSize_Proc}, + {"HtRdg", Set_HtRdg_Proc}, + {"HtAmsdu", Set_HtAmsdu_Proc}, + {"HtAutoBa", Set_HtAutoBa_Proc}, + {"HtBaDecline", Set_BADecline_Proc}, + {"HtProtect", Set_HtProtect_Proc}, + {"HtMimoPs", Set_HtMimoPs_Proc}, + {"HtDisallowTKIP", Set_HtDisallowTKIP_Proc}, +#ifdef DOT11N_DRAFT3 + {"HtBssCoex", Set_HT_BssCoex_Proc}, +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +#ifdef AGGREGATION_SUPPORT + {"PktAggregate", Set_PktAggregate_Proc}, +#endif // AGGREGATION_SUPPORT // + +#ifdef WMM_SUPPORT + {"WmmCapable", Set_WmmCapable_Proc}, +#endif + {"IEEE80211H", Set_IEEE80211H_Proc}, + {"NetworkType", Set_NetworkType_Proc}, + {"AuthMode", Set_AuthMode_Proc}, + {"EncrypType", Set_EncrypType_Proc}, + {"DefaultKeyID", Set_DefaultKeyID_Proc}, + {"Key1", Set_Key1_Proc}, + {"Key2", Set_Key2_Proc}, + {"Key3", Set_Key3_Proc}, + {"Key4", Set_Key4_Proc}, + {"WPAPSK", Set_WPAPSK_Proc}, + {"ResetCounter", Set_ResetStatCounter_Proc}, + {"PSMode", Set_PSMode_Proc}, +#ifdef DBG + {"Debug", Set_Debug_Proc}, +#endif // DBG // + +#ifdef RALINK_ATE + {"ATE", Set_ATE_Proc}, + {"ATEDA", Set_ATE_DA_Proc}, + {"ATESA", Set_ATE_SA_Proc}, + {"ATEBSSID", Set_ATE_BSSID_Proc}, + {"ATECHANNEL", Set_ATE_CHANNEL_Proc}, + {"ATETXPOW0", Set_ATE_TX_POWER0_Proc}, + {"ATETXPOW1", Set_ATE_TX_POWER1_Proc}, + {"ATETXANT", Set_ATE_TX_Antenna_Proc}, + {"ATERXANT", Set_ATE_RX_Antenna_Proc}, + {"ATETXFREQOFFSET", Set_ATE_TX_FREQOFFSET_Proc}, + {"ATETXBW", Set_ATE_TX_BW_Proc}, + {"ATETXLEN", Set_ATE_TX_LENGTH_Proc}, + {"ATETXCNT", Set_ATE_TX_COUNT_Proc}, + {"ATETXMCS", Set_ATE_TX_MCS_Proc}, + {"ATETXMODE", Set_ATE_TX_MODE_Proc}, + {"ATETXGI", Set_ATE_TX_GI_Proc}, + {"ATERXFER", Set_ATE_RX_FER_Proc}, + {"ATERRF", Set_ATE_Read_RF_Proc}, +#ifndef RTMP_RF_RW_SUPPORT + {"ATEWRF1", Set_ATE_Write_RF1_Proc}, + {"ATEWRF2", Set_ATE_Write_RF2_Proc}, + {"ATEWRF3", Set_ATE_Write_RF3_Proc}, + {"ATEWRF4", Set_ATE_Write_RF4_Proc}, +#endif // RTMP_RF_RW_SUPPORT // + {"ATELDE2P", Set_ATE_Load_E2P_Proc}, + {"ATERE2P", Set_ATE_Read_E2P_Proc}, +#ifdef RT35xx + {"ATELED", Set_ATE_LED_Proc}, + {"ATEHWLED", Set_ATE_HW_LED_Proc}, +#endif // RT35xx // + {"ATESHOW", Set_ATE_Show_Proc}, + {"ATEHELP", Set_ATE_Help_Proc}, + +#ifdef RALINK_28xx_QA + {"TxStop", Set_TxStop_Proc}, + {"RxStop", Set_RxStop_Proc}, +#endif // RALINK_28xx_QA // +#endif // RALINK_ATE // + +#ifdef WPA_SUPPLICANT_SUPPORT + {"WpaSupport", Set_Wpa_Support}, +#endif // WPA_SUPPLICANT_SUPPORT // + + + + + + {"FixedTxMode", Set_FixedTxMode_Proc}, +#ifdef CONFIG_APSTA_MIXED_SUPPORT + {"OpMode", Set_OpMode_Proc}, +#endif // CONFIG_APSTA_MIXED_SUPPORT // +#ifdef DOT11_N_SUPPORT + {"TGnWifiTest", Set_TGnWifiTest_Proc}, + {"ForceGF", Set_ForceGF_Proc}, +#endif // DOT11_N_SUPPORT // +#ifdef QOS_DLS_SUPPORT + {"DlsAddEntry", Set_DlsAddEntry_Proc}, + {"DlsTearDownEntry", Set_DlsTearDownEntry_Proc}, +#endif // QOS_DLS_SUPPORT // + {"LongRetry", Set_LongRetryLimit_Proc}, + {"ShortRetry", Set_ShortRetryLimit_Proc}, + {"AutoFallBack", Set_AutoFallBack_Proc}, +#ifdef EXT_BUILD_CHANNEL_LIST + {"11dClientMode", Set_Ieee80211dClientMode_Proc}, +#endif // EXT_BUILD_CHANNEL_LIST // +#ifdef CARRIER_DETECTION_SUPPORT + {"CarrierDetect", Set_CarrierDetect_Proc}, +#endif // CARRIER_DETECTION_SUPPORT // + + +//2008/09/11:KH add to support efuse<-- +#ifdef RT30xx +#ifdef RTMP_EFUSE_SUPPORT + {"efuseFreeNumber", set_eFuseGetFreeBlockCount_Proc}, + {"efuseDump", set_eFusedump_Proc}, + {"efuseLoadFromBin", set_eFuseLoadFromBin_Proc}, +#ifdef RALINK_ATE + {"efuseBufferModeWriteBack", set_eFuseBufferModeWriteBack_Proc}, +#endif // RALINK_ATE // +#endif // RTMP_EFUSE_SUPPORT // +#endif // RT30xx // +//2008/09/11:KH add to support efuse--> + {"BeaconLostTime", Set_BeaconLostTime_Proc}, + {"AutoRoaming", Set_AutoRoaming_Proc}, + {"SiteSurvey", Set_SiteSurvey_Proc}, + {"ForceTxBurst", Set_ForceTxBurst_Proc}, +#ifdef XLINK_SUPPORT + {"XlinkMode", Set_XlinkMode_Proc}, +#endif // XLINK_SUPPORT // + + + {"AutoReconnect", Set_AutoReconnect_Proc}, + {"AdhocN", Set_AdhocN_Proc}, + {NULL,} +}; + + +int rt_ioctl_setparam(struct net_device *dev, struct iw_request_info *info, + void *w, char *extra) +{ + PRTMP_ADAPTER pAdapter; + POS_COOKIE pObj; + PSTRING this_char = extra; + PSTRING value; + int Status=0; + + GET_PAD_FROM_NET_DEV(pAdapter, dev); + + if (pAdapter == NULL) + { + /* if 1st open fail, pAd will be free; + So the net_dev->priv will be NULL in 2rd open */ + return -ENETDOWN; + } + + pObj = (POS_COOKIE) pAdapter->OS_Cookie; + { + pObj->ioctl_if_type = INT_MAIN; + pObj->ioctl_if = MAIN_MBSSID; + } + + //check if the interface is down + if(!RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (!*this_char) + return -EINVAL; + + if ((value = rtstrchr(this_char, '=')) != NULL) + *value++ = 0; + + if (!value && (strcmp(this_char, "SiteSurvey") != 0)) + return -EINVAL; + else + goto SET_PROC; + + // reject setting nothing besides ANY ssid(ssidLen=0) + if (!*value && (strcmp(this_char, "SSID") != 0)) + return -EINVAL; + +SET_PROC: + for (PRTMP_PRIVATE_SET_PROC = RTMP_PRIVATE_SUPPORT_PROC; PRTMP_PRIVATE_SET_PROC->name; PRTMP_PRIVATE_SET_PROC++) + { + if (strcmp(this_char, PRTMP_PRIVATE_SET_PROC->name) == 0) + { + if(!PRTMP_PRIVATE_SET_PROC->set_proc(pAdapter, value)) + { //FALSE:Set private failed then return Invalid argument + Status = -EINVAL; + } + break; //Exit for loop. + } + } + + if(PRTMP_PRIVATE_SET_PROC->name == NULL) + { //Not found argument + Status = -EINVAL; + DBGPRINT(RT_DEBUG_TRACE, ("===>rt_ioctl_setparam:: (iwpriv) Not Support Set Command [%s=%s]\n", this_char, value)); + } + + return Status; +} + + +/* + ========================================================================== + Description: + Set SSID + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_SSID_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + NDIS_802_11_SSID Ssid, *pSsid=NULL; + BOOLEAN StateMachineTouched = FALSE; + int success = TRUE; + + /* + Set the AutoReconnectSsid to prevent it reconnect to old SSID + Since calling this indicate user don't want to connect to that SSID anymore. + */ + pAd->MlmeAux.AutoReconnectSsidLen= 32; + NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); + + if( strlen(arg) <= MAX_LEN_OF_SSID) + { + NdisZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); + if (strlen(arg) != 0) + { + NdisMoveMemory(Ssid.Ssid, arg, strlen(arg)); + Ssid.SsidLength = strlen(arg); + } + else //ANY ssid + { + Ssid.SsidLength = 0; + memcpy(Ssid.Ssid, "", 0); + pAd->StaCfg.BssType = BSS_INFRA; + pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen; + pAd->StaCfg.WepStatus = Ndis802_11EncryptionDisabled; + } + pSsid = &Ssid; + + if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAd); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + + if ((pAd->StaCfg.WpaPassPhraseLen >= 8) && + (pAd->StaCfg.WpaPassPhraseLen <= 64)) + { + UCHAR keyMaterial[40]; + + RTMPZeroMemory(pAd->StaCfg.PMK, 32); + if (pAd->StaCfg.WpaPassPhraseLen == 64) + { + AtoH((PSTRING) pAd->StaCfg.WpaPassPhrase, pAd->StaCfg.PMK, 32); + } + else + { + RtmpPasswordHash((PSTRING) pAd->StaCfg.WpaPassPhrase, Ssid.Ssid, Ssid.SsidLength, keyMaterial); + NdisMoveMemory(pAd->StaCfg.PMK, keyMaterial, 32); + } + } + + // Record the desired user settings to MlmeAux + NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); + NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid.Ssid, Ssid.SsidLength); + pAd->MlmeAux.SsidLen = (UCHAR)Ssid.SsidLength; + + pAd->MlmeAux.CurrReqIsFromNdis = TRUE; + pAd->StaCfg.bScanReqIsFromWebUI = FALSE; + pAd->bConfigChanged = TRUE; + + if (pAd->StaCfg.BssType == BSS_ADHOC) + pAd->StaCfg.bNotFirstScan = FALSE; + + + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_SSID, + sizeof(NDIS_802_11_SSID), + (VOID *)pSsid, 0); + + StateMachineTouched = TRUE; + DBGPRINT(RT_DEBUG_TRACE, ("Set_SSID_Proc::(Len=%d,Ssid=%s)\n", Ssid.SsidLength, Ssid.Ssid)); + } + else + success = FALSE; + + if (StateMachineTouched) // Upper layer sent a MLME-related operations + RTMP_MLME_HANDLER(pAd); + + return success; +} + +#ifdef WMM_SUPPORT +/* + ========================================================================== + Description: + Set WmmCapable Enable or Disable + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_WmmCapable_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + BOOLEAN bWmmCapable; + + bWmmCapable = simple_strtol(arg, 0, 10); + + if ((bWmmCapable == 1) + ) + pAd->CommonCfg.bWmmCapable = TRUE; + else if (bWmmCapable == 0) + pAd->CommonCfg.bWmmCapable = FALSE; + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_WmmCapable_Proc::(bWmmCapable=%d)\n", + pAd->CommonCfg.bWmmCapable)); + + return TRUE; +} +#endif // WMM_SUPPORT // + +/* + ========================================================================== + Description: + Set Network Type(Infrastructure/Adhoc mode) + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_NetworkType_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT32 Value = 0; + + if (strcmp(arg, "Adhoc") == 0) + { + if (pAd->StaCfg.BssType != BSS_ADHOC) + { + // Config has changed + pAd->bConfigChanged = TRUE; + if (MONITOR_ON(pAd)) + { + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL); + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); + Value &= (~0x80); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + pAd->StaCfg.bAutoReconnect = TRUE; + LinkDown(pAd, FALSE); + } + if (INFRA_ON(pAd)) + { + //BOOLEAN Cancelled; + // Set the AutoReconnectSsid to prevent it reconnect to old SSID + // Since calling this indicate user don't want to connect to that SSID anymore. + pAd->MlmeAux.AutoReconnectSsidLen= 32; + NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); + + LinkDown(pAd, FALSE); + + DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event BB!\n")); + } + } + pAd->StaCfg.BssType = BSS_ADHOC; + pAd->net_dev->type = pAd->StaCfg.OriDevType; + DBGPRINT(RT_DEBUG_TRACE, ("===>Set_NetworkType_Proc::(AD-HOC)\n")); + } + else if (strcmp(arg, "Infra") == 0) + { + if (pAd->StaCfg.BssType != BSS_INFRA) + { + // Config has changed + pAd->bConfigChanged = TRUE; + if (MONITOR_ON(pAd)) + { + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, STANORMAL); + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); + Value &= (~0x80); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + pAd->StaCfg.bAutoReconnect = TRUE; + LinkDown(pAd, FALSE); + } + if (ADHOC_ON(pAd)) + { + // Set the AutoReconnectSsid to prevent it reconnect to old SSID + // Since calling this indicate user don't want to connect to that SSID anymore. + pAd->MlmeAux.AutoReconnectSsidLen= 32; + NdisZeroMemory(pAd->MlmeAux.AutoReconnectSsid, pAd->MlmeAux.AutoReconnectSsidLen); + + LinkDown(pAd, FALSE); + } + } + pAd->StaCfg.BssType = BSS_INFRA; + pAd->net_dev->type = pAd->StaCfg.OriDevType; + DBGPRINT(RT_DEBUG_TRACE, ("===>Set_NetworkType_Proc::(INFRA)\n")); + } + else if (strcmp(arg, "Monitor") == 0) + { + UCHAR bbpValue = 0; + BCN_TIME_CFG_STRUC csr; + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_INFRA_ON); + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADHOC_ON); + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + // disable all periodic state machine + pAd->StaCfg.bAutoReconnect = FALSE; + // reset all mlme state machine + RTMP_MLME_RESET_STATE_MACHINE(pAd); + DBGPRINT(RT_DEBUG_TRACE, ("fOP_STATUS_MEDIA_STATE_CONNECTED \n")); + if (pAd->CommonCfg.CentralChannel == 0) + { +#ifdef DOT11_N_SUPPORT + if (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) + pAd->CommonCfg.CentralChannel = 36; + else +#endif // DOT11_N_SUPPORT // + pAd->CommonCfg.CentralChannel = 6; + } +#ifdef DOT11_N_SUPPORT + else + N_ChannelCheck(pAd); +#endif // DOT11_N_SUPPORT // + +#ifdef DOT11_N_SUPPORT + if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED && + pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40 && + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE) + { + // 40MHz ,control channel at lower + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &bbpValue); + bbpValue &= (~0x18); + bbpValue |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, bbpValue); + pAd->CommonCfg.BBPCurrentBW = BW_40; + // RX : control channel at lower + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &bbpValue); + bbpValue &= (~0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbpValue); + + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value &= 0xfffffffe; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2; + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + DBGPRINT(RT_DEBUG_TRACE, ("BW_40 ,control_channel(%d), CentralChannel(%d) \n", + pAd->CommonCfg.Channel, + pAd->CommonCfg.CentralChannel)); + } + else if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED && + pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40 && + pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW) + { + // 40MHz ,control channel at upper + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &bbpValue); + bbpValue &= (~0x18); + bbpValue |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, bbpValue); + pAd->CommonCfg.BBPCurrentBW = BW_40; + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Value); + Value |= 0x1; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Value); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &bbpValue); + bbpValue |= (0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbpValue); + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2; + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + DBGPRINT(RT_DEBUG_TRACE, ("BW_40 ,control_channel(%d), CentralChannel(%d) \n", + pAd->CommonCfg.Channel, + pAd->CommonCfg.CentralChannel)); + } + else +#endif // DOT11_N_SUPPORT // + { + // 20MHz + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &bbpValue); + bbpValue &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, bbpValue); + pAd->CommonCfg.BBPCurrentBW = BW_20; + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + DBGPRINT(RT_DEBUG_TRACE, ("BW_20, Channel(%d)\n", pAd->CommonCfg.Channel)); + } + // Enable Rx with promiscuous reception + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, 0x3); + // ASIC supporsts sniffer function with replacing RSSI with timestamp. + //RTMP_IO_READ32(pAdapter, MAC_SYS_CTRL, &Value); + //Value |= (0x80); + //RTMP_IO_WRITE32(pAdapter, MAC_SYS_CTRL, Value); + // disable sync + RTMP_IO_READ32(pAd, BCN_TIME_CFG, &csr.word); + csr.field.bBeaconGen = 0; + csr.field.bTBTTEnable = 0; + csr.field.TsfSyncMode = 0; + RTMP_IO_WRITE32(pAd, BCN_TIME_CFG, csr.word); + + pAd->StaCfg.BssType = BSS_MONITOR; + pAd->net_dev->type = ARPHRD_IEEE80211_PRISM; //ARPHRD_IEEE80211; // IEEE80211 + DBGPRINT(RT_DEBUG_TRACE, ("===>Set_NetworkType_Proc::(MONITOR)\n")); + } + + // Reset Ralink supplicant to not use, it will be set to start when UI set PMK key + pAd->StaCfg.WpaState = SS_NOTUSE; + + DBGPRINT(RT_DEBUG_TRACE, ("Set_NetworkType_Proc::(NetworkType=%d)\n", pAd->StaCfg.BssType)); + + return TRUE; +} + +/* + ========================================================================== + Description: + Set Authentication mode + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_AuthMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if ((strcmp(arg, "WEPAUTO") == 0) || (strcmp(arg, "wepauto") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeAutoSwitch; + else if ((strcmp(arg, "OPEN") == 0) || (strcmp(arg, "open") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeOpen; + else if ((strcmp(arg, "SHARED") == 0) || (strcmp(arg, "shared") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeShared; + else if ((strcmp(arg, "WPAPSK") == 0) || (strcmp(arg, "wpapsk") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPAPSK; + else if ((strcmp(arg, "WPANONE") == 0) || (strcmp(arg, "wpanone") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPANone; + else if ((strcmp(arg, "WPA2PSK") == 0) || (strcmp(arg, "wpa2psk") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2PSK; +#ifdef WPA_SUPPLICANT_SUPPORT + else if ((strcmp(arg, "WPA") == 0) || (strcmp(arg, "wpa") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA; + else if ((strcmp(arg, "WPA2") == 0) || (strcmp(arg, "wpa2") == 0)) + pAd->StaCfg.AuthMode = Ndis802_11AuthModeWPA2; +#endif // WPA_SUPPLICANT_SUPPORT // + else + return FALSE; + + pAd->StaCfg.PortSecured = WPA_802_1X_PORT_NOT_SECURED; + + DBGPRINT(RT_DEBUG_TRACE, ("Set_AuthMode_Proc::(AuthMode=%d)\n", pAd->StaCfg.AuthMode)); + + return TRUE; +} + +/* + ========================================================================== + Description: + Set Encryption Type + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_EncrypType_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if ((strcmp(arg, "NONE") == 0) || (strcmp(arg, "none") == 0)) + { + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + return TRUE; // do nothing + + pAd->StaCfg.WepStatus = Ndis802_11WEPDisabled; + pAd->StaCfg.PairCipher = Ndis802_11WEPDisabled; + pAd->StaCfg.GroupCipher = Ndis802_11WEPDisabled; + } + else if ((strcmp(arg, "WEP") == 0) || (strcmp(arg, "wep") == 0)) + { + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + return TRUE; // do nothing + + pAd->StaCfg.WepStatus = Ndis802_11WEPEnabled; + pAd->StaCfg.PairCipher = Ndis802_11WEPEnabled; + pAd->StaCfg.GroupCipher = Ndis802_11WEPEnabled; + } + else if ((strcmp(arg, "TKIP") == 0) || (strcmp(arg, "tkip") == 0)) + { + if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA) + return TRUE; // do nothing + + pAd->StaCfg.WepStatus = Ndis802_11Encryption2Enabled; + pAd->StaCfg.PairCipher = Ndis802_11Encryption2Enabled; + pAd->StaCfg.GroupCipher = Ndis802_11Encryption2Enabled; + } + else if ((strcmp(arg, "AES") == 0) || (strcmp(arg, "aes") == 0)) + { + if (pAd->StaCfg.AuthMode < Ndis802_11AuthModeWPA) + return TRUE; // do nothing + + pAd->StaCfg.WepStatus = Ndis802_11Encryption3Enabled; + pAd->StaCfg.PairCipher = Ndis802_11Encryption3Enabled; + pAd->StaCfg.GroupCipher = Ndis802_11Encryption3Enabled; + } + else + return FALSE; + + pAd->StaCfg.OrigWepStatus = pAd->StaCfg.WepStatus; + + if (pAd->StaCfg.BssType == BSS_ADHOC) + { + // Build all corresponding channel information + RTMPSetPhyMode(pAd, pAd->CommonCfg.DesiredPhyMode); +#ifdef DOT11_N_SUPPORT + SetCommonHT(pAd); +#endif // DOT11_N_SUPPORT // + } + + DBGPRINT(RT_DEBUG_TRACE, ("Set_EncrypType_Proc::(EncrypType=%d)\n", pAd->StaCfg.WepStatus)); + + return TRUE; +} + +/* + ========================================================================== + Description: + Set Default Key ID + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_DefaultKeyID_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + ULONG KeyIdx; + + KeyIdx = simple_strtol(arg, 0, 10); + if((KeyIdx >= 1 ) && (KeyIdx <= 4)) + pAdapter->StaCfg.DefaultKeyId = (UCHAR) (KeyIdx - 1 ); + else + return FALSE; //Invalid argument + + DBGPRINT(RT_DEBUG_TRACE, ("Set_DefaultKeyID_Proc::(DefaultKeyID=%d)\n", pAdapter->StaCfg.DefaultKeyId)); + + return TRUE; +} + +/* + ========================================================================== + Description: + Set WEP KEY1 + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_Key1_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + int KeyLen; + int i; + UCHAR CipherAlg=CIPHER_WEP64; + + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + return TRUE; // do nothing + + KeyLen = strlen(arg); + + switch (KeyLen) + { + case 5: //wep 40 Ascii type + pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen; + memcpy(pAdapter->SharedKey[BSS0][0].Key, arg, KeyLen); + CipherAlg = CIPHER_WEP64; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::(Key1=%s and type=%s)\n", arg, "Ascii")); + break; + case 10: //wep 40 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(arg+i)) ) + return FALSE; //Not Hex value; + } + pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen / 2 ; + AtoH(arg, pAdapter->SharedKey[BSS0][0].Key, KeyLen / 2); + CipherAlg = CIPHER_WEP64; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::(Key1=%s and type=%s)\n", arg, "Hex")); + break; + case 13: //wep 104 Ascii type + pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen; + memcpy(pAdapter->SharedKey[BSS0][0].Key, arg, KeyLen); + CipherAlg = CIPHER_WEP128; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::(Key1=%s and type=%s)\n", arg, "Ascii")); + break; + case 26: //wep 104 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(arg+i)) ) + return FALSE; //Not Hex value; + } + pAdapter->SharedKey[BSS0][0].KeyLen = KeyLen / 2 ; + AtoH(arg, pAdapter->SharedKey[BSS0][0].Key, KeyLen / 2); + CipherAlg = CIPHER_WEP128; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::(Key1=%s and type=%s)\n", arg, "Hex")); + break; + default: //Invalid argument + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key1_Proc::Invalid argument (=%s)\n", arg)); + return FALSE; + } + + pAdapter->SharedKey[BSS0][0].CipherAlg = CipherAlg; + + // Set keys (into ASIC) + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + ; // not support + else // Old WEP stuff + { + AsicAddSharedKeyEntry(pAdapter, + 0, + 0, + &pAdapter->SharedKey[BSS0][0]); + } + + return TRUE; +} +/* + ========================================================================== + + Description: + Set WEP KEY2 + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_Key2_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + int KeyLen; + int i; + UCHAR CipherAlg=CIPHER_WEP64; + + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + return TRUE; // do nothing + + KeyLen = strlen(arg); + + switch (KeyLen) + { + case 5: //wep 40 Ascii type + pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen; + memcpy(pAdapter->SharedKey[BSS0][1].Key, arg, KeyLen); + CipherAlg = CIPHER_WEP64; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::(Key2=%s and type=%s)\n", arg, "Ascii")); + break; + case 10: //wep 40 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(arg+i)) ) + return FALSE; //Not Hex value; + } + pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen / 2 ; + AtoH(arg, pAdapter->SharedKey[BSS0][1].Key, KeyLen / 2); + CipherAlg = CIPHER_WEP64; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::(Key2=%s and type=%s)\n", arg, "Hex")); + break; + case 13: //wep 104 Ascii type + pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen; + memcpy(pAdapter->SharedKey[BSS0][1].Key, arg, KeyLen); + CipherAlg = CIPHER_WEP128; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::(Key2=%s and type=%s)\n", arg, "Ascii")); + break; + case 26: //wep 104 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(arg+i)) ) + return FALSE; //Not Hex value; + } + pAdapter->SharedKey[BSS0][1].KeyLen = KeyLen / 2 ; + AtoH(arg, pAdapter->SharedKey[BSS0][1].Key, KeyLen / 2); + CipherAlg = CIPHER_WEP128; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::(Key2=%s and type=%s)\n", arg, "Hex")); + break; + default: //Invalid argument + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key2_Proc::Invalid argument (=%s)\n", arg)); + return FALSE; + } + pAdapter->SharedKey[BSS0][1].CipherAlg = CipherAlg; + + // Set keys (into ASIC) + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + ; // not support + else // Old WEP stuff + { + AsicAddSharedKeyEntry(pAdapter, + 0, + 1, + &pAdapter->SharedKey[BSS0][1]); + } + + return TRUE; +} +/* + ========================================================================== + Description: + Set WEP KEY3 + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_Key3_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + int KeyLen; + int i; + UCHAR CipherAlg=CIPHER_WEP64; + + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + return TRUE; // do nothing + + KeyLen = strlen(arg); + + switch (KeyLen) + { + case 5: //wep 40 Ascii type + pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen; + memcpy(pAdapter->SharedKey[BSS0][2].Key, arg, KeyLen); + CipherAlg = CIPHER_WEP64; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::(Key3=%s and type=Ascii)\n", arg)); + break; + case 10: //wep 40 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(arg+i)) ) + return FALSE; //Not Hex value; + } + pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen / 2 ; + AtoH(arg, pAdapter->SharedKey[BSS0][2].Key, KeyLen / 2); + CipherAlg = CIPHER_WEP64; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::(Key3=%s and type=Hex)\n", arg)); + break; + case 13: //wep 104 Ascii type + pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen; + memcpy(pAdapter->SharedKey[BSS0][2].Key, arg, KeyLen); + CipherAlg = CIPHER_WEP128; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::(Key3=%s and type=Ascii)\n", arg)); + break; + case 26: //wep 104 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(arg+i)) ) + return FALSE; //Not Hex value; + } + pAdapter->SharedKey[BSS0][2].KeyLen = KeyLen / 2 ; + AtoH(arg, pAdapter->SharedKey[BSS0][2].Key, KeyLen / 2); + CipherAlg = CIPHER_WEP128; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::(Key3=%s and type=Hex)\n", arg)); + break; + default: //Invalid argument + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key3_Proc::Invalid argument (=%s)\n", arg)); + return FALSE; + } + pAdapter->SharedKey[BSS0][2].CipherAlg = CipherAlg; + + // Set keys (into ASIC) + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + ; // not support + else // Old WEP stuff + { + AsicAddSharedKeyEntry(pAdapter, + 0, + 2, + &pAdapter->SharedKey[BSS0][2]); + } + + return TRUE; +} +/* + ========================================================================== + Description: + Set WEP KEY4 + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_Key4_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + int KeyLen; + int i; + UCHAR CipherAlg=CIPHER_WEP64; + + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + return TRUE; // do nothing + + KeyLen = strlen(arg); + + switch (KeyLen) + { + case 5: //wep 40 Ascii type + pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen; + memcpy(pAdapter->SharedKey[BSS0][3].Key, arg, KeyLen); + CipherAlg = CIPHER_WEP64; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::(Key4=%s and type=%s)\n", arg, "Ascii")); + break; + case 10: //wep 40 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(arg+i)) ) + return FALSE; //Not Hex value; + } + pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen / 2 ; + AtoH(arg, pAdapter->SharedKey[BSS0][3].Key, KeyLen / 2); + CipherAlg = CIPHER_WEP64; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::(Key4=%s and type=%s)\n", arg, "Hex")); + break; + case 13: //wep 104 Ascii type + pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen; + memcpy(pAdapter->SharedKey[BSS0][3].Key, arg, KeyLen); + CipherAlg = CIPHER_WEP128; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::(Key4=%s and type=%s)\n", arg, "Ascii")); + break; + case 26: //wep 104 Hex type + for(i=0; i < KeyLen; i++) + { + if( !isxdigit(*(arg+i)) ) + return FALSE; //Not Hex value; + } + pAdapter->SharedKey[BSS0][3].KeyLen = KeyLen / 2 ; + AtoH(arg, pAdapter->SharedKey[BSS0][3].Key, KeyLen / 2); + CipherAlg = CIPHER_WEP128; + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::(Key4=%s and type=%s)\n", arg, "Hex")); + break; + default: //Invalid argument + DBGPRINT(RT_DEBUG_TRACE, ("Set_Key4_Proc::Invalid argument (=%s)\n", arg)); + return FALSE; + } + pAdapter->SharedKey[BSS0][3].CipherAlg = CipherAlg; + + // Set keys (into ASIC) + if (pAdapter->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + ; // not support + else // Old WEP stuff + { + AsicAddSharedKeyEntry(pAdapter, + 0, + 3, + &pAdapter->SharedKey[BSS0][3]); + } + + return TRUE; +} + +/* + ========================================================================== + Description: + Set WPA PSK key + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_WPAPSK_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + int status; + + if ((pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPAPSK) && + (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPA2PSK) && + (pAd->StaCfg.AuthMode != Ndis802_11AuthModeWPANone) + ) + return TRUE; // do nothing + + DBGPRINT(RT_DEBUG_TRACE, ("Set_WPAPSK_Proc::(WPAPSK=%s)\n", arg)); + + status = RT_CfgSetWPAPSKKey(pAd, arg, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, pAd->StaCfg.PMK); + if (status == FALSE) + { + DBGPRINT(RT_DEBUG_TRACE, ("Set_WPAPSK_Proc(): Set key failed!\n")); + return FALSE; + } + NdisZeroMemory(pAd->StaCfg.WpaPassPhrase, 64); + NdisMoveMemory(pAd->StaCfg.WpaPassPhrase, arg, strlen(arg)); + pAd->StaCfg.WpaPassPhraseLen = (UINT)strlen(arg); + + + + if(pAd->StaCfg.BssType == BSS_ADHOC && + pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) + { + pAd->StaCfg.WpaState = SS_NOTUSE; + } + else + { + // Start STA supplicant state machine + pAd->StaCfg.WpaState = SS_START; + } + + return TRUE; +} + +/* + ========================================================================== + Description: + Set Power Saving mode + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_PSMode_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + if (pAdapter->StaCfg.BssType == BSS_INFRA) + { + if ((strcmp(arg, "Max_PSP") == 0) || + (strcmp(arg, "max_psp") == 0) || + (strcmp(arg, "MAX_PSP") == 0)) + { + // do NOT turn on PSM bit here, wait until MlmeCheckPsmChange() + // to exclude certain situations. + if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE) + pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeMAX_PSP; + pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeMAX_PSP; + OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM); + pAdapter->StaCfg.DefaultListenCount = 5; + + } + else if ((strcmp(arg, "Fast_PSP") == 0) || + (strcmp(arg, "fast_psp") == 0) || + (strcmp(arg, "FAST_PSP") == 0)) + { + // do NOT turn on PSM bit here, wait until MlmeCheckPsmChange() + // to exclude certain situations. + OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM); + if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE) + pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeFast_PSP; + pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeFast_PSP; + pAdapter->StaCfg.DefaultListenCount = 3; + } + else if ((strcmp(arg, "Legacy_PSP") == 0) || + (strcmp(arg, "legacy_psp") == 0) || + (strcmp(arg, "LEGACY_PSP") == 0)) + { + // do NOT turn on PSM bit here, wait until MlmeCheckPsmChange() + // to exclude certain situations. + OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM); + if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE) + pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeLegacy_PSP; + pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeLegacy_PSP; + pAdapter->StaCfg.DefaultListenCount = 3; + } + else + { + //Default Ndis802_11PowerModeCAM + // clear PSM bit immediately + RTMP_SET_PSM_BIT(pAdapter, PWR_ACTIVE); + OPSTATUS_SET_FLAG(pAdapter, fOP_STATUS_RECEIVE_DTIM); + if (pAdapter->StaCfg.bWindowsACCAMEnable == FALSE) + pAdapter->StaCfg.WindowsPowerMode = Ndis802_11PowerModeCAM; + pAdapter->StaCfg.WindowsBatteryPowerMode = Ndis802_11PowerModeCAM; + } + + DBGPRINT(RT_DEBUG_TRACE, ("Set_PSMode_Proc::(PSMode=%ld)\n", pAdapter->StaCfg.WindowsPowerMode)); + } + else + return FALSE; + + + return TRUE; +} + +#ifdef WPA_SUPPLICANT_SUPPORT +/* + ========================================================================== + Description: + Set WpaSupport flag. + Value: + 0: Driver ignore wpa_supplicant. + 1: wpa_supplicant initiates scanning and AP selection. + 2: driver takes care of scanning, AP selection, and IEEE 802.11 association parameters. + Return: + TRUE if all parameters are OK, FALSE otherwise + ========================================================================== +*/ +INT Set_Wpa_Support( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + + if ( simple_strtol(arg, 0, 10) == 0) + pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE; + else if ( simple_strtol(arg, 0, 10) == 1) + pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE; + else if ( simple_strtol(arg, 0, 10) == 2) + pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_ENABLE_WITH_WEB_UI; + else + pAd->StaCfg.WpaSupplicantUP = WPA_SUPPLICANT_DISABLE; + + DBGPRINT(RT_DEBUG_TRACE, ("Set_Wpa_Support::(WpaSupplicantUP=%d)\n", pAd->StaCfg.WpaSupplicantUP)); + + return TRUE; +} +#endif // WPA_SUPPLICANT_SUPPORT // + + + + +INT Set_TGnWifiTest_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if (simple_strtol(arg, 0, 10) == 0) + pAd->StaCfg.bTGnWifiTest = FALSE; + else + pAd->StaCfg.bTGnWifiTest = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_TGnWifiTest_Proc::(bTGnWifiTest=%d)\n", pAd->StaCfg.bTGnWifiTest)); + return TRUE; +} + +#ifdef EXT_BUILD_CHANNEL_LIST +INT Set_Ieee80211dClientMode_Proc( + IN PRTMP_ADAPTER pAdapter, + IN PSTRING arg) +{ + if (simple_strtol(arg, 0, 10) == 0) + pAdapter->StaCfg.IEEE80211dClientMode = Rt802_11_D_None; + else if (simple_strtol(arg, 0, 10) == 1) + pAdapter->StaCfg.IEEE80211dClientMode = Rt802_11_D_Flexible; + else if (simple_strtol(arg, 0, 10) == 2) + pAdapter->StaCfg.IEEE80211dClientMode = Rt802_11_D_Strict; + else + return FALSE; + + DBGPRINT(RT_DEBUG_TRACE, ("Set_Ieee802dMode_Proc::(IEEEE0211dMode=%d)\n", pAdapter->StaCfg.IEEE80211dClientMode)); + return TRUE; +} +#endif // EXT_BUILD_CHANNEL_LIST // + +#ifdef CARRIER_DETECTION_SUPPORT +INT Set_CarrierDetect_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if (simple_strtol(arg, 0, 10) == 0) + pAd->CommonCfg.CarrierDetect.Enable = FALSE; + else + pAd->CommonCfg.CarrierDetect.Enable = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_CarrierDetect_Proc::(CarrierDetect.Enable=%d)\n", pAd->CommonCfg.CarrierDetect.Enable)); + return TRUE; +} +#endif // CARRIER_DETECTION_SUPPORT // + + +INT Show_Adhoc_MacTable_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING extra) +{ + INT i; + + sprintf(extra, "\n"); + +#ifdef DOT11_N_SUPPORT + sprintf(extra, "%sHT Operating Mode : %d\n", extra, pAd->CommonCfg.AddHTInfo.AddHtInfo2.OperaionMode); +#endif // DOT11_N_SUPPORT // + + sprintf(extra, "%s\n%-19s%-4s%-4s%-7s%-7s%-7s%-10s%-6s%-6s%-6s%-6s\n", extra, + "MAC", "AID", "BSS", "RSSI0", "RSSI1", "RSSI2", "PhMd", "BW", "MCS", "SGI", "STBC"); + + for (i=1; i<MAX_LEN_OF_MAC_TABLE; i++) + { + PMAC_TABLE_ENTRY pEntry = &pAd->MacTab.Content[i]; + + if (strlen(extra) > (IW_PRIV_SIZE_MASK - 30)) + break; + if ((IS_ENTRY_CLIENT(pEntry) || IS_ENTRY_APCLI(pEntry)) && (pEntry->Sst == SST_ASSOC)) + { + sprintf(extra, "%s%02X:%02X:%02X:%02X:%02X:%02X ", extra, + pEntry->Addr[0], pEntry->Addr[1], pEntry->Addr[2], + pEntry->Addr[3], pEntry->Addr[4], pEntry->Addr[5]); + sprintf(extra, "%s%-4d", extra, (int)pEntry->Aid); + sprintf(extra, "%s%-4d", extra, (int)pEntry->apidx); + sprintf(extra, "%s%-7d", extra, pEntry->RssiSample.AvgRssi0); + sprintf(extra, "%s%-7d", extra, pEntry->RssiSample.AvgRssi1); + sprintf(extra, "%s%-7d", extra, pEntry->RssiSample.AvgRssi2); + sprintf(extra, "%s%-10s", extra, GetPhyMode(pEntry->HTPhyMode.field.MODE)); + sprintf(extra, "%s%-6s", extra, GetBW(pEntry->HTPhyMode.field.BW)); + sprintf(extra, "%s%-6d", extra, pEntry->HTPhyMode.field.MCS); + sprintf(extra, "%s%-6d", extra, pEntry->HTPhyMode.field.ShortGI); + sprintf(extra, "%s%-6d", extra, pEntry->HTPhyMode.field.STBC); + sprintf(extra, "%s%-10d, %d, %d%%\n", extra, pEntry->DebugFIFOCount, pEntry->DebugTxCount, + (pEntry->DebugTxCount) ? ((pEntry->DebugTxCount-pEntry->DebugFIFOCount)*100/pEntry->DebugTxCount) : 0); + sprintf(extra, "%s\n", extra); + } + } + + return TRUE; +} + + +INT Set_BeaconLostTime_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + ULONG ltmp = (ULONG)simple_strtol(arg, 0, 10); + + if ((ltmp != 0) && (ltmp <= 60)) + pAd->StaCfg.BeaconLostTime = (ltmp * OS_HZ); + + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_BeaconLostTime_Proc::(BeaconLostTime=%ld)\n", pAd->StaCfg.BeaconLostTime)); + return TRUE; +} + +INT Set_AutoRoaming_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if (simple_strtol(arg, 0, 10) == 0) + pAd->StaCfg.bAutoRoaming = FALSE; + else + pAd->StaCfg.bAutoRoaming = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_AutoRoaming_Proc::(bAutoRoaming=%d)\n", pAd->StaCfg.bAutoRoaming)); + return TRUE; +} + + +/* + ========================================================================== + Description: + Issue a site survey command to driver + Arguments: + pAdapter Pointer to our adapter + wrq Pointer to the ioctl argument + + Return Value: + None + + Note: + Usage: + 1.) iwpriv ra0 set site_survey + ========================================================================== +*/ +INT Set_SiteSurvey_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + NDIS_802_11_SSID Ssid; + + //check if the interface is down + if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) + { + DBGPRINT(RT_DEBUG_TRACE, ("INFO::Network is down!\n")); + return -ENETDOWN; + } + + if (MONITOR_ON(pAd)) + { + DBGPRINT(RT_DEBUG_TRACE, ("!!! Driver is in Monitor Mode now !!!\n")); + return -EINVAL; + } + + RTMPZeroMemory(&Ssid, sizeof(NDIS_802_11_SSID)); + Ssid.SsidLength = 0; + if ((arg != NULL) && + (strlen(arg) <= MAX_LEN_OF_SSID)) + { + RTMPMoveMemory(Ssid.Ssid, arg, strlen(arg)); + Ssid.SsidLength = strlen(arg); + } + + pAd->StaCfg.bScanReqIsFromWebUI = TRUE; + + if (pAd->Mlme.CntlMachine.CurrState != CNTL_IDLE) + { + RTMP_MLME_RESET_STATE_MACHINE(pAd); + DBGPRINT(RT_DEBUG_TRACE, ("!!! MLME busy, reset MLME state machine !!!\n")); + } + + // tell CNTL state machine to call NdisMSetInformationComplete() after completing + // this request, because this request is initiated by NDIS. + pAd->MlmeAux.CurrReqIsFromNdis = FALSE; + // Reset allowed scan retries + pAd->StaCfg.ScanCnt = 0; + + NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime); + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_BSSID_LIST_SCAN, + Ssid.SsidLength, + Ssid.Ssid, 0); + RTMP_MLME_HANDLER(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("Set_SiteSurvey_Proc\n")); + + return TRUE; +} + +INT Set_ForceTxBurst_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if (simple_strtol(arg, 0, 10) == 0) + pAd->StaCfg.bForceTxBurst = FALSE; + else + pAd->StaCfg.bForceTxBurst = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_ForceTxBurst_Proc::(bForceTxBurst=%d)\n", pAd->StaCfg.bForceTxBurst)); + return TRUE; +} + + +#ifdef XLINK_SUPPORT +INT Set_XlinkMode_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + UINT32 Value = 0; + + if (simple_strtol(arg, 0, 10) == 0) + pAd->StaCfg.PSPXlink = 0; + else + pAd->StaCfg.PSPXlink = 1; + + if (pAd->StaCfg.PSPXlink) + Value = PSPXLINK; + else + Value = STANORMAL; + RTMP_IO_WRITE32(pAd, RX_FILTR_CFG, Value); + Value = 0; + RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value); + Value &= (~0x80); + RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value); + + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_XlinkMode_Proc::(PSPXlink=%d)\n", pAd->StaCfg.PSPXlink)); + return TRUE; +} +#endif // XLINK_SUPPORT // + + +VOID RTMPAddKey( + IN PRTMP_ADAPTER pAd, + IN PNDIS_802_11_KEY pKey) +{ + ULONG KeyIdx; + MAC_TABLE_ENTRY *pEntry; + + DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey ------>\n")); + + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA) + { + if (pKey->KeyIndex & 0x80000000) + { + if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) + { + NdisZeroMemory(pAd->StaCfg.PMK, 32); + NdisMoveMemory(pAd->StaCfg.PMK, pKey->KeyMaterial, pKey->KeyLength); + goto end; + } + // Update PTK + NdisZeroMemory(&pAd->SharedKey[BSS0][0], sizeof(CIPHER_KEY)); + pAd->SharedKey[BSS0][0].KeyLen = LEN_TK; + NdisMoveMemory(pAd->SharedKey[BSS0][0].Key, pKey->KeyMaterial, LEN_TK); +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) + { + NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC); + NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC); + } + else +#endif // WPA_SUPPLICANT_SUPPORT // + { + NdisMoveMemory(pAd->SharedKey[BSS0][0].TxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC); + NdisMoveMemory(pAd->SharedKey[BSS0][0].RxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC); + } + + // Decide its ChiperAlg + if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) + pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_TKIP; + else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled) + pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_AES; + else + pAd->SharedKey[BSS0][0].CipherAlg = CIPHER_NONE; + + // Update these related information to MAC_TABLE_ENTRY + pEntry = &pAd->MacTab.Content[BSSID_WCID]; + NdisMoveMemory(pEntry->PairwiseKey.Key, pAd->SharedKey[BSS0][0].Key, LEN_TK); + NdisMoveMemory(pEntry->PairwiseKey.RxMic, pAd->SharedKey[BSS0][0].RxMic, LEN_TKIP_MIC); + NdisMoveMemory(pEntry->PairwiseKey.TxMic, pAd->SharedKey[BSS0][0].TxMic, LEN_TKIP_MIC); + pEntry->PairwiseKey.CipherAlg = pAd->SharedKey[BSS0][0].CipherAlg; + + // Update pairwise key information to ASIC Shared Key Table + AsicAddSharedKeyEntry(pAd, + BSS0, + 0, + &pAd->SharedKey[BSS0][0]); + + // Update ASIC WCID attribute table and IVEIV table + RTMPSetWcidSecurityInfo(pAd, + BSS0, + 0, + pAd->SharedKey[BSS0][0].CipherAlg, + BSSID_WCID, + SHAREDKEYTABLE); + + if (pAd->StaCfg.AuthMode >= Ndis802_11AuthModeWPA2) + { + // set 802.1x port control + //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAd); + + // Indicate Connected for GUI + pAd->IndicateMediaState = NdisMediaStateConnected; + } + } + else + { + // Update GTK + pAd->StaCfg.DefaultKeyId = (pKey->KeyIndex & 0xFF); + NdisZeroMemory(&pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId], sizeof(CIPHER_KEY)); + pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].KeyLen = LEN_TK; + NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].Key, pKey->KeyMaterial, LEN_TK); +#ifdef WPA_SUPPLICANT_SUPPORT + if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled) + { + NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC); + NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC); + } + else +#endif // WPA_SUPPLICANT_SUPPORT // + { + NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].TxMic, pKey->KeyMaterial + LEN_TK, LEN_TKIP_MIC); + NdisMoveMemory(pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].RxMic, pKey->KeyMaterial + LEN_TK + LEN_TKIP_MIC, LEN_TKIP_MIC); + } + + // Update Shared Key CipherAlg + pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_NONE; + if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled) + pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_TKIP; + else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled) + pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId].CipherAlg = CIPHER_AES; + + // Update group key information to ASIC Shared Key Table + AsicAddSharedKeyEntry(pAd, + BSS0, + pAd->StaCfg.DefaultKeyId, + &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId]); + + /* STA doesn't need to set WCID attribute for group key */ + + // set 802.1x port control + //pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED; + STA_PORT_SECURED(pAd); + + // Indicate Connected for GUI + pAd->IndicateMediaState = NdisMediaStateConnected; + } + } + else // dynamic WEP from wpa_supplicant + { + UCHAR CipherAlg; + PUCHAR Key; + + if(pKey->KeyLength == 32) + goto end; + + KeyIdx = pKey->KeyIndex & 0x0fffffff; + + if (KeyIdx < 4) + { + // it is a default shared key, for Pairwise key setting + if (pKey->KeyIndex & 0x80000000) + { + pEntry = MacTableLookup(pAd, pKey->BSSID); + + if (pEntry) + { + DBGPRINT(RT_DEBUG_TRACE, ("RTMPAddKey: Set Pair-wise Key\n")); + + // set key material and key length + pEntry->PairwiseKey.KeyLen = (UCHAR)pKey->KeyLength; + NdisMoveMemory(pEntry->PairwiseKey.Key, &pKey->KeyMaterial, pKey->KeyLength); + + // set Cipher type + if (pKey->KeyLength == 5) + pEntry->PairwiseKey.CipherAlg = CIPHER_WEP64; + else + pEntry->PairwiseKey.CipherAlg = CIPHER_WEP128; + + // Add Pair-wise key to Asic + AsicAddPairwiseKeyEntry( + pAd, + (UCHAR)pEntry->Aid, + &pEntry->PairwiseKey); + + // update WCID attribute table and IVEIV table for this entry + RTMPSetWcidSecurityInfo(pAd, + BSS0, + KeyIdx, + pEntry->PairwiseKey.CipherAlg, + pEntry->Aid, + PAIRWISEKEYTABLE); + } + } + else + { + // Default key for tx (shared key) + pAd->StaCfg.DefaultKeyId = (UCHAR) KeyIdx; + + // set key material and key length + pAd->SharedKey[BSS0][KeyIdx].KeyLen = (UCHAR) pKey->KeyLength; + NdisMoveMemory(pAd->SharedKey[BSS0][KeyIdx].Key, &pKey->KeyMaterial, pKey->KeyLength); + + // Set Ciper type + if (pKey->KeyLength == 5) + pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_WEP64; + else + pAd->SharedKey[BSS0][KeyIdx].CipherAlg = CIPHER_WEP128; + + CipherAlg = pAd->SharedKey[BSS0][KeyIdx].CipherAlg; + Key = pAd->SharedKey[BSS0][KeyIdx].Key; + + // Set Group key material to Asic + AsicAddSharedKeyEntry(pAd, BSS0, KeyIdx, &pAd->SharedKey[BSS0][KeyIdx]); + + /* STA doesn't need to set WCID attribute for group key */ + } + } + } +end: + return; +} + + + +/* + ========================================================================== + Description: + Site survey entry point + + NOTE: + ========================================================================== +*/ +VOID StaSiteSurvey( + IN PRTMP_ADAPTER pAd, + IN PNDIS_802_11_SSID pSsid, + IN UCHAR ScanType) +{ + MLME_SCAN_REQ_STRUCT ScanReq; + + NdisGetSystemUpTime(&pAd->StaCfg.LastScanTime); + + BssTableInit(&pAd->ScanTab); + // Prepare Scan parameters and enqueue the MLME command + if (pSsid) + ScanParmFill(pAd, &ScanReq, pSsid->Ssid, pSsid->SsidLength, BSS_ANY, ScanType); + else + ScanParmFill(pAd, &ScanReq, "", 0, BSS_ANY, ScanType); + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq, 0); + RTMP_MLME_HANDLER(pAd); +} + +INT Set_AutoReconnect_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if (simple_strtol(arg, 0, 10) == 0) + pAd->StaCfg.bAutoReconnect = FALSE; + else + pAd->StaCfg.bAutoReconnect = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_AutoReconnect_Proc::(bAdhocN=%d)\n", pAd->StaCfg.bAutoReconnect)); + return TRUE; +} + +INT Set_AdhocN_Proc( + IN PRTMP_ADAPTER pAd, + IN PSTRING arg) +{ + if (simple_strtol(arg, 0, 10) == 0) + pAd->StaCfg.bAdhocN = FALSE; + else + pAd->StaCfg.bAdhocN = TRUE; + + DBGPRINT(RT_DEBUG_TRACE, ("IF Set_AdhocN_Proc::(bAdhocN=%d)\n", pAd->StaCfg.bAdhocN)); + return TRUE; +} +/* End of sta_cfg.c */ diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sync.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sync.c new file mode 100644 index 000000000..513705abb --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/sync.c @@ -0,0 +1,2286 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + sync.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + John Chang 2004-09-01 modified for rt2561/2661 + Jan Lee 2006-08-01 modified for rt2860 for 802.11n +*/ +#include "rt_config.h" + + +#define ADHOC_ENTRY_BEACON_LOST_TIME (2*OS_HZ) // 2 sec + +/* + ========================================================================== + Description: + The sync state machine, + Parameters: + Sm - pointer to the state machine + Note: + the state machine looks like the following + + ========================================================================== + */ +VOID SyncStateMachineInit( + IN PRTMP_ADAPTER pAd, + IN STATE_MACHINE *Sm, + OUT STATE_MACHINE_FUNC Trans[]) +{ + StateMachineInit(Sm, Trans, MAX_SYNC_STATE, MAX_SYNC_MSG, (STATE_MACHINE_FUNC)Drop, SYNC_IDLE, SYNC_MACHINE_BASE); + + // column 1 + StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)MlmeScanReqAction); + StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)MlmeJoinReqAction); + StateMachineSetAction(Sm, SYNC_IDLE, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)MlmeStartReqAction); + StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeacon); + StateMachineSetAction(Sm, SYNC_IDLE, MT2_PEER_PROBE_REQ, (STATE_MACHINE_FUNC)PeerProbeReqAction); + + //column 2 + StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenScan); + StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenJoin); + StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenStart); + StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeaconAtJoinAction); + StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_BEACON_TIMEOUT, (STATE_MACHINE_FUNC)BeaconTimeoutAtJoinAction); + StateMachineSetAction(Sm, JOIN_WAIT_BEACON, MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction); + + // column 3 + StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_SCAN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenScan); + StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_JOIN_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenJoin); + StateMachineSetAction(Sm, SCAN_LISTEN, MT2_MLME_START_REQ, (STATE_MACHINE_FUNC)InvalidStateWhenStart); + StateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_BEACON, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction); + StateMachineSetAction(Sm, SCAN_LISTEN, MT2_PEER_PROBE_RSP, (STATE_MACHINE_FUNC)PeerBeaconAtScanAction); + StateMachineSetAction(Sm, SCAN_LISTEN, MT2_SCAN_TIMEOUT, (STATE_MACHINE_FUNC)ScanTimeoutAction); + + // timer init + RTMPInitTimer(pAd, &pAd->MlmeAux.BeaconTimer, GET_TIMER_FUNCTION(BeaconTimeout), pAd, FALSE); + RTMPInitTimer(pAd, &pAd->MlmeAux.ScanTimer, GET_TIMER_FUNCTION(ScanTimeout), pAd, FALSE); +} + +/* + ========================================================================== + Description: + Beacon timeout handler, executed in timer thread + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID BeaconTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + + DBGPRINT(RT_DEBUG_TRACE,("SYNC - BeaconTimeout\n")); + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) + return; + +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.BBPCurrentBW == BW_40) + ) + { + UCHAR BBPValue = 0; + AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue &= (~0x18); + BBPValue |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - End of SCAN, restore to 40MHz channel %d, Total BSS[%02d]\n",pAd->CommonCfg.CentralChannel, pAd->ScanTab.BssNr)); + } +#endif // DOT11_N_SUPPORT // + + MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL, 0); + RTMP_MLME_HANDLER(pAd); +} + +/* + ========================================================================== + Description: + Scan timeout handler, executed in timer thread + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID ScanTimeout( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext; + + + // Do nothing if the driver is starting halt state. + // This might happen when timer already been fired before cancel timer with mlmehalt + if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) + return; + + if (MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL, 0)) + { + RTMP_MLME_HANDLER(pAd); +} + else + { + // To prevent SyncMachine.CurrState is SCAN_LISTEN forever. + pAd->MlmeAux.Channel = 0; + ScanNextChannel(pAd); + RTMPSendWirelessEvent(pAd, IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG, NULL, BSS0, 0); + + } +} + +/* + ========================================================================== + Description: + MLME SCAN req state machine procedure + ========================================================================== + */ +VOID MlmeScanReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, ScanType, BssType, BBPValue = 0; + BOOLEAN TimerCancelled; + ULONG Now; + USHORT Status; + PHEADER_802_11 pHdr80211; + PUCHAR pOutBuffer = NULL; + NDIS_STATUS NStatus; + + // Check the total scan tries for one single OID command + // If this is the CCX 2.0 Case, skip that! + if ( !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_START_UP)) + { + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeScanReqAction before Startup\n")); + return; + } + + // Increase the scan retry counters. + pAd->StaCfg.ScanCnt++; + +#ifdef PCIE_PS_SUPPORT + if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && + (IDLE_ON(pAd)) && + (pAd->StaCfg.bRadio == TRUE) && + (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) + { + if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE) + { + AsicSendCommandToMcu(pAd, 0x31, PowerWakeCID, 0x00, 0x02); + AsicCheckCommanOk(pAd, PowerWakeCID); + RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF); + DBGPRINT(RT_DEBUG_TRACE, ("PSM - Issue Wake up command \n")); + } + else + { + RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); + } + } +#endif // PCIE_PS_SUPPORT // + + // first check the parameter sanity + if (MlmeScanReqSanity(pAd, + Elem->Msg, + Elem->MsgLen, + &BssType, + (PCHAR)Ssid, + &SsidLen, + &ScanType)) + { + + // Check for channel load and noise hist request + // Suspend MSDU only at scan request, not the last two mentioned + // Suspend MSDU transmission here + RTMPSuspendMsduTransmission(pAd); + + // + // To prevent data lost. + // Send an NULL data with turned PSM bit on to current associated AP before SCAN progress. + // And should send an NULL data with turned PSM bit off to AP, when scan progress done + // + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) && (INFRA_ON(pAd))) + { + NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); + if (NStatus == NDIS_STATUS_SUCCESS) + { + pHdr80211 = (PHEADER_802_11) pOutBuffer; + MgtMacHeaderInit(pAd, pHdr80211, SUBTYPE_NULL_FUNC, 1, pAd->CommonCfg.Bssid, pAd->CommonCfg.Bssid); + pHdr80211->Duration = 0; + pHdr80211->FC.Type = BTYPE_DATA; + pHdr80211->FC.PwrMgmt = PWR_SAVE; + + // Send using priority queue + MiniportMMRequest(pAd, 0, pOutBuffer, sizeof(HEADER_802_11)); + DBGPRINT(RT_DEBUG_TRACE, ("MlmeScanReqAction -- Send PSM Data frame for off channel RM, SCAN_IN_PROGRESS=%d!\n", + RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))); + MlmeFreeMemory(pAd, pOutBuffer); + OS_WAIT(20); + } + } + + RTMPSendWirelessEvent(pAd, IW_SCANNING_EVENT_FLAG, NULL, BSS0, 0); + + NdisGetSystemUpTime(&Now); + pAd->StaCfg.LastScanTime = Now; + // reset all the timers + RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled); + RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); + + // record desired BSS parameters + pAd->MlmeAux.BssType = BssType; + pAd->MlmeAux.ScanType = ScanType; + pAd->MlmeAux.SsidLen = SsidLen; + NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); + NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); + + // start from the first channel + pAd->MlmeAux.Channel = FirstChannel(pAd); + + // Let BBP register at 20MHz to do scan + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BBP R4 to 20MHz.l\n")); +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + // Before scan, reset trigger event table. + TriEventInit(pAd); +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + ScanNextChannel(pAd); + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; + } + else + { + DBGPRINT_ERR(("SYNC - MlmeScanReqAction() sanity check fail\n")); + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_INVALID_FORMAT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0); + } +} + +/* + ========================================================================== + Description: + MLME JOIN req state machine procedure + ========================================================================== + */ +VOID MlmeJoinReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR BBPValue = 0; + BSS_ENTRY *pBss; + BOOLEAN TimerCancelled; + HEADER_802_11 Hdr80211; + NDIS_STATUS NStatus; + ULONG FrameLen = 0; + PUCHAR pOutBuffer = NULL; + PUCHAR pSupRate = NULL; + UCHAR SupRateLen; + PUCHAR pExtRate = NULL; + UCHAR ExtRateLen; + UCHAR ASupRate[] = {0x8C, 0x12, 0x98, 0x24, 0xb0, 0x48, 0x60, 0x6C}; + UCHAR ASupRateLen = sizeof(ASupRate)/sizeof(UCHAR); + MLME_JOIN_REQ_STRUCT *pInfo = (MLME_JOIN_REQ_STRUCT *)(Elem->Msg); + + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeJoinReqAction(BSS #%ld)\n", pInfo->BssIdx)); + +#ifdef PCIE_PS_SUPPORT + if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) && + (IDLE_ON(pAd)) && + (pAd->StaCfg.bRadio == TRUE) && + (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_IDLE_RADIO_OFF))) + { + RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE); + } +#endif // PCIE_PS_SUPPORT // + + // reset all the timers + RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); + RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled); + + pBss = &pAd->MlmeAux.SsidBssTab.BssEntry[pInfo->BssIdx]; + + // record the desired SSID & BSSID we're waiting for + COPY_MAC_ADDR(pAd->MlmeAux.Bssid, pBss->Bssid); + + // If AP's SSID is not hidden, it is OK for updating ssid to MlmeAux again. + if (pBss->Hidden == 0) + { + RTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID); + NdisMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen); + pAd->MlmeAux.SsidLen = pBss->SsidLen; + } + + pAd->MlmeAux.BssType = pBss->BssType; + pAd->MlmeAux.Channel = pBss->Channel; + pAd->MlmeAux.CentralChannel = pBss->CentralChannel; + +#ifdef EXT_BUILD_CHANNEL_LIST + // Country IE of the AP will be evaluated and will be used. + if ((pAd->StaCfg.IEEE80211dClientMode != Rt802_11_D_None) && + (pBss->bHasCountryIE == TRUE)) + { + NdisMoveMemory(&pAd->CommonCfg.CountryCode[0], &pBss->CountryString[0], 2); + if (pBss->CountryString[2] == 'I') + pAd->CommonCfg.Geography = IDOR; + else if (pBss->CountryString[2] == 'O') + pAd->CommonCfg.Geography = ODOR; + else + pAd->CommonCfg.Geography = BOTH; + BuildChannelListEx(pAd); + } +#endif // EXT_BUILD_CHANNEL_LIST // + + // Let BBP register at 20MHz to do scan + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); + BBPValue &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); + pAd->CommonCfg.BBPCurrentBW = BW_20; + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BBP R4 to 20MHz.l\n")); + + // switch channel and waiting for beacon timer + AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, FALSE); + AsicLockChannel(pAd, pAd->MlmeAux.Channel); + + + RTMPSetTimer(&pAd->MlmeAux.BeaconTimer, JOIN_TIMEOUT); + + do + { + if (((pAd->CommonCfg.bIEEE80211H == 1) && + (pAd->MlmeAux.Channel > 14) && + RadarChannelCheck(pAd, pAd->MlmeAux.Channel)) +#ifdef CARRIER_DETECTION_SUPPORT // Roger sync Carrier + || (pAd->CommonCfg.CarrierDetect.Enable == TRUE) +#endif // CARRIER_DETECTION_SUPPORT // + ) + { + // + // We can't send any Probe request frame to meet 802.11h. + // + if (pBss->Hidden == 0) + break; + } + + // + // send probe request + // + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); + if (NStatus == NDIS_STATUS_SUCCESS) + { + if (pAd->MlmeAux.Channel <= 14) + { + pSupRate = pAd->CommonCfg.SupRate; + SupRateLen = pAd->CommonCfg.SupRateLen; + pExtRate = pAd->CommonCfg.ExtRate; + ExtRateLen = pAd->CommonCfg.ExtRateLen; + } + else + { + // + // Overwrite Support Rate, CCK rate are not allowed + // + pSupRate = ASupRate; + SupRateLen = ASupRateLen; + ExtRateLen = 0; + } + + if (pAd->MlmeAux.BssType == BSS_INFRA) + MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, pAd->MlmeAux.Bssid, pAd->MlmeAux.Bssid); + else + MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR); + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &Hdr80211, + 1, &SsidIe, + 1, &pAd->MlmeAux.SsidLen, + pAd->MlmeAux.SsidLen, pAd->MlmeAux.Ssid, + 1, &SupRateIe, + 1, &SupRateLen, + SupRateLen, pSupRate, + END_OF_ARGS); + + if (ExtRateLen) + { + ULONG Tmp; + MakeOutgoingFrame(pOutBuffer + FrameLen, &Tmp, + 1, &ExtRateIe, + 1, &ExtRateLen, + ExtRateLen, pExtRate, + END_OF_ARGS); + FrameLen += Tmp; + } + + +#ifdef WPA_SUPPLICANT_SUPPORT + if ((pAd->OpMode == OPMODE_STA) && + (pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) && + (pAd->StaCfg.WpsProbeReqIeLen != 0)) + { + ULONG WpsTmpLen = 0; + + MakeOutgoingFrame(pOutBuffer + FrameLen, &WpsTmpLen, + pAd->StaCfg.WpsProbeReqIeLen, pAd->StaCfg.pWpsProbeReqIe, + END_OF_ARGS); + + FrameLen += WpsTmpLen; + } +#endif // WPA_SUPPLICANT_SUPPORT // + + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + } + } while (FALSE); + + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Switch to ch %d, Wait BEACON from %02x:%02x:%02x:%02x:%02x:%02x\n", + pBss->Channel, pBss->Bssid[0], pBss->Bssid[1], pBss->Bssid[2], pBss->Bssid[3], pBss->Bssid[4], pBss->Bssid[5])); + + pAd->Mlme.SyncMachine.CurrState = JOIN_WAIT_BEACON; +} + +/* + ========================================================================== + Description: + MLME START Request state machine procedure, starting an IBSS + ========================================================================== + */ +VOID MlmeStartReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen; + BOOLEAN TimerCancelled; + + // New for WPA security suites + UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 + NDIS_802_11_VARIABLE_IEs *pVIE = NULL; + LARGE_INTEGER TimeStamp; + BOOLEAN Privacy; + USHORT Status; + + // Init Variable IE structure + pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; + pVIE->Length = 0; + TimeStamp.u.LowPart = 0; + TimeStamp.u.HighPart = 0; + + if ((MlmeStartReqSanity(pAd, Elem->Msg, Elem->MsgLen, (PCHAR)Ssid, &SsidLen)) && + (CHAN_PropertyCheck(pAd, pAd->MlmeAux.Channel, CHANNEL_NO_IBSS) == FALSE)) + { + // reset all the timers + RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled); + RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled); + + // + // Start a new IBSS. All IBSS parameters are decided now.... + // + DBGPRINT(RT_DEBUG_TRACE, ("MlmeStartReqAction - Start a new IBSS. All IBSS parameters are decided now.... \n")); + pAd->MlmeAux.BssType = BSS_ADHOC; + NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); + pAd->MlmeAux.SsidLen = SsidLen; + + // generate a radom number as BSSID + MacAddrRandomBssid(pAd, pAd->MlmeAux.Bssid); + DBGPRINT(RT_DEBUG_TRACE, ("MlmeStartReqAction - generate a radom number as BSSID \n")); + + Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || + (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || + (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled); + pAd->MlmeAux.CapabilityInfo = CAP_GENERATE(0,1,Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 1, 0); + pAd->MlmeAux.BeaconPeriod = pAd->CommonCfg.BeaconPeriod; + pAd->MlmeAux.AtimWin = pAd->StaCfg.AtimWin; + pAd->MlmeAux.Channel = pAd->CommonCfg.Channel; + + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; + pAd->MlmeAux.CentralChannel = pAd->CommonCfg.CentralChannel; + + pAd->MlmeAux.SupRateLen= pAd->CommonCfg.SupRateLen; + NdisMoveMemory(pAd->MlmeAux.SupRate, pAd->CommonCfg.SupRate, MAX_LEN_OF_SUPPORTED_RATES); + RTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen); + pAd->MlmeAux.ExtRateLen = pAd->CommonCfg.ExtRateLen; + NdisMoveMemory(pAd->MlmeAux.ExtRate, pAd->CommonCfg.ExtRate, MAX_LEN_OF_SUPPORTED_RATES); + RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen); +#ifdef DOT11_N_SUPPORT + if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (pAd->StaCfg.bAdhocN == TRUE)) + { + RTMPUpdateHTIE(&pAd->CommonCfg.DesiredHtPhy, &pAd->StaCfg.DesiredHtPhyInfo.MCSSet[0], &pAd->MlmeAux.HtCapability, &pAd->MlmeAux.AddHtInfo); + pAd->MlmeAux.HtCapabilityLen = sizeof(HT_CAPABILITY_IE); + // Not turn pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE here. + DBGPRINT(RT_DEBUG_TRACE, ("SYNC -pAd->StaActive.SupportedHtPhy.bHtEnable = TRUE\n")); + } + else +#endif // DOT11_N_SUPPORT // + { + pAd->MlmeAux.HtCapabilityLen = 0; + pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; + NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16); + } + // temporarily not support QOS in IBSS + NdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM)); + NdisZeroMemory(&pAd->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM)); + NdisZeroMemory(&pAd->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM)); + + AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, FALSE); + AsicLockChannel(pAd, pAd->MlmeAux.Channel); + + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeStartReqAction(ch= %d,sup rates= %d, ext rates=%d)\n", + pAd->MlmeAux.Channel, pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen)); + + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_SUCCESS; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status, 0); + } + else + { + DBGPRINT_ERR(("SYNC - MlmeStartReqAction() sanity check fail.\n")); + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_INVALID_FORMAT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status, 0); + } +} + +/* + ========================================================================== + Description: + peer sends beacon back when scanning + ========================================================================== + */ +VOID PeerBeaconAtScanAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN]; + UCHAR Ssid[MAX_LEN_OF_SSID], BssType, Channel = 0, NewChannel, + SsidLen, DtimCount, DtimPeriod, BcastFlag, MessageToMe; + CF_PARM CfParm; + USHORT BeaconPeriod, AtimWin, CapabilityInfo; + PFRAME_802_11 pFrame; + LARGE_INTEGER TimeStamp; + UCHAR Erp; + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR SupRateLen, ExtRateLen; + USHORT LenVIE; + UCHAR CkipFlag; + UCHAR AironetCellPowerLimit; + EDCA_PARM EdcaParm; + QBSS_LOAD_PARM QbssLoad; + QOS_CAPABILITY_PARM QosCapability; + ULONG RalinkIe; + UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 + NDIS_802_11_VARIABLE_IEs *pVIE = NULL; + HT_CAPABILITY_IE HtCapability; + ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE + UCHAR HtCapabilityLen = 0, PreNHtCapabilityLen = 0; + UCHAR AddHtInfoLen; + UCHAR NewExtChannelOffset = 0xff; + + EXT_CAP_INFO_ELEMENT ExtCapInfo; + + + NdisZeroMemory(Ssid, MAX_LEN_OF_SSID); + pFrame = (PFRAME_802_11) Elem->Msg; + // Init Variable IE structure + pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; + pVIE->Length = 0; +#ifdef DOT11_N_SUPPORT + RTMPZeroMemory(&HtCapability, sizeof(HtCapability)); + RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE)); +#endif // DOT11_N_SUPPORT // + + NdisZeroMemory(&QbssLoad, sizeof(QBSS_LOAD_PARM)); /* woody */ + if (PeerBeaconAndProbeRspSanity(pAd, + Elem->Msg, + Elem->MsgLen, + Elem->Channel, + Addr2, + Bssid, + (PCHAR)Ssid, + &SsidLen, + &BssType, + &BeaconPeriod, + &Channel, + &NewChannel, + &TimeStamp, + &CfParm, + &AtimWin, + &CapabilityInfo, + &Erp, + &DtimCount, + &DtimPeriod, + &BcastFlag, + &MessageToMe, + SupRate, + &SupRateLen, + ExtRate, + &ExtRateLen, + &CkipFlag, + &AironetCellPowerLimit, + &EdcaParm, + &QbssLoad, + &QosCapability, + &RalinkIe, + &HtCapabilityLen, +#ifdef CONFIG_STA_SUPPORT + &PreNHtCapabilityLen, +#endif // CONFIG_STA_SUPPORT // + &HtCapability, + &ExtCapInfo, + &AddHtInfoLen, + &AddHtInfo, + &NewExtChannelOffset, + &LenVIE, + pVIE)) + { + ULONG Idx; + CHAR Rssi = 0; + + Idx = BssTableSearch(&pAd->ScanTab, Bssid, Channel); + if (Idx != BSS_NOT_FOUND) + Rssi = pAd->ScanTab.BssEntry[Idx].Rssi; + + Rssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2)); + + +#ifdef DOT11_N_SUPPORT + if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) + HtCapabilityLen = SIZE_HT_CAP_IE; +#endif // DOT11_N_SUPPORT // + + Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (PCHAR)Ssid, SsidLen, BssType, BeaconPeriod, + &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, + &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, + &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + if (INFRA_ON(pAd) && + (pAd->CommonCfg.bBssCoexEnable == TRUE) && + ((Channel > 0) && (Channel <= 14))) + { + int chListIdx; + + /* + First we find the channel list idx by the channel number + */ + for (chListIdx = 0; chListIdx < pAd->ChannelListNum; chListIdx++) + { + if (Channel == pAd->ChannelList[chListIdx].Channel) + break; + } + + if (chListIdx < pAd->ChannelListNum) + { + DBGPRINT(RT_DEBUG_TRACE, ("%s():Check Ch(%d) with ChList[Idx=%d,Ch=%d,bEffected=%d]\n", + __FUNCTION__, Channel, chListIdx, pAd->ChannelList[chListIdx].Channel, + pAd->ChannelList[chListIdx].bEffectedChannel)); + /* + If this channel is effected channel for the 20/40 coex operation. Check the related IEs. + */ + if (pAd->ChannelList[chListIdx].bEffectedChannel == TRUE) + { + UCHAR RegClass; + OVERLAP_BSS_SCAN_IE BssScan; + + // Read Beacon's Reg Class IE if any. + PeerBeaconAndProbeRspSanity2(pAd, Elem->Msg, Elem->MsgLen, &BssScan, &RegClass); + DBGPRINT(RT_DEBUG_TRACE, ("%s():RegClass=%d, HtCapLen=%d, Ch=%d\n", + __FUNCTION__, RegClass, HtCapabilityLen, Channel)); + TriEventTableSetEntry(pAd, &pAd->CommonCfg.TriggerEventTab, Bssid, &HtCapability, HtCapabilityLen, RegClass, Channel); + } + } + } +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + if (Idx != BSS_NOT_FOUND) + { + PBSS_ENTRY pBssEntry = &pAd->ScanTab.BssEntry[Idx]; + NdisMoveMemory(pBssEntry->PTSF, &Elem->Msg[24], 4); + NdisMoveMemory(&pBssEntry->TTSF[0], &Elem->TimeStamp.u.LowPart, 4); + NdisMoveMemory(&pBssEntry->TTSF[4], &Elem->TimeStamp.u.LowPart, 4); + + pBssEntry->MinSNR = Elem->Signal % 10; + if (pBssEntry->MinSNR == 0) + pBssEntry->MinSNR = -5; + + NdisMoveMemory(pBssEntry->MacAddr, Addr2, MAC_ADDR_LEN); + + if ((pFrame->Hdr.FC.SubType == SUBTYPE_PROBE_RSP) && + (LenVIE != 0)) + { + pBssEntry->VarIeFromProbeRspLen = 0; + if (pBssEntry->pVarIeFromProbRsp) + { + pBssEntry->VarIeFromProbeRspLen = LenVIE; + RTMPZeroMemory(pBssEntry->pVarIeFromProbRsp, MAX_VIE_LEN); + RTMPMoveMemory(pBssEntry->pVarIeFromProbRsp, pVIE, LenVIE); + } + } + } + +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + RT_CFG80211_SCANNING_INFORM(pAd, Idx, Elem->Channel, (UCHAR *)pFrame, + Elem->MsgLen, Rssi, MEM_ALLOC_FLAG); +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + } + // sanity check fail, ignored +} + +/* + ========================================================================== + Description: + When waiting joining the (I)BSS, beacon received from external + ========================================================================== + */ +VOID PeerBeaconAtJoinAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN]; + UCHAR Ssid[MAX_LEN_OF_SSID], SsidLen, BssType, Channel, MessageToMe, + DtimCount, DtimPeriod, BcastFlag, NewChannel; + LARGE_INTEGER TimeStamp; + USHORT BeaconPeriod, AtimWin, CapabilityInfo; + CF_PARM Cf; + BOOLEAN TimerCancelled; + UCHAR Erp; + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR SupRateLen, ExtRateLen; + UCHAR CkipFlag; + USHORT LenVIE; + UCHAR AironetCellPowerLimit; + EDCA_PARM EdcaParm; + QBSS_LOAD_PARM QbssLoad; + QOS_CAPABILITY_PARM QosCapability; + USHORT Status; + UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 + NDIS_802_11_VARIABLE_IEs *pVIE = NULL; + ULONG RalinkIe; + ULONG Idx = 0; + CHAR Rssi = 0; + HT_CAPABILITY_IE HtCapability; + ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE + UCHAR HtCapabilityLen = 0, PreNHtCapabilityLen = 0; + UCHAR AddHtInfoLen; + UCHAR NewExtChannelOffset = 0xff; +#ifdef DOT11_N_SUPPORT + UCHAR CentralChannel; + BOOLEAN bAllowNrate = FALSE; +#endif // DOT11_N_SUPPORT // + EXT_CAP_INFO_ELEMENT ExtCapInfo; + + // Init Variable IE structure + pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; + pVIE->Length = 0; + RTMPZeroMemory(&HtCapability, sizeof(HtCapability)); + RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE)); + + + if (PeerBeaconAndProbeRspSanity(pAd, + Elem->Msg, + Elem->MsgLen, + Elem->Channel, + Addr2, + Bssid, + (PCHAR)Ssid, + &SsidLen, + &BssType, + &BeaconPeriod, + &Channel, + &NewChannel, + &TimeStamp, + &Cf, + &AtimWin, + &CapabilityInfo, + &Erp, + &DtimCount, + &DtimPeriod, + &BcastFlag, + &MessageToMe, + SupRate, + &SupRateLen, + ExtRate, + &ExtRateLen, + &CkipFlag, + &AironetCellPowerLimit, + &EdcaParm, + &QbssLoad, + &QosCapability, + &RalinkIe, + &HtCapabilityLen, + &PreNHtCapabilityLen, + &HtCapability, + &ExtCapInfo, + &AddHtInfoLen, + &AddHtInfo, + &NewExtChannelOffset, + &LenVIE, + pVIE)) + { + // Disqualify 11b only adhoc when we are in 11g only adhoc mode + if ((BssType == BSS_ADHOC) && (pAd->CommonCfg.PhyMode == PHY_11G) && ((SupRateLen+ExtRateLen)< 12)) + return; + + // BEACON from desired BSS/IBSS found. We should be able to decide most + // BSS parameters here. + // Q. But what happen if this JOIN doesn't conclude a successful ASSOCIATEION? + // Do we need to receover back all parameters belonging to previous BSS? + // A. Should be not. There's no back-door recover to previous AP. It still need + // a new JOIN-AUTH-ASSOC sequence. + if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Bssid)) + { + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - receive desired BEACON at JoinWaitBeacon... Channel = %d\n", Channel)); + RTMPCancelTimer(&pAd->MlmeAux.BeaconTimer, &TimerCancelled); + + // Update RSSI to prevent No signal display when cards first initialized + pAd->StaCfg.RssiSample.LastRssi0 = ConvertToRssi(pAd, Elem->Rssi0, RSSI_0); + pAd->StaCfg.RssiSample.LastRssi1 = ConvertToRssi(pAd, Elem->Rssi1, RSSI_1); + pAd->StaCfg.RssiSample.LastRssi2 = ConvertToRssi(pAd, Elem->Rssi2, RSSI_2); + pAd->StaCfg.RssiSample.AvgRssi0 = pAd->StaCfg.RssiSample.LastRssi0; + pAd->StaCfg.RssiSample.AvgRssi0X8 = pAd->StaCfg.RssiSample.AvgRssi0 << 3; + pAd->StaCfg.RssiSample.AvgRssi1 = pAd->StaCfg.RssiSample.LastRssi1; + pAd->StaCfg.RssiSample.AvgRssi1X8 = pAd->StaCfg.RssiSample.AvgRssi1 << 3; + pAd->StaCfg.RssiSample.AvgRssi2 = pAd->StaCfg.RssiSample.LastRssi2; + pAd->StaCfg.RssiSample.AvgRssi2X8 = pAd->StaCfg.RssiSample.AvgRssi2 << 3; + + // + // We need to check if SSID only set to any, then we can record the current SSID. + // Otherwise will cause hidden SSID association failed. + // + if (pAd->MlmeAux.SsidLen == 0) + { + NdisMoveMemory(pAd->MlmeAux.Ssid, Ssid, SsidLen); + pAd->MlmeAux.SsidLen = SsidLen; + } + else + { + Idx = BssSsidTableSearch(&pAd->ScanTab, Bssid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, Channel); + + if (Idx == BSS_NOT_FOUND) + { + Rssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2)); + Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (CHAR *) Ssid, SsidLen, BssType, BeaconPeriod, + &Cf, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability, + &AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag, + &EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE); + if (Idx != BSS_NOT_FOUND) + { + NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4); + NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); + NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); + CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo; + + pAd->ScanTab.BssEntry[Idx].MinSNR = Elem->Signal % 10; + if (pAd->ScanTab.BssEntry[Idx].MinSNR == 0) + pAd->ScanTab.BssEntry[Idx].MinSNR = -5; + + NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].MacAddr, Addr2, MAC_ADDR_LEN); + } + } + else + { + // + // Multiple SSID case, used correct CapabilityInfo + // + CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo; + } + } + NdisMoveMemory(pAd->MlmeAux.Bssid, Bssid, MAC_ADDR_LEN); + pAd->MlmeAux.CapabilityInfo = CapabilityInfo & SUPPORTED_CAPABILITY_INFO; + pAd->MlmeAux.BssType = BssType; + pAd->MlmeAux.BeaconPeriod = BeaconPeriod; + pAd->MlmeAux.Channel = Channel; + pAd->MlmeAux.AtimWin = AtimWin; + pAd->MlmeAux.CfpPeriod = Cf.CfpPeriod; + pAd->MlmeAux.CfpMaxDuration = Cf.CfpMaxDuration; + pAd->MlmeAux.APRalinkIe = RalinkIe; + + // Copy AP's supported rate to MlmeAux for creating assoication request + // Also filter out not supported rate + pAd->MlmeAux.SupRateLen = SupRateLen; + NdisMoveMemory(pAd->MlmeAux.SupRate, SupRate, SupRateLen); + RTMPCheckRates(pAd, pAd->MlmeAux.SupRate, &pAd->MlmeAux.SupRateLen); + pAd->MlmeAux.ExtRateLen = ExtRateLen; + NdisMoveMemory(pAd->MlmeAux.ExtRate, ExtRate, ExtRateLen); + RTMPCheckRates(pAd, pAd->MlmeAux.ExtRate, &pAd->MlmeAux.ExtRateLen); + + NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16); + + + /* Get the ext capability info element */ + NdisMoveMemory(&pAd->MlmeAux.ExtCapInfo, &ExtCapInfo,sizeof(ExtCapInfo)); + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + DBGPRINT(RT_DEBUG_TRACE, ("MlmeAux.ExtCapInfo=%d\n", pAd->MlmeAux.ExtCapInfo.BssCoexistMgmtSupport)); + if (pAd->CommonCfg.bBssCoexEnable == TRUE) + pAd->CommonCfg.ExtCapIE.BssCoexistMgmtSupport = 1; +#endif // DOT11N_DRAFT3 // + + if (((pAd->StaCfg.WepStatus != Ndis802_11WEPEnabled) && (pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled)) + || (pAd->CommonCfg.HT_DisallowTKIP == FALSE)) + { + if ((pAd->StaCfg.BssType == BSS_INFRA) || + ((pAd->StaCfg.BssType == BSS_ADHOC) && (pAd->StaCfg.bAdhocN == TRUE))) + bAllowNrate = TRUE; + } + + pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset; + pAd->MlmeAux.HtCapabilityLen = HtCapabilityLen; + + RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); + // filter out un-supported ht rates + if (((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) && + (pAd->StaCfg.DesiredHtPhyInfo.bHtEnable) && + ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && bAllowNrate)) + { + RTMPMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, SIZE_ADD_HT_INFO_IE); + + // StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability + NdisMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, HtCapability.MCSSet, 16); + pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset; + pAd->MlmeAux.HtCapabilityLen = SIZE_HT_CAP_IE; + pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE; + if (PreNHtCapabilityLen > 0) + pAd->StaActive.SupportedPhyInfo.bPreNHt = TRUE; + RTMPCheckHt(pAd, BSSID_WCID, &HtCapability, &AddHtInfo); + // Copy AP Parameter to StaActive. This is also in LinkUp. + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAtJoinAction! (MpduDensity=%d, MaxRAmpduFactor=%d, BW=%d)\n", + pAd->StaActive.SupportedHtPhy.MpduDensity, pAd->StaActive.SupportedHtPhy.MaxRAmpduFactor, HtCapability.HtCapInfo.ChannelWidth)); + + if (AddHtInfoLen > 0) + { + CentralChannel = AddHtInfo.ControlChan; + // Check again the Bandwidth capability of this AP. + if ((AddHtInfo.ControlChan > 2)&& (AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW) && (HtCapability.HtCapInfo.ChannelWidth == BW_40)) + { + CentralChannel = AddHtInfo.ControlChan - 2; + } + else if ((AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE) && (HtCapability.HtCapInfo.ChannelWidth == BW_40)) + { + CentralChannel = AddHtInfo.ControlChan + 2; + } + + // Check Error . + if (pAd->MlmeAux.CentralChannel != CentralChannel) + DBGPRINT(RT_DEBUG_ERROR, ("PeerBeaconAtJoinAction HT===>Beacon Central Channel = %d, Control Channel = %d. Mlmeaux CentralChannel = %d\n", CentralChannel, AddHtInfo.ControlChan, pAd->MlmeAux.CentralChannel)); + + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeaconAtJoinAction HT===>Central Channel = %d, Control Channel = %d, .\n", CentralChannel, AddHtInfo.ControlChan)); + + } + + } + else +#endif // DOT11_N_SUPPORT // + { + // To prevent error, let legacy AP must have same CentralChannel and Channel. + if ((HtCapabilityLen == 0) && (PreNHtCapabilityLen == 0)) + pAd->MlmeAux.CentralChannel = pAd->MlmeAux.Channel; + + pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE; + pAd->MlmeAux.NewExtChannelOffset = 0xff; + RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE); + pAd->MlmeAux.HtCapabilityLen = 0; + RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE); + } + + RTMPUpdateMlmeRate(pAd); + + // copy QOS related information + if ((pAd->CommonCfg.bWmmCapable) +#ifdef DOT11_N_SUPPORT + || (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) +#endif // DOT11_N_SUPPORT // + ) + { + NdisMoveMemory(&pAd->MlmeAux.APEdcaParm, &EdcaParm, sizeof(EDCA_PARM)); + NdisMoveMemory(&pAd->MlmeAux.APQbssLoad, &QbssLoad, sizeof(QBSS_LOAD_PARM)); + NdisMoveMemory(&pAd->MlmeAux.APQosCapability, &QosCapability, sizeof(QOS_CAPABILITY_PARM)); + } + else + { + NdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM)); + NdisZeroMemory(&pAd->MlmeAux.APQbssLoad, sizeof(QBSS_LOAD_PARM)); + NdisZeroMemory(&pAd->MlmeAux.APQosCapability, sizeof(QOS_CAPABILITY_PARM)); + } + + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - after JOIN, SupRateLen=%d, ExtRateLen=%d\n", + pAd->MlmeAux.SupRateLen, pAd->MlmeAux.ExtRateLen)); + + if (AironetCellPowerLimit != 0xFF) + { + //We need to change our TxPower for CCX 2.0 AP Control of Client Transmit Power + ChangeToCellPowerLimit(pAd, AironetCellPowerLimit); + } + else //Used the default TX Power Percentage. + pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; + + InitChannelRelatedValue(pAd); + + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_SUCCESS; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status, 0); + +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT + RT_CFG80211_SCANNING_INFORM(pAd, Idx, Elem->Channel, Elem->Msg, + Elem->MsgLen, Rssi, MEM_ALLOC_FLAG); +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + } + // not to me BEACON, ignored + } + // sanity check fail, ignore this frame +} + +/* + ========================================================================== + Description: + receive BEACON from peer + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID PeerBeacon( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Bssid[MAC_ADDR_LEN], Addr2[MAC_ADDR_LEN]; + CHAR Ssid[MAX_LEN_OF_SSID]; + CF_PARM CfParm; + UCHAR SsidLen, MessageToMe=0, BssType, Channel, NewChannel, index=0; + UCHAR DtimCount=0, DtimPeriod=0, BcastFlag=0; + USHORT CapabilityInfo, AtimWin, BeaconPeriod; + LARGE_INTEGER TimeStamp; + USHORT TbttNumToNextWakeUp; + UCHAR Erp; + UCHAR SupRate[MAX_LEN_OF_SUPPORTED_RATES], ExtRate[MAX_LEN_OF_SUPPORTED_RATES]; + UCHAR SupRateLen, ExtRateLen; + UCHAR CkipFlag; + USHORT LenVIE; + UCHAR AironetCellPowerLimit; + EDCA_PARM EdcaParm; + QBSS_LOAD_PARM QbssLoad; + QOS_CAPABILITY_PARM QosCapability; + ULONG RalinkIe; + // New for WPA security suites + UCHAR VarIE[MAX_VIE_LEN]; // Total VIE length = MAX_VIE_LEN - -5 + NDIS_802_11_VARIABLE_IEs *pVIE = NULL; + HT_CAPABILITY_IE HtCapability; + ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE + UCHAR HtCapabilityLen, PreNHtCapabilityLen; + UCHAR AddHtInfoLen; + UCHAR NewExtChannelOffset = 0xff; + EXT_CAP_INFO_ELEMENT ExtCapInfo; + + +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + { + return; + } +#endif // RALINK_ATE // + + if (!(INFRA_ON(pAd) || ADHOC_ON(pAd) + )) + return; + + // Init Variable IE structure + pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE; + pVIE->Length = 0; + RTMPZeroMemory(&HtCapability, sizeof(HtCapability)); + RTMPZeroMemory(&AddHtInfo, sizeof(ADD_HT_INFO_IE)); + RTMPZeroMemory(&ExtCapInfo, sizeof(ExtCapInfo)); + + if (PeerBeaconAndProbeRspSanity(pAd, + Elem->Msg, + Elem->MsgLen, + Elem->Channel, + Addr2, + Bssid, + Ssid, + &SsidLen, + &BssType, + &BeaconPeriod, + &Channel, + &NewChannel, + &TimeStamp, + &CfParm, + &AtimWin, + &CapabilityInfo, + &Erp, + &DtimCount, + &DtimPeriod, + &BcastFlag, + &MessageToMe, + SupRate, + &SupRateLen, + ExtRate, + &ExtRateLen, + &CkipFlag, + &AironetCellPowerLimit, + &EdcaParm, + &QbssLoad, + &QosCapability, + &RalinkIe, + &HtCapabilityLen, +#ifdef CONFIG_STA_SUPPORT + &PreNHtCapabilityLen, +#endif // CONFIG_STA_SUPPORT // + &HtCapability, + &ExtCapInfo, + &AddHtInfoLen, + &AddHtInfo, + &NewExtChannelOffset, + &LenVIE, + pVIE)) + { + BOOLEAN is_my_bssid, is_my_ssid; + ULONG Bssidx, Now; + BSS_ENTRY *pBss; + CHAR RealRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2)); + + is_my_bssid = MAC_ADDR_EQUAL(Bssid, pAd->CommonCfg.Bssid)? TRUE : FALSE; + is_my_ssid = SSID_EQUAL(Ssid, SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen)? TRUE:FALSE; + + + // ignore BEACON not for my SSID + if ((! is_my_ssid) && (! is_my_bssid)) + return; + + // It means STA waits disassoc completely from this AP, ignores this beacon. + if (pAd->Mlme.CntlMachine.CurrState == CNTL_WAIT_DISASSOC) + return; + +#ifdef DOT11_N_SUPPORT + // Copy Control channel for this BSSID. + if (AddHtInfoLen != 0) + Channel = AddHtInfo.ControlChan; + + if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) + HtCapabilityLen = SIZE_HT_CAP_IE; +#endif // DOT11_N_SUPPORT // + + // + // Housekeeping "SsidBssTab" table for later-on ROAMing usage. + // + Bssidx = BssTableSearchWithSSID(&pAd->MlmeAux.SsidBssTab, Bssid, Ssid, SsidLen, Channel); + if (Bssidx == BSS_NOT_FOUND) + { + // discover new AP of this network, create BSS entry + Bssidx = BssTableSetEntry(pAd, &pAd->MlmeAux.SsidBssTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, + &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, + &HtCapability, &AddHtInfo,HtCapabilityLen,AddHtInfoLen,NewExtChannelOffset, Channel, + RealRssi, TimeStamp, CkipFlag, &EdcaParm, &QosCapability, + &QbssLoad, LenVIE, pVIE); + if (Bssidx == BSS_NOT_FOUND) + ; + else + { + PBSS_ENTRY pBssEntry = &pAd->MlmeAux.SsidBssTab.BssEntry[Bssidx]; + NdisMoveMemory(&pBssEntry->PTSF[0], &Elem->Msg[24], 4); + NdisMoveMemory(&pBssEntry->TTSF[0], &Elem->TimeStamp.u.LowPart, 4); + NdisMoveMemory(&pBssEntry->TTSF[4], &Elem->TimeStamp.u.LowPart, 4); + pBssEntry->Rssi = RealRssi; + + NdisMoveMemory(pBssEntry->MacAddr, Addr2, MAC_ADDR_LEN); + + + } + } + + /* + Update ScanTab + */ + Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel); + if (Bssidx == BSS_NOT_FOUND) + { + // discover new AP of this network, create BSS entry + Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod, + &CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, + &HtCapability, &AddHtInfo,HtCapabilityLen,AddHtInfoLen,NewExtChannelOffset, Channel, + RealRssi, TimeStamp, CkipFlag, &EdcaParm, &QosCapability, + &QbssLoad, LenVIE, pVIE); + if (Bssidx == BSS_NOT_FOUND) // return if BSS table full + return; + + NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].PTSF, &Elem->Msg[24], 4); + NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4); + NdisMoveMemory(&pAd->ScanTab.BssEntry[Bssidx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4); + pAd->ScanTab.BssEntry[Bssidx].MinSNR = Elem->Signal % 10; + if (pAd->ScanTab.BssEntry[Bssidx].MinSNR == 0) + pAd->ScanTab.BssEntry[Bssidx].MinSNR = -5; + + NdisMoveMemory(pAd->ScanTab.BssEntry[Bssidx].MacAddr, Addr2, MAC_ADDR_LEN); + + + + } + + if ((pAd->CommonCfg.bIEEE80211H == 1) && (NewChannel != 0) && (Channel != NewChannel)) + { + // Switching to channel 1 can prevent from rescanning the current channel immediately (by auto reconnection). + // In addition, clear the MLME queue and the scan table to discard the RX packets and previous scanning results. + AsicSwitchChannel(pAd, 1, FALSE); + AsicLockChannel(pAd, 1); + LinkDown(pAd, FALSE); + MlmeQueueInit(&pAd->Mlme.Queue); + BssTableInit(&pAd->ScanTab); + RTMPusecDelay(1000000); // use delay to prevent STA do reassoc + + // channel sanity check + for (index = 0 ; index < pAd->ChannelListNum; index++) + { + if (pAd->ChannelList[index].Channel == NewChannel) + { + pAd->ScanTab.BssEntry[Bssidx].Channel = NewChannel; + pAd->CommonCfg.Channel = NewChannel; + AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); + AsicLockChannel(pAd, pAd->CommonCfg.Channel); + DBGPRINT(RT_DEBUG_TRACE, ("PeerBeacon - STA receive channel switch announcement IE (New Channel =%d)\n", NewChannel)); + break; + } + } + + if (index >= pAd->ChannelListNum) + { + DBGPRINT_ERR(("PeerBeacon(can not find New Channel=%d in ChannelList[%d]\n", pAd->CommonCfg.Channel, pAd->ChannelListNum)); + } + } + + // if the ssid matched & bssid unmatched, we should select the bssid with large value. + // This might happened when two STA start at the same time + if ((! is_my_bssid) && ADHOC_ON(pAd)) + { + INT i; + + // Add the safeguard against the mismatch of adhoc wep status + if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus) + { + return; + } + + // collapse into the ADHOC network which has bigger BSSID value. + for (i = 0; i < 6; i++) + { + if (Bssid[i] > pAd->CommonCfg.Bssid[i]) + { + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - merge to the IBSS with bigger BSSID=%02x:%02x:%02x:%02x:%02x:%02x\n", + Bssid[0], Bssid[1], Bssid[2], Bssid[3], Bssid[4], Bssid[5])); + AsicDisableSync(pAd); + COPY_MAC_ADDR(pAd->CommonCfg.Bssid, Bssid); + AsicSetBssid(pAd, pAd->CommonCfg.Bssid); + MakeIbssBeacon(pAd); // re-build BEACON frame + AsicEnableIbssSync(pAd); // copy BEACON frame to on-chip memory + is_my_bssid = TRUE; + break; + } + else if (Bssid[i] < pAd->CommonCfg.Bssid[i]) + break; + } + } + + + NdisGetSystemUpTime(&Now); + pBss = &pAd->ScanTab.BssEntry[Bssidx]; + pBss->Rssi = RealRssi; // lastest RSSI + pBss->LastBeaconRxTime = Now; // last RX timestamp + + // + // BEACON from my BSSID - either IBSS or INFRA network + // + if (is_my_bssid) + { + RXWI_STRUC RxWI; + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + OVERLAP_BSS_SCAN_IE BssScan; + UCHAR RegClass; + BOOLEAN brc; + + // Read Beacon's Reg Class IE if any. + brc = PeerBeaconAndProbeRspSanity2(pAd, Elem->Msg, Elem->MsgLen, &BssScan, &RegClass); + if (brc == TRUE) + { + UpdateBssScanParm(pAd, BssScan); + pAd->StaCfg.RegClass = RegClass; + } +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + + pAd->StaCfg.DtimCount = DtimCount; + pAd->StaCfg.DtimPeriod = DtimPeriod; + pAd->StaCfg.LastBeaconRxTime = Now; + + + RxWI.RSSI0 = Elem->Rssi0; + RxWI.RSSI1 = Elem->Rssi1; + RxWI.RSSI2 = Elem->Rssi2; + + Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, &RxWI); + +#ifdef LINUX +#ifdef RT_CFG80211_SUPPORT +// CFG80211_BeaconCountryRegionParse(pAd, pVIE, LenVIE); +#endif // RT_CFG80211_SUPPORT // +#endif // LINUX // + + if (AironetCellPowerLimit != 0xFF) + { + // + // We get the Cisco (ccx) "TxPower Limit" required + // Changed to appropriate TxPower Limit for Ciso Compatible Extensions + // + ChangeToCellPowerLimit(pAd, AironetCellPowerLimit); + } + else + { + // + // AironetCellPowerLimit equal to 0xFF means the Cisco (ccx) "TxPower Limit" not exist. + // Used the default TX Power Percentage, that set from UI. + // + pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault; + } + + if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo))) + { + UCHAR MaxSupportedRateIn500Kbps = 0; + UCHAR idx; + MAC_TABLE_ENTRY *pEntry; + + // supported rates array may not be sorted. sort it and find the maximum rate + for (idx=0; idx<SupRateLen; idx++) + { + if (MaxSupportedRateIn500Kbps < (SupRate[idx] & 0x7f)) + MaxSupportedRateIn500Kbps = SupRate[idx] & 0x7f; + } + + for (idx=0; idx<ExtRateLen; idx++) + { + if (MaxSupportedRateIn500Kbps < (ExtRate[idx] & 0x7f)) + MaxSupportedRateIn500Kbps = ExtRate[idx] & 0x7f; + } + + // look up the existing table + pEntry = MacTableLookup(pAd, Addr2); + + // Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon. + // To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station. + if ((ADHOC_ON(pAd) && (Elem->Wcid == RESERVED_WCID)) || + (pEntry && ((pEntry->LastBeaconRxTime + ADHOC_ENTRY_BEACON_LOST_TIME) < Now))) + { + if (pEntry == NULL) + // Another adhoc joining, add to our MAC table. + pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE); + + if (StaAddMacTableEntry(pAd, + pEntry, + MaxSupportedRateIn500Kbps, + &HtCapability, + HtCapabilityLen, + &AddHtInfo, + AddHtInfoLen, + CapabilityInfo) == FALSE) + { + DBGPRINT(RT_DEBUG_TRACE, ("ADHOC - Add Entry failed.\n")); + return; + } + + if (pEntry && + (Elem->Wcid == RESERVED_WCID)) + { + idx = pAd->StaCfg.DefaultKeyId; + RTMP_SET_WCID_SEC_INFO(pAd, BSS0, idx, + pAd->SharedKey[BSS0][idx].CipherAlg, + pEntry->Aid, + SHAREDKEYTABLE); + } + } + + if (pEntry && IS_ENTRY_CLIENT(pEntry)) + pEntry->LastBeaconRxTime = Now; + + // At least another peer in this IBSS, declare MediaState as CONNECTED + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)) + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED); + pAd->IndicateMediaState = NdisMediaStateConnected; + RTMP_IndicateMediaState(pAd); + pAd->ExtraInfo = GENERAL_LINK_UP; + DBGPRINT(RT_DEBUG_TRACE, ("ADHOC fOP_STATUS_MEDIA_STATE_CONNECTED.\n")); + } + } + + if (INFRA_ON(pAd)) + { + BOOLEAN bUseShortSlot, bUseBGProtection; + + // decide to use/change to - + // 1. long slot (20 us) or short slot (9 us) time + // 2. turn on/off RTS/CTS and/or CTS-to-self protection + // 3. short preamble + + //bUseShortSlot = pAd->CommonCfg.bUseShortSlotTime && CAP_IS_SHORT_SLOT(CapabilityInfo); + bUseShortSlot = CAP_IS_SHORT_SLOT(CapabilityInfo); + if (bUseShortSlot != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_SLOT_INUSED)) + AsicSetSlotTime(pAd, bUseShortSlot); + + bUseBGProtection = (pAd->CommonCfg.UseBGProtection == 1) || // always use + ((pAd->CommonCfg.UseBGProtection == 0) && ERP_IS_USE_PROTECTION(Erp)); + + if (pAd->CommonCfg.Channel > 14) // always no BG protection in A-band. falsely happened when switching A/G band to a dual-band AP + bUseBGProtection = FALSE; + + if (bUseBGProtection != OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED)) + { + if (bUseBGProtection) + { + OPSTATUS_SET_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, (OFDMSETPROTECT|CCKSETPROTECT|ALLN_SETPROTECT),FALSE,(pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1)); + } + else + { + OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_BG_PROTECTION_INUSED); + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, (OFDMSETPROTECT|CCKSETPROTECT|ALLN_SETPROTECT),TRUE,(pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1)); + } + + DBGPRINT(RT_DEBUG_WARN, ("SYNC - AP changed B/G protection to %d\n", bUseBGProtection)); + } + +#ifdef DOT11_N_SUPPORT + // check Ht protection mode. and adhere to the Non-GF device indication by AP. + if ((AddHtInfoLen != 0) && + ((AddHtInfo.AddHtInfo2.OperaionMode != pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode) || + (AddHtInfo.AddHtInfo2.NonGfPresent != pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent))) + { + pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent = AddHtInfo.AddHtInfo2.NonGfPresent; + pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode = AddHtInfo.AddHtInfo2.OperaionMode; + if (pAd->MlmeAux.AddHtInfo.AddHtInfo2.NonGfPresent == 1) + { + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, TRUE); + } + else + AsicUpdateProtect(pAd, pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode, ALLN_SETPROTECT, FALSE, FALSE); + + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP changed N OperaionMode to %d\n", pAd->MlmeAux.AddHtInfo.AddHtInfo2.OperaionMode)); + } +#endif // DOT11_N_SUPPORT // + + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED) && + ERP_IS_USE_BARKER_PREAMBLE(Erp)) + { + MlmeSetTxPreamble(pAd, Rt802_11PreambleLong); + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP forced to use LONG preamble\n")); + } + + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && + (EdcaParm.bValid == TRUE) && + (EdcaParm.EdcaUpdateCount != pAd->CommonCfg.APEdcaParm.EdcaUpdateCount)) + { + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - AP change EDCA parameters(from %d to %d)\n", + pAd->CommonCfg.APEdcaParm.EdcaUpdateCount, + EdcaParm.EdcaUpdateCount)); + AsicSetEdcaParm(pAd, &EdcaParm); + } + + // copy QOS related information + NdisMoveMemory(&pAd->CommonCfg.APQbssLoad, &QbssLoad, sizeof(QBSS_LOAD_PARM)); + NdisMoveMemory(&pAd->CommonCfg.APQosCapability, &QosCapability, sizeof(QOS_CAPABILITY_PARM)); +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 + // 2009: PF#1: 20/40 Coexistence in 2.4 GHz Band + // When AP changes "STA Channel Width" and "Secondary Channel Offset" fields of HT Operation Element in the Beacon to 0 + if ((AddHtInfoLen != 0) && INFRA_ON(pAd)) + { + BOOLEAN bChangeBW = FALSE; + // + // 1) HT Information + // 2) Secondary Channel Offset Element + // + // 40 -> 20 case + if (pAd->CommonCfg.BBPCurrentBW == BW_40) + { + if (((AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_NONE) && (AddHtInfo.AddHtInfo.RecomWidth == 0)) + ||(NewExtChannelOffset==0x0) + ) + { + bChangeBW = TRUE; + pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; + pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW = 0; + DBGPRINT(RT_DEBUG_TRACE, ("FallBack from 40MHz to 20MHz(CtrlCh=%d, CentralCh=%d)\n", + pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel)); + CntlChannelWidth(pAd, pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel, BW_20, 0); + } + } + // + // 20 -> 40 case + // 1.) Supported Channel Width Set Field of the HT Capabilities element of both STAs is set to a non-zero + // 2.) Secondary Channel Offset field is SCA or SCB + // 3.) 40MHzRegulatoryClass is TRUE (not implement it) + // + else if (((pAd->CommonCfg.BBPCurrentBW == BW_20) ||(NewExtChannelOffset!=0x0)) && + (pAd->CommonCfg.DesiredHtPhy.ChannelWidth != BW_20) + ) + { + if ((AddHtInfo.AddHtInfo.ExtChanOffset != EXTCHA_NONE) && (HtCapabilityLen>0) && (HtCapability.HtCapInfo.ChannelWidth == 1)) + { + if ((AddHtInfo.ControlChan > 2)&& (AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_BELOW)) + { + pAd->CommonCfg.CentralChannel = AddHtInfo.ControlChan - 2; + bChangeBW = TRUE; + } + else if ((AddHtInfo.AddHtInfo.ExtChanOffset == EXTCHA_ABOVE)) + { + pAd->CommonCfg.CentralChannel = AddHtInfo.ControlChan + 2; + bChangeBW = TRUE; + } + + if (bChangeBW) + { + pAd->CommonCfg.Channel = AddHtInfo.ControlChan; + DBGPRINT(RT_DEBUG_TRACE, ("FallBack from 20MHz to 40MHz(CtrlCh=%d, CentralCh=%d)\n", + pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel)); + CntlChannelWidth(pAd, pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel, BW_40, AddHtInfo.AddHtInfo.ExtChanOffset); + pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW = 1; + } + } + } + + if (bChangeBW) + { + pAd->CommonCfg.BSSCoexist2040.word = 0; + TriEventInit(pAd); + BuildEffectedChannelList(pAd); + } + } +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + } + + // only INFRASTRUCTURE mode support power-saving feature + if ((INFRA_ON(pAd) && (pAd->StaCfg.Psm == PWR_SAVE)) || (pAd->CommonCfg.bAPSDForcePowerSave)) + { + UCHAR FreeNumber; + // 1. AP has backlogged unicast-to-me frame, stay AWAKE, send PSPOLL + // 2. AP has backlogged broadcast/multicast frame and we want those frames, stay AWAKE + // 3. we have outgoing frames in TxRing or MgmtRing, better stay AWAKE + // 4. Psm change to PWR_SAVE, but AP not been informed yet, we better stay AWAKE + // 5. otherwise, put PHY back to sleep to save battery. + if (MessageToMe) + { +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + { + // Restore to correct BBP R3 value + if (pAd->Antenna.field.RxPath > 1) + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); + // Turn clk to 80Mhz. + } +#endif // PCIE_PS_SUPPORT // + if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable && + pAd->CommonCfg.bAPSDAC_BE && pAd->CommonCfg.bAPSDAC_BK && pAd->CommonCfg.bAPSDAC_VI && pAd->CommonCfg.bAPSDAC_VO) + { + pAd->CommonCfg.bNeedSendTriggerFrame = TRUE; + } + else + { + if (pAd->StaCfg.WindowsBatteryPowerMode == Ndis802_11PowerModeFast_PSP) + { + /* wake up and send a NULL frame with PM = 0 to the AP */ + RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE); + + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED)) + RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, TRUE); + else + RTMPSendNullFrame(pAd, pAd->CommonCfg.TxRate, FALSE); + } + else + { + /* use PS-Poll to get any buffered packet */ + RTMP_PS_POLL_ENQUEUE(pAd); + } + } + } + else if (BcastFlag && (DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM)) + { +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + { + if (pAd->Antenna.field.RxPath > 1) + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); + } +#endif // PCIE_PS_SUPPORT // + } + else if ((pAd->TxSwQueue[QID_AC_BK].Number != 0) || + (pAd->TxSwQueue[QID_AC_BE].Number != 0) || + (pAd->TxSwQueue[QID_AC_VI].Number != 0) || + (pAd->TxSwQueue[QID_AC_VO].Number != 0) || + (RTMPFreeTXDRequest(pAd, QID_AC_BK, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS) || + (RTMPFreeTXDRequest(pAd, QID_AC_BE, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS) || + (RTMPFreeTXDRequest(pAd, QID_AC_VI, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS) || + (RTMPFreeTXDRequest(pAd, QID_AC_VO, TX_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS) || + (RTMPFreeTXDRequest(pAd, QID_MGMT, MGMT_RING_SIZE - 1, &FreeNumber) != NDIS_STATUS_SUCCESS)) + { + // TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme + // can we cheat here (i.e. just check MGMT & AC_BE) for better performance? +#ifdef PCIE_PS_SUPPORT + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) + { + if (pAd->Antenna.field.RxPath > 1) + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3); + } +#endif // PCIE_PS_SUPPORT // + } + else + { + if ((pAd->CommonCfg.bACMAPSDTr[QID_AC_VO]) || + (pAd->CommonCfg.bACMAPSDTr[QID_AC_VI]) || + (pAd->CommonCfg.bACMAPSDTr[QID_AC_BK]) || + (pAd->CommonCfg.bACMAPSDTr[QID_AC_BE])) + { + /* + WMM Spec v1.0 3.6.2.4, + The WMM STA shall remain awake until it receives a + QoS Data or Null frame addressed to it, with the + EOSP subfield in QoS Control field set to 1. + + So we can not sleep here or we will suffer a case: + + PS Management Frame --> + Trigger frame --> + Beacon (TIM=0) (Beacon is closer to Trig frame) --> + Station goes to sleep --> + AP delivery queued UAPSD packets --> + Station can NOT receive the reply + + Maybe we need a timeout timer to avoid that we do + NOT receive the EOSP frame. + + We can not use More Data to check if SP is ended + due to MaxSPLength. + */ + } + else + { + USHORT NextDtim = DtimCount; + + + if (NextDtim == 0) + NextDtim = DtimPeriod; + + TbttNumToNextWakeUp = pAd->StaCfg.DefaultListenCount; + if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim)) + TbttNumToNextWakeUp = NextDtim; + + if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE)) + { + // Set a flag to go to sleep . Then after parse this RxDoneInterrupt, will go to sleep mode. + pAd->ThisTbttNumToNextWakeUp = TbttNumToNextWakeUp; + AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp); + + } + } + } + } + } + // not my BSSID, ignore it + } + // sanity check fail, ignore this frame +} + +/* + ========================================================================== + Description: + Receive PROBE REQ from remote peer when operating in IBSS mode + ========================================================================== + */ +VOID PeerProbeReqAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + UCHAR Addr2[MAC_ADDR_LEN]; + CHAR Ssid[MAX_LEN_OF_SSID]; + UCHAR SsidLen; +#ifdef DOT11_N_SUPPORT + UCHAR HtLen, AddHtLen, NewExtLen; +#endif // DOT11_N_SUPPORT // + HEADER_802_11 ProbeRspHdr; + NDIS_STATUS NStatus; + PUCHAR pOutBuffer = NULL; + ULONG FrameLen = 0; + LARGE_INTEGER FakeTimestamp; + UCHAR DsLen = 1, IbssLen = 2; + UCHAR LocalErpIe[3] = {IE_ERP, 1, 0}; + BOOLEAN Privacy; + USHORT CapabilityInfo; + + if (! ADHOC_ON(pAd)) + return; + + if (PeerProbeReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, Ssid, &SsidLen, NULL)) + { + if ((SsidLen == 0) || SSID_EQUAL(Ssid, SsidLen, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen)) + { + // allocate and send out ProbeRsp frame + NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NStatus != NDIS_STATUS_SUCCESS) + return; + + //pAd->StaCfg.AtimWin = 0; // ?????? + MgtMacHeaderInit(pAd, &ProbeRspHdr, SUBTYPE_PROBE_RSP, 0, Addr2, pAd->CommonCfg.Bssid); + + Privacy = (pAd->StaCfg.WepStatus == Ndis802_11Encryption1Enabled) || + (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled) || + (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled); + CapabilityInfo = CAP_GENERATE(0, 1, Privacy, (pAd->CommonCfg.TxPreamble == Rt802_11PreambleShort), 0, 0); + + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &ProbeRspHdr, + TIMESTAMP_LEN, &FakeTimestamp, + 2, &pAd->CommonCfg.BeaconPeriod, + 2, &CapabilityInfo, + 1, &SsidIe, + 1, &pAd->CommonCfg.SsidLen, + pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid, + 1, &SupRateIe, + 1, &pAd->StaActive.SupRateLen, + pAd->StaActive.SupRateLen, pAd->StaActive.SupRate, + 1, &DsIe, + 1, &DsLen, + 1, &pAd->CommonCfg.Channel, + 1, &IbssIe, + 1, &IbssLen, + 2, &pAd->StaActive.AtimWin, + END_OF_ARGS); + + if (pAd->StaActive.ExtRateLen) + { + ULONG tmp; + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 3, LocalErpIe, + 1, &ExtRateIe, + 1, &pAd->StaActive.ExtRateLen, + pAd->StaActive.ExtRateLen, &pAd->StaActive.ExtRate, + END_OF_ARGS); + FrameLen += tmp; + } + + if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone) + { + UCHAR RSNIe = IE_WPA; + ULONG tmp; + + RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0); + if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2PSK) + RSNIe = IE_RSN; + + MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp, + 1, &RSNIe, + 1, &pAd->StaCfg.RSNIE_Len, + pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE, + END_OF_ARGS); + FrameLen += tmp; + } + +#ifdef DOT11_N_SUPPORT + if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) + { + ULONG TmpLen; + UCHAR BROADCOM[4] = {0x0, 0x90, 0x4c, 0x33}; + HtLen = sizeof(pAd->CommonCfg.HtCapability); + AddHtLen = sizeof(pAd->CommonCfg.AddHTInfo); + NewExtLen = 1; + //New extension channel offset IE is included in Beacon, Probe Rsp or channel Switch Announcement Frame + if (pAd->bBroadComHT == TRUE) + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, + 1, &WpaIe, + 4, &BROADCOM[0], + pAd->MlmeAux.HtCapabilityLen, &pAd->MlmeAux.HtCapability, + END_OF_ARGS); + } + else + { + MakeOutgoingFrame(pOutBuffer + FrameLen, &TmpLen, + 1, &HtCapIe, + 1, &HtLen, + sizeof(HT_CAPABILITY_IE), &pAd->CommonCfg.HtCapability, + 1, &AddHtInfoIe, + 1, &AddHtLen, + sizeof(ADD_HT_INFO_IE), &pAd->CommonCfg.AddHTInfo, + 1, &NewExtChanIe, + 1, &NewExtLen, + sizeof(NEW_EXT_CHAN_IE), &pAd->CommonCfg.NewExtChanOffset, + END_OF_ARGS); + } + FrameLen += TmpLen; + } +#endif // DOT11_N_SUPPORT // + + + + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + } + } +} + +VOID BeaconTimeoutAtJoinAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BeaconTimeoutAtJoinAction\n")); + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_REJ_TIMEOUT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + Scan timeout procedure. basically add channel index by 1 and rescan + ========================================================================== + */ +VOID ScanTimeoutAction( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + + + pAd->MlmeAux.Channel = NextChannel(pAd, pAd->MlmeAux.Channel); + + // Only one channel scanned for CISCO beacon request + if ((pAd->MlmeAux.ScanType == SCAN_CISCO_ACTIVE) || + (pAd->MlmeAux.ScanType == SCAN_CISCO_PASSIVE) || + (pAd->MlmeAux.ScanType == SCAN_CISCO_NOISE) || + (pAd->MlmeAux.ScanType == SCAN_CISCO_CHANNEL_LOAD)) + pAd->MlmeAux.Channel = 0; + + // this routine will stop if pAd->MlmeAux.Channel == 0 + ScanNextChannel(pAd); +} + +/* + ========================================================================== + Description: + ========================================================================== + */ +VOID InvalidStateWhenScan( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("AYNC - InvalidStateWhenScan(state=%ld). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState)); + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + ========================================================================== + */ +VOID InvalidStateWhenJoin( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("InvalidStateWhenJoin(state=%ld). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState)); + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + ========================================================================== + */ +VOID InvalidStateWhenStart( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + USHORT Status; + DBGPRINT(RT_DEBUG_TRACE, ("InvalidStateWhenStart(state=%ld). Reset SYNC machine\n", pAd->Mlme.SyncMachine.CurrState)); + pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE; + Status = MLME_STATE_MACHINE_REJECT; + MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_START_CONF, 2, &Status, 0); +} + +/* + ========================================================================== + Description: + + IRQL = DISPATCH_LEVEL + + ========================================================================== + */ +VOID EnqueuePsPoll( + IN PRTMP_ADAPTER pAd) +{ +#ifdef RALINK_ATE + if (ATE_ON(pAd)) + { + return; + } +#endif // RALINK_ATE // + + + if (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeLegacy_PSP) + pAd->PsPollFrame.FC.PwrMgmt = PWR_SAVE; + MiniportMMRequest(pAd, 0, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME)); +} + + +/* + ========================================================================== + Description: + ========================================================================== + */ +VOID EnqueueProbeRequest( + IN PRTMP_ADAPTER pAd) +{ + NDIS_STATUS NState; + PUCHAR pOutBuffer; + ULONG FrameLen = 0; + HEADER_802_11 Hdr80211; + + DBGPRINT(RT_DEBUG_TRACE, ("force out a ProbeRequest ...\n")); + + NState = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory + if (NState == NDIS_STATUS_SUCCESS) + { + MgtMacHeaderInit(pAd, &Hdr80211, SUBTYPE_PROBE_REQ, 0, BROADCAST_ADDR, BROADCAST_ADDR); + + // this ProbeRequest explicitly specify SSID to reduce unwanted ProbeResponse + MakeOutgoingFrame(pOutBuffer, &FrameLen, + sizeof(HEADER_802_11), &Hdr80211, + 1, &SsidIe, + 1, &pAd->CommonCfg.SsidLen, + pAd->CommonCfg.SsidLen, pAd->CommonCfg.Ssid, + 1, &SupRateIe, + 1, &pAd->StaActive.SupRateLen, + pAd->StaActive.SupRateLen, pAd->StaActive.SupRate, + END_OF_ARGS); + MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen); + MlmeFreeMemory(pAd, pOutBuffer); + } + +} + +#ifdef DOT11_N_SUPPORT +#ifdef DOT11N_DRAFT3 +VOID BuildEffectedChannelList( + IN PRTMP_ADAPTER pAd) +{ + UCHAR EChannel[11]; + UCHAR i, j, k; + UCHAR UpperChannel = 0, LowerChannel = 0; + + RTMPZeroMemory(EChannel, 11); + DBGPRINT(RT_DEBUG_TRACE, ("BuildEffectedChannelList:CtrlCh=%d,CentCh=%d,AuxCtrlCh=%d,AuxExtCh=%d\n", + pAd->CommonCfg.Channel, pAd->CommonCfg.CentralChannel, + pAd->MlmeAux.AddHtInfo.ControlChan, + pAd->MlmeAux.AddHtInfo.AddHtInfo.ExtChanOffset)); + + // 802.11n D4 11.14.3.3: If no secondary channel has been selected, all channels in the frequency band shall be scanned. + //if (pAd->MacTab.Content[BSSID_WCID].HTPhyMode.field.BW == BW_20) + { + for (k = 0;k < pAd->ChannelListNum;k++) + { + if (pAd->ChannelList[k].Channel <=14 ) + pAd->ChannelList[k].bEffectedChannel = TRUE; + } + return; + } + + i = 0; + // Find upper and lower channel according to 40MHz current operation. + if (pAd->CommonCfg.CentralChannel < pAd->CommonCfg.Channel) + { + UpperChannel = pAd->CommonCfg.Channel; + LowerChannel = pAd->CommonCfg.CentralChannel-2; + } + else if (pAd->CommonCfg.CentralChannel > pAd->CommonCfg.Channel) + { + UpperChannel = pAd->CommonCfg.CentralChannel+2; + LowerChannel = pAd->CommonCfg.Channel; + } + else + { + DBGPRINT(RT_DEBUG_TRACE, ("LinkUP 20MHz . No Effected Channel \n")); + // Now operating in 20MHz, doesn't find 40MHz effected channels + return; + } + + DeleteEffectedChannelList(pAd); + + DBGPRINT(RT_DEBUG_TRACE, ("BuildEffectedChannelList!LowerChannel ~ UpperChannel; %d ~ %d \n", LowerChannel, UpperChannel)); + + // Find all channels that are below lower channel.. + if (LowerChannel > 1) + { + EChannel[0] = LowerChannel - 1; + i = 1; + if (LowerChannel > 2) + { + EChannel[1] = LowerChannel - 2; + i = 2; + if (LowerChannel > 3) + { + EChannel[2] = LowerChannel - 3; + i = 3; + } + } + } + // Find all channels that are between lower channel and upper channel. + for (k = LowerChannel;k <= UpperChannel;k++) + { + EChannel[i] = k; + i++; + } + // Find all channels that are above upper channel.. + if (UpperChannel < 14) + { + EChannel[i] = UpperChannel + 1; + i++; + if (UpperChannel < 13) + { + EChannel[i] = UpperChannel + 2; + i++; + if (UpperChannel < 12) + { + EChannel[i] = UpperChannel + 3; + i++; + } + } + } + // Total i channels are effected channels. + // Now find corresponding channel in ChannelList array. Then set its bEffectedChannel= TRUE + for (j = 0;j < i;j++) + { + for (k = 0;k < pAd->ChannelListNum;k++) + { + if (pAd->ChannelList[k].Channel == EChannel[j]) + { + pAd->ChannelList[k].bEffectedChannel = TRUE; + DBGPRINT(RT_DEBUG_TRACE,(" EffectedChannel[%d]( =%d)\n", k, EChannel[j])); + break; + } + } + } +} + + +VOID DeleteEffectedChannelList( + IN PRTMP_ADAPTER pAd) +{ + UCHAR i; + // Clear all bEffectedChannel in ChannelList array. + //for (i = 0; i < (pAd->ChannelListNum - 1); i++) + for (i = 0; i < pAd->ChannelListNum; i++) + { + pAd->ChannelList[i].bEffectedChannel = FALSE; + } +} + + +/* + ======================================================================== + + Routine Description: + Control Primary&Central Channel, ChannelWidth and Second Channel Offset + + Arguments: + pAd Pointer to our adapter + PrimaryChannel Primary Channel + CentralChannel Central Channel + ChannelWidth BW_20 or BW_40 + SecondaryChannelOffset EXTCHA_NONE, EXTCHA_ABOVE and EXTCHA_BELOW + + Return Value: + None + + Note: + + ======================================================================== +*/ +VOID CntlChannelWidth( + IN PRTMP_ADAPTER pAd, + IN UCHAR PrimaryChannel, + IN UCHAR CentralChannel, + IN UCHAR ChannelWidth, + IN UCHAR SecondaryChannelOffset) +{ + UCHAR Value = 0; + UINT32 Data = 0; + + + DBGPRINT(RT_DEBUG_TRACE, ("%s: PrimaryChannel[%d] \n",__FUNCTION__,PrimaryChannel)); + DBGPRINT(RT_DEBUG_TRACE, ("%s: CentralChannel[%d] \n",__FUNCTION__,CentralChannel)); + DBGPRINT(RT_DEBUG_TRACE, ("%s: ChannelWidth[%d] \n",__FUNCTION__,ChannelWidth)); + DBGPRINT(RT_DEBUG_TRACE, ("%s: SecondaryChannelOffset[%d] \n",__FUNCTION__,SecondaryChannelOffset)); + +#ifdef DOT11_N_SUPPORT + // Change to AP channel + if (ChannelWidth == BW_40) + { + if(SecondaryChannelOffset == EXTCHA_ABOVE) + { + // Must using 40MHz. + pAd->CommonCfg.BBPCurrentBW = BW_40; + AsicSwitchChannel(pAd, CentralChannel, FALSE); + AsicLockChannel(pAd, CentralChannel); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value); + Value &= (~0x18); + Value |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value); + + // RX : control channel at lower + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); + Value &= (~0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); +#ifdef RTMP_MAC_PCI + pAd->StaCfg.BBPR3 = Value; +#endif // RTMP_MAC_PCI // + + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data); + Data &= 0xfffffffe; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data); + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16); + DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); + } + + DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel )); + } + else if (SecondaryChannelOffset == EXTCHA_BELOW) + { + // Must using 40MHz. + pAd->CommonCfg.BBPCurrentBW = BW_40; + AsicSwitchChannel(pAd, CentralChannel, FALSE); + AsicLockChannel(pAd, CentralChannel); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value); + Value &= (~0x18); + Value |= 0x10; + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value); + + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data); + Data |= 0x1; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); + Value |= (0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); +#ifdef RTMP_MAC_PCI + pAd->StaCfg.BBPR3 = Value; +#endif // RTMP_MAC_PCI // + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x1A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x0A); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x16); + DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); + } + + DBGPRINT(RT_DEBUG_TRACE, ("!!! 40MHz Upper !!! Control Channel at UpperCentral = %d \n", CentralChannel)); + } + } + else +#endif // DOT11_N_SUPPORT // + { + pAd->CommonCfg.BBPCurrentBW = BW_20; + AsicSwitchChannel(pAd, PrimaryChannel, FALSE); + AsicLockChannel(pAd, PrimaryChannel); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &Value); + Value &= (~0x18); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, Value); + + RTMP_IO_READ32(pAd, TX_BAND_CFG, &Data); + Data &= 0xfffffffe; + RTMP_IO_WRITE32(pAd, TX_BAND_CFG, Data); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &Value); + Value &= (~0x20); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, Value); +#ifdef RTMP_MAC_PCI + pAd->StaCfg.BBPR3 = Value; +#endif // RTMP_MAC_PCI // + + if (pAd->MACVersion == 0x28600100) + { + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08); + RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11); + DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); + } + + DBGPRINT(RT_DEBUG_TRACE, ("!!! 20MHz !!! \n" )); + } + + RTMPSetAGCInitValue(pAd, pAd->CommonCfg.BBPCurrentBW); + + RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue); +} + + +#endif // DOT11N_DRAFT3 // +#endif // DOT11_N_SUPPORT // + +BOOLEAN ScanRunning( + IN PRTMP_ADAPTER pAd) +{ + return (pAd->Mlme.SyncMachine.CurrState == SCAN_LISTEN) ? TRUE : FALSE; +} + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/wpa.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/wpa.c new file mode 100644 index 000000000..edfe33e87 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta/wpa.c @@ -0,0 +1,447 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + + Module Name: + wpa.c + + Abstract: + + Revision History: + Who When What + -------- ---------- ---------------------------------------------- + Jan Lee 03-07-22 Initial + Paul Lin 03-11-28 Modify for supplicant +*/ +#include "rt_config.h" + +void inc_byte_array(UCHAR *counter, int len); + +/* + ======================================================================== + + Routine Description: + Process MIC error indication and record MIC error timer. + + Arguments: + pAd Pointer to our adapter + pWpaKey Pointer to the WPA key structure + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + + ======================================================================== +*/ +VOID RTMPReportMicError( + IN PRTMP_ADAPTER pAd, + IN PCIPHER_KEY pWpaKey) +{ + ULONG Now; + UCHAR unicastKey = (pWpaKey->Type == PAIRWISE_KEY ? 1:0); + + // Record Last MIC error time and count + NdisGetSystemUpTime(&Now); + if (pAd->StaCfg.MicErrCnt == 0) + { + pAd->StaCfg.MicErrCnt++; + pAd->StaCfg.LastMicErrorTime = Now; + NdisZeroMemory(pAd->StaCfg.ReplayCounter, 8); + } + else if (pAd->StaCfg.MicErrCnt == 1) + { + if ((pAd->StaCfg.LastMicErrorTime + (60 * OS_HZ)) < Now) + { + // Update Last MIC error time, this did not violate two MIC errors within 60 seconds + pAd->StaCfg.LastMicErrorTime = Now; + } + else + { + + RTMPSendWirelessEvent(pAd, IW_COUNTER_MEASURES_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); + + pAd->StaCfg.LastMicErrorTime = Now; + // Violate MIC error counts, MIC countermeasures kicks in + pAd->StaCfg.MicErrCnt++; + // We shall block all reception + // We shall clean all Tx ring and disassoicate from AP after next EAPOL frame + // + // No necessary to clean all Tx ring, on RTMPHardTransmit will stop sending non-802.1X EAPOL packets + // if pAd->StaCfg.MicErrCnt greater than 2. + // + // RTMPRingCleanUp(pAd, QID_AC_BK); + // RTMPRingCleanUp(pAd, QID_AC_BE); + // RTMPRingCleanUp(pAd, QID_AC_VI); + // RTMPRingCleanUp(pAd, QID_AC_VO); + // RTMPRingCleanUp(pAd, QID_HCCA); + } + } + else + { + // MIC error count >= 2 + // This should not happen + ; + } + MlmeEnqueue(pAd, + MLME_CNTL_STATE_MACHINE, + OID_802_11_MIC_FAILURE_REPORT_FRAME, + 1, + &unicastKey, 0); + + if (pAd->StaCfg.MicErrCnt == 2) + { + RTMPSetTimer(&pAd->StaCfg.WpaDisassocAndBlockAssocTimer, 100); + } +} + + +#ifdef WPA_SUPPLICANT_SUPPORT +#define LENGTH_EAP_H 4 +// If the received frame is EAP-Packet ,find out its EAP-Code (Request(0x01), Response(0x02), Success(0x03), Failure(0x04)). +INT WpaCheckEapCode( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pFrame, + IN USHORT FrameLen, + IN USHORT OffSet) +{ + + PUCHAR pData; + INT result = 0; + + if( FrameLen < OffSet + LENGTH_EAPOL_H + LENGTH_EAP_H ) + return result; + + pData = pFrame + OffSet; // skip offset bytes + + if(*(pData+1) == EAPPacket) // 802.1x header - Packet Type + { + result = *(pData+4); // EAP header - Code + } + + return result; +} + +VOID WpaSendMicFailureToWpaSupplicant( + IN PRTMP_ADAPTER pAd, + IN BOOLEAN bUnicast) +{ + char custom[IW_CUSTOM_MAX] = {0}; + + sprintf(custom, "MLME-MICHAELMICFAILURE.indication"); + if(bUnicast) + sprintf(custom, "%s unicast", custom); + + RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, -1, NULL, (PUCHAR)custom, strlen(custom)); + + return; +} +#endif // WPA_SUPPLICANT_SUPPORT // + +VOID WpaMicFailureReportFrame( + IN PRTMP_ADAPTER pAd, + IN MLME_QUEUE_ELEM *Elem) +{ + PUCHAR pOutBuffer = NULL; + UCHAR Header802_3[14]; + ULONG FrameLen = 0; + UCHAR *mpool; + PEAPOL_PACKET pPacket; + UCHAR Mic[16]; + BOOLEAN bUnicast; + + DBGPRINT(RT_DEBUG_TRACE, ("WpaMicFailureReportFrame ----->\n")); + + bUnicast = (Elem->Msg[0] == 1 ? TRUE:FALSE); + pAd->Sequence = ((pAd->Sequence) + 1) & (MAX_SEQ_NUMBER); + + // init 802.3 header and Fill Packet + MAKE_802_3_HEADER(Header802_3, pAd->CommonCfg.Bssid, pAd->CurrentAddress, EAPOL); + + // Allocate memory for output + os_alloc_mem(NULL, (PUCHAR *)&mpool, TX_EAPOL_BUFFER); + if (mpool == NULL) + { + DBGPRINT(RT_DEBUG_ERROR, ("!!!%s : no memory!!!\n", __FUNCTION__)); + return; + } + + pPacket = (PEAPOL_PACKET)mpool; + NdisZeroMemory(pPacket, TX_EAPOL_BUFFER); + + pPacket->ProVer = EAPOL_VER; + pPacket->ProType = EAPOLKey; + + pPacket->KeyDesc.Type = WPA1_KEY_DESC; + + // Request field presented + pPacket->KeyDesc.KeyInfo.Request = 1; + + if(pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) + { + pPacket->KeyDesc.KeyInfo.KeyDescVer = 2; + } + else // TKIP + { + pPacket->KeyDesc.KeyInfo.KeyDescVer = 1; + } + + pPacket->KeyDesc.KeyInfo.KeyType = (bUnicast ? PAIRWISEKEY : GROUPKEY); + + // KeyMic field presented + pPacket->KeyDesc.KeyInfo.KeyMic = 1; + + // Error field presented + pPacket->KeyDesc.KeyInfo.Error = 1; + + // Update packet length after decide Key data payload + SET_UINT16_TO_ARRARY(pPacket->Body_Len, MIN_LEN_OF_EAPOL_KEY_MSG) + + // Key Replay Count + NdisMoveMemory(pPacket->KeyDesc.ReplayCounter, pAd->StaCfg.ReplayCounter, LEN_KEY_DESC_REPLAY); + inc_byte_array(pAd->StaCfg.ReplayCounter, 8); + + // Convert to little-endian format. + *((USHORT *)&pPacket->KeyDesc.KeyInfo) = cpu2le16(*((USHORT *)&pPacket->KeyDesc.KeyInfo)); + + + MlmeAllocateMemory(pAd, (PUCHAR *)&pOutBuffer); // allocate memory + if(pOutBuffer == NULL) + { + os_free_mem(NULL, mpool); + return; + } + + // Prepare EAPOL frame for MIC calculation + // Be careful, only EAPOL frame is counted for MIC calculation + MakeOutgoingFrame(pOutBuffer, &FrameLen, + CONV_ARRARY_TO_UINT16(pPacket->Body_Len) + 4, pPacket, + END_OF_ARGS); + + // Prepare and Fill MIC value + NdisZeroMemory(Mic, sizeof(Mic)); + if(pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled) + { // AES + UCHAR digest[20] = {0}; + RT_HMAC_SHA1(pAd->StaCfg.PTK, LEN_PTK_KCK, pOutBuffer, FrameLen, digest, SHA1_DIGEST_SIZE); + NdisMoveMemory(Mic, digest, LEN_KEY_DESC_MIC); + } + else + { // TKIP + RT_HMAC_MD5(pAd->StaCfg.PTK, LEN_PTK_KCK, pOutBuffer, FrameLen, Mic, MD5_DIGEST_SIZE); + } + NdisMoveMemory(pPacket->KeyDesc.KeyMic, Mic, LEN_KEY_DESC_MIC); + + // copy frame to Tx ring and send MIC failure report frame to authenticator + RTMPToWirelessSta(pAd, &pAd->MacTab.Content[BSSID_WCID], + Header802_3, LENGTH_802_3, + (PUCHAR)pPacket, + CONV_ARRARY_TO_UINT16(pPacket->Body_Len) + 4, FALSE); + + MlmeFreeMemory(pAd, (PUCHAR)pOutBuffer); + + os_free_mem(NULL, mpool); + + DBGPRINT(RT_DEBUG_TRACE, ("WpaMicFailureReportFrame <-----\n")); +} + +/** from wpa_supplicant + * inc_byte_array - Increment arbitrary length byte array by one + * @counter: Pointer to byte array + * @len: Length of the counter in bytes + * + * This function increments the last byte of the counter by one and continues + * rolling over to more significant bytes if the byte was incremented from + * 0xff to 0x00. + */ +void inc_byte_array(UCHAR *counter, int len) +{ + int pos = len - 1; + while (pos >= 0) { + counter[pos]++; + if (counter[pos] != 0) + break; + pos--; + } +} + +VOID WpaDisassocApAndBlockAssoc( + IN PVOID SystemSpecific1, + IN PVOID FunctionContext, + IN PVOID SystemSpecific2, + IN PVOID SystemSpecific3) +{ + RTMP_ADAPTER *pAd = (PRTMP_ADAPTER)FunctionContext; + MLME_DISASSOC_REQ_STRUCT DisassocReq; + + // disassoc from current AP first + DBGPRINT(RT_DEBUG_TRACE, ("RTMPReportMicError - disassociate with current AP after sending second continuous EAPOL frame\n")); + DisassocParmFill(pAd, &DisassocReq, pAd->CommonCfg.Bssid, REASON_MIC_FAILURE); + MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_MLME_DISASSOC_REQ, sizeof(MLME_DISASSOC_REQ_STRUCT), &DisassocReq, 0); + + pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_DISASSOC; + pAd->StaCfg.bBlockAssoc = TRUE; +} + +VOID WpaStaPairwiseKeySetting( + IN PRTMP_ADAPTER pAd) +{ + PCIPHER_KEY pSharedKey; + PMAC_TABLE_ENTRY pEntry; + + pEntry = &pAd->MacTab.Content[BSSID_WCID]; + + // Pairwise key shall use key#0 + pSharedKey = &pAd->SharedKey[BSS0][0]; + + NdisMoveMemory(pAd->StaCfg.PTK, pEntry->PTK, LEN_PTK); + + // Prepare pair-wise key information into shared key table + NdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY)); + pSharedKey->KeyLen = LEN_TK; + NdisMoveMemory(pSharedKey->Key, &pAd->StaCfg.PTK[32], LEN_TK); + NdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.PTK[48], LEN_TKIP_MIC); + NdisMoveMemory(pSharedKey->TxMic, &pAd->StaCfg.PTK[48+LEN_TKIP_MIC], LEN_TKIP_MIC); + + // Decide its ChiperAlg + if (pAd->StaCfg.PairCipher == Ndis802_11Encryption2Enabled) + pSharedKey->CipherAlg = CIPHER_TKIP; + else if (pAd->StaCfg.PairCipher == Ndis802_11Encryption3Enabled) + pSharedKey->CipherAlg = CIPHER_AES; + else + pSharedKey->CipherAlg = CIPHER_NONE; + + // Update these related information to MAC_TABLE_ENTRY + NdisMoveMemory(pEntry->PairwiseKey.Key, &pAd->StaCfg.PTK[32], LEN_TK); + NdisMoveMemory(pEntry->PairwiseKey.RxMic, &pAd->StaCfg.PTK[48], LEN_TKIP_MIC); + NdisMoveMemory(pEntry->PairwiseKey.TxMic, &pAd->StaCfg.PTK[48+LEN_TKIP_MIC], LEN_TKIP_MIC); + pEntry->PairwiseKey.CipherAlg = pSharedKey->CipherAlg; + + // Update pairwise key information to ASIC Shared Key Table + RTMP_ASIC_SHARED_KEY_TABLE(pAd, + BSS0, + 0, + pSharedKey); + + // Update ASIC WCID attribute table and IVEIV table + RTMP_SET_WCID_SEC_INFO(pAd, + BSS0, + 0, + pSharedKey->CipherAlg, + BSSID_WCID, + SHAREDKEYTABLE); + + RTMP_SET_PORT_SECURED(pAd); + pAd->IndicateMediaState = NdisMediaStateConnected; + + DBGPRINT(RT_DEBUG_TRACE, ("%s : AID(%d) port secured\n", __FUNCTION__, pEntry->Aid)); + +} + +VOID WpaStaGroupKeySetting( + IN PRTMP_ADAPTER pAd) +{ + PCIPHER_KEY pSharedKey; + + pSharedKey = &pAd->SharedKey[BSS0][pAd->StaCfg.DefaultKeyId]; + + // Prepare pair-wise key information into shared key table + NdisZeroMemory(pSharedKey, sizeof(CIPHER_KEY)); + pSharedKey->KeyLen = LEN_TK; + NdisMoveMemory(pSharedKey->Key, pAd->StaCfg.GTK, LEN_TK); + NdisMoveMemory(pSharedKey->RxMic, &pAd->StaCfg.GTK[16], LEN_TKIP_MIC); + NdisMoveMemory(pSharedKey->TxMic, &pAd->StaCfg.GTK[24], LEN_TKIP_MIC); + + // Update Shared Key CipherAlg + pSharedKey->CipherAlg = CIPHER_NONE; + if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption2Enabled) + pSharedKey->CipherAlg = CIPHER_TKIP; + else if (pAd->StaCfg.GroupCipher == Ndis802_11Encryption3Enabled) + pSharedKey->CipherAlg = CIPHER_AES; + else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP40Enabled) + pSharedKey->CipherAlg = CIPHER_WEP64; + else if (pAd->StaCfg.GroupCipher == Ndis802_11GroupWEP104Enabled) + pSharedKey->CipherAlg = CIPHER_WEP128; + + // Update group key information to ASIC Shared Key Table + RTMP_ASIC_SHARED_KEY_TABLE(pAd, + BSS0, + pAd->StaCfg.DefaultKeyId, + pSharedKey); + + /* STA doesn't need to set WCID attribute for group key */ +} + + +/* + ======================================================================== + + Routine Description: + Send EAPoL-Start packet to AP. + + Arguments: + pAd - NIC Adapter pointer + + Return Value: + None + + IRQL = DISPATCH_LEVEL + + Note: + Actions after link up + 1. Change the correct parameters + 2. Send EAPOL - START + + ======================================================================== +*/ +VOID WpaSendEapolStart( + IN PRTMP_ADAPTER pAd, + IN PUCHAR pBssid) +{ + IEEE8021X_FRAME Packet; + UCHAR Header802_3[14]; + + DBGPRINT(RT_DEBUG_TRACE, ("-----> WpaSendEapolStart\n")); + + NdisZeroMemory(Header802_3,sizeof(UCHAR)*14); + + MAKE_802_3_HEADER(Header802_3, pBssid, &pAd->CurrentAddress[0], EAPOL); + + // Zero message 2 body + NdisZeroMemory(&Packet, sizeof(Packet)); + Packet.Version = EAPOL_VER; + Packet.Type = EAPOLStart; + Packet.Length = cpu2be16(0); + + // Copy frame to Tx ring + RTMPToWirelessSta((PRTMP_ADAPTER)pAd, &pAd->MacTab.Content[BSSID_WCID], + Header802_3, LENGTH_802_3, (PUCHAR)&Packet, 4, TRUE); + + DBGPRINT(RT_DEBUG_TRACE, ("<----- WpaSendEapolStart\n")); +} + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta_ate_iwpriv_usage.txt b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta_ate_iwpriv_usage.txt new file mode 100644 index 000000000..46b0c2fb5 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/sta_ate_iwpriv_usage.txt @@ -0,0 +1,445 @@ +=================================================================================================== +ATE Test Command Format for station driver + +****** IMPORTANT ****** +If you are not familiar with hardware, it is recommanded not to modify hardware default value. +It may damage hardware. + +=================================================================================================== +Usage: + iwpriv ra0 [act] [parameters]=[val] + + +where + +[act] [parameters] [val] constraints explaination +----- ------------- ----------------- -------------------------------- + +===================================== +1. Set ATE actions. + Value: + ATESTART - Start ATE function and stop station function. + ATESTOP - Stop ATE function and start station function. + TXCONT - Start continuous TX, for power mask. + TXCARR - Start carrier test, for frequency calibration. + TXFRAME - Transmit frame, for EVM. + RXFRAME - Continuous RX, for PER/FER. + +1.1 ATEDA + Set ATE frame header destination address. + Value: + xx:xx:xx:xx:xx:xx ; hex + +1.2 ATESA + Set ATE frame header source addr. + Value: + xx:xx:xx:xx:xx:xx ; hex + +1.3 ATEBSSID + Set ATE frame header BSSID. + Value: + xx:xx:xx:xx:xx:xx ; hex + +1.4 ATECHANNEL + Set ATE Channel, deimal. + Value: + 802.11b/g: 1 ~ 14 depends on CountryRegion setting + +1.5 ATETXPOW0 + Set ATE Tx power for Antenna 1. + Value: + 0 ~ 31 ; 2.4GHz, deimal + -7 ~15 ; 5.5GHz, deimal + +1.6 ATETXPOW1 + Set ATE Tx power for Antenna 2. + Value: + 0 ~ 31 ; 2.4GHz, decimal + -7 ~15 ; 5.5GHz, deimal + +1.7 ATETXFREQOFFSET + Set ATE RF frequency offset. + Value: + 0 ~ 63 ; unit: 2KHz, decimal + +1.8 ATETXLEN + Set ATE frame length. + Value: + 24 ~ 2312 ; decimal + +1.9 ATETXCNT + Set ATE frame Tx count. + Value: + 1 ~ ; 32-bit, decimal + +1.10 ATETXMODE (Refer to TxMode) + Set ATE Tx Mode. + Value: + 0: CCK 802.11b + 1: OFDM 802.11g + 2: HT_MIX 802.11b/g/n + 3: Green Field 802.11n + +1.11 ATETXBW (Refer to TxMode) + Set ATE Tx and Rx Bandwidth. + Value: + 0: 20MHz + 1: 40MHz + +1.12 ATETXGI (Refer to TxMode) + Set ATE Tx Guard Interval. + Value: + 0: Long + 1: Short + +1.13 ATETXMCS (Refer to TxMode) + Set ATE Tx MCS type. + Value: + 0 ~ 15 + +1.14 ATETXANT + Set ATE TX antenna. + Value: + 0: All + 1: Antenna one + 2: Antenna two + +1.15 ATERXANT + Set ATE RX antenna. + Value: + 0: All + 1: Antenna one + 2: Antenna two + 3: Antenna three + +1.16 ATERXFER + Set ATE to periodically reset and show up RxCount (per-second) and RxTotalCount. + Value: + 0: Disable counter visability + 1: Enable counter visability + +1.17 ATESHOW + Show all parameters of ATE. + Value: + 1 + +1.18 ATEHELP + List all commands of ATE. + Value: + 1 + +1.19 ResetCounter + Reset statistic counter. + Value: + 1 + +1.20 ATERRF + Read all of the RF registers. + Value: + 1 + +1.21 ATEWRF1 + Write the RF register 1. + Value: + xxxxxxxx ;32-bit, hex + +1.22 ATEWRF2 + Write the RF register 2. + Value: + xxxxxxxx ;32-bit, hex + +1.23 ATEWRF3 + Write the RF register 3. + Value: + xxxxxxxx ;32-bit, hex + +1.24 ATEWRF4 + Write the RF register 4. + Value: + xxxxxxxx ;32-bit, hex + +1.25 ATELDE2P + Overwrite all EEPROM contents + Value: + 1 + E.g. + iwpriv ra0 set ATELDE2P=1 + +1.26 ATERE2P + Display all EEPROM content. + Value: + 1 + E.g. + iwpriv ra0 set ATERE2P=1 + +=================================================================================================== +2. Examples: +========= + +2.1 Check EVM & Power + iwpriv ra0 set ATE=ATESTART + iwpriv ra0 set ATEDA=00:11:22:33:44:55 + iwpriv ra0 set ATESA=00:aa:bb:cc:dd:ee + iwpriv ra0 set ATEBSSID=00:11:22:33:44:55 + iwpriv ra0 set ATECHANNEL=1 ; set Channel + iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. + iwpriv ra0 set ATETXMCS=7 ; set MCS type. + iwpriv ra0 set ATETXBW=0 ; set Bandwidth + iwpriv ra0 set ATETXGI=0 ; set Long GI. + iwpriv ra0 set ATETXLEN=1024 ; set packet length. + iwpriv ra0 set ATETXPOW0=18 + iwpriv ra0 set ATETXPOW1=18 + iwpriv ra0 set ATETXCNT=100000 + iwpriv ra0 set ATE=TXFRAME + �K + iwpriv ra0 set ATETXPOW0=19 + �K + iwpriv ra0 set ATETXPOW0=20 + �K + iwpriv ra0 set ATE=ATESTART + +2.2 Check Carrier + iwpriv ra0 set ATE=ATESTART + iwpriv ra0 set ATECHANNEL=1 ; set Channel + iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. + iwpriv ra0 set ATETXMCS=7 ; set MCS type. + iwpriv ra0 set ATETXBW=0 ; set Bandwidth + iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial) + iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame(inform BBP to change, modulation mode) + iwpriv ra0 set ATE=TXCARR ; Start Tx carrier, Measure carrier with instrument + iwpriv ra0 set ATETXPOW0=05 + iwpriv ra0 set ATETXPOW1=05 + iwpriv ra0 set ATETXFREQOFFSET=19 + iwpriv ra0 set ATE=ATESTART + +2.3 Check specturm mask + iwpriv ra0 set ATE=ATESTART + iwpriv ra0 set ATECHANNEL=1 ; set Channel + iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. + iwpriv ra0 set ATETXMCS=7 ; set MCS type. + iwpriv ra0 set ATETXBW=0 ; set Bandwidth + iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial) + iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame(inform BBP to change, modulation mode) + iwpriv ra0 set ATE=TXCONT ; Start continuous TX, Measure specturm mask with instrument + iwpriv ra0 set ATETXPOW0=5 + iwpriv ra0 set ATETXPOW1=5 + iwpriv ra0 set ATE=ATESTART + +2.4 Frequency offset tuning + iwpriv ra0 set ATE=ATESTART + iwpriv ra0 set ATECHANNEL=1 ; set Channel + iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. + iwpriv ra0 set ATETXMCS=7 ; set MCS type. + iwpriv ra0 set ATETXCNT=200 ; Tx frame count(decmial) + iwpriv ra0 set ATETXFREQOFFSET=0 ; Set frequency offset 0(decimal) + iwpriv ra0 set ATE=TXFRAME ; Start Tx Frame + iwpriv ra0 set ATE=TXCARR ; Start Tx carrier, Measure carrier frequency with instrument + iwpriv ra0 set ATETXFREQOFFSET=10 ; Dynamic turning frequency offset, 10(decimal) + iwpriv ra0 set ATETXFREQOFFSET=20 ; Dynamic turning frequency offset, 20(decimal) + iwpriv ra0 set ATE=ATESTART ; Stop, Store the tuning result to EEPROM + +2.5 Rx + iwpriv ra0 set ATE=ATESTART + iwpriv ra0 set ATECHANNEL=1 ; set Channel + iwpriv ra0 set ResetCounter=1 ; Reset statistic counter + iwpriv ra0 set ATETXFREQOFFSET=value ;To use the ��value��(decimal) you got in tx calibration + iwpriv ra0 set ATETXMODE=1 ; set TX-Mode. + iwpriv ra0 set ATETXMCS=7 ; set MCS type. + iwpriv ra0 set ATETXBW=0 ; set Bandwidth + iwpriv ra0 set ATE=RXFRAME ; Start Rx, + iwpriv ra0 set ATERXFER=1 ; show RxCnt and RSSI/per-antenna, Transmit test packets + iwpriv ra0 set ATE=ATESTART ; Stop + iwpriv ra0 stat ; get statistics counter + iwpriv ra0 set ATERXFER=1 + iwpriv ra0 set ATERXANT=1 + + iwpriv ra0 set ATE=ATESTART + iwpriv ra0 set ATERXANT=0 + iwpriv ra0 set ATE=RXFRAME + +2.6 Show all ate parameters + iwpriv ra0 set ATESHOW=1 + + Mode=4 + TxPower0=0 + TxPower1=0 + TxAntennaSel=0 + RxAntennaSel=0 + BBPCurrentBW=0 + GI=0 + MCS=7 + TxMode=1 + Addr1=00:11:22:aa:bb:cc + Addr2=00:11:22:aa:bb:cc + Addr3=00:11:22:aa:bb:cc + Channel=1 + TxLength=1024 + TxCount=40000 + TxRate=11 + RFFreqOffset=0 + +2.7 Online help + iwpriv ra0 set ATEHELP=1 + + ATE=ATESTART, ATESTOP, TXCONT, TXCARR, TXFRAME, RXFRAME + ATEDA + ATESA + ATEBSSID + ATECHANNEL, range:0~14(unless A band !). + ATETXPOW0, set power level of antenna 1. + ATETXPOW1, set power level of antenna 2. + ATETXANT, set TX antenna. 0: all, 1: antenna one, 2: antenna two. + ATERXANT, set RX antenna.0: all, 1: antenna one, 2: antenna two, 3: antenna three. + ATETXFREQOFFSET, set frequency offset, range 0~63. + ATETXBW, set BandWidth, 0:20MHz, 1:40MHz. + ATETXLEN, set Frame length, range 24~2312. + ATETXCNT, set how many frame going to transmit. + ATETXMCS, set MCS, reference to rate table. + ATETXMODE, set Mode 0: CCK, 1: OFDM, 2: HT-Mix, 3: GreenField, reference to rate table. + ATETXGI, set GI interval, 0: Long, 1: Short. + ATERXFER, 0: disable Rx Frame error rate. 1: enable Rx Frame error rate. + ATERRF, show all RF registers. + ATEWRF1, set RF1 register. + ATEWRF2, set RF2 register. + ATEWRF3, set RF3 register. + ATEWRF4, set RF4 register. + ATELDE2P, load EEPROM from .bin file. + ATERE2P, display all EEPROM content. + ATESHOW, display all parameters of ATE. + ATEHELP, online help. + +2.8 Display Rx Packet Count and RSSI + iwpriv ra0 set ATERXANT=0 ==> Enable All Three Rx Antennas + iwpriv ra0 set ATERXFER=1 ==> Enable Rx Frame Error Rate: RxCnt/RxTotal + iwpriv ra0 set ATE=RXFRAME ==> Start Rx + MlmePeriodicExec: Rx packet cnt = 2/4 + MlmePeriodicExec: Rx AvgRssi0=-88, AvgRssi1=-80, AvgRssi2=-91 + MlmePeriodicExec: Rx packet cnt = 2/6 + MlmePeriodicExec: Rx AvgRssi0=-86, AvgRssi1=-77, AvgRssi2=-89�K + �K + + iwpriv ra0 set ATERXANT=1 ==> Enable Three Rx Antenna-1 + iwpriv ra0 set ATERXFER=1 ==> Enable Rx Frame Error Rate: RxCnt/RxTotal + iwpriv ra0 set ATE=RXFRAME ==> Start Rx + MlmePeriodicExec: Rx packet cnt = 0/7 + MlmePeriodicExec: Rx AvgRssi=-87 + MlmePeriodicExec: Rx packet cnt = 7/14 + MlmePeriodicExec: Rx AvgRssi=-90 + �K + �K + + +=================================================================================================== +3. Hardware Access +================== + +===================================== +3.1 iwpriv ra0 bbp [parameters]=[Value] + Read/Write BBP registers by ID number. + BBPID + +3.1.1 Read BBP register, BBPID only, no ��=�� symbol. + BBPID: + 0 ~ xx ; decimal, 8-bit + BBPID=Value + +3.1.2 Write BBP register. + BBPID: + 0 ~ xx ; decimal, 8-bit + Value: + 00 ~FF ; hexdecimal, 8-bit + +===================================== +3.2 iwpriv ra0 mac [parameters]=[val] + Read/Write MAC registers by offset. + MAC_OFFSET + +3.2.1 Read MAC register, MAC_OFFSET only, no ��=�� symbol. + MAC_OFFSET: + 0000 ~ FFFF ; hexdecimal, 16-bit + MAC_OFFSET=Value + +3.2.2 Write MAC register. + MAC_OFFSET: + 0000 ~ FFFF ; hexdecimal, 16-bit + Value: + 0000 ~FFFF ; hexdecimal, 32-bit + +===================================== +3.3 iwpriv ra0 e2p [parameters]=[val] + Read/Write EEPROM content by address. + EEP_ADDR + +3.3.1 Read EEPROM content, EEP_ADDR only, no ��=�� symbol. + EEP_ADDR: + 00 ~ FF ; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, �K) + EEP_ADDR=Value + +3.3.2 Write EEPROM content. + EEP_ADDR: + 00 ~ FF ; hexdecimal, 16-bit alignment (0, 2, 4, 6, 8, A, C, �K) + Value: + 0000 ~FFFF ; hexdecimal, 16-bit + +===================================== +3.4 Example + +3.4.1 Hardware access + iwpriv ra0 bbp 0 # read BBP register 0 + iwpriv ra0 bbp 0=12 # write BBP register 0 as 0x12 + iwpriv ra0 mac 0 # read MAC register 0 + iwpriv ra0 mac 0=1234abcd # write MAC register 0 as 0x1234abcd + iwpriv ra0 e2p 0 # read E2PROM 0 + iwpriv ra0 e2p c=12ab # write E2PROM 0xc as 0x12ab + +3.4.2 Statistic counter operation + iwpriv ra0 stat # read statistic counter + iwpriv ra0 set ResetCounter=0 # reset statistic counter + + Suggestion: + 1. To turn on ATE functionality, you have to add compile flag "RALINK_ATE" to Makefile + 2. Before doing ATE testing, please stop AP function + 3. If you want to test another ATE action, prefer to stop AP & ATE function + 4. All ATE function settings will lose efficacy after reboot. + 5. Before hardware register access, please reference hardware spec. + Note. + In ATE mode, the channel must set via "ATECHANNEL" + +=================================================================================================== +4. ated +======= +4.1 Introduction +The ated is an optional user space component for RT28xx Linux driver. +When Windows GUI starts, AP enters ATE mode (i.e.,ATESTART) immediately. +It behaves as a proxy between Windows GUI and RT28xx Linux driver when ATE process proceeds. +The ated will be killed automatically when Windows GUI is closed. +You can kill it manually, too(for example, type '$killall ated'). +RT28xx linux driver will leave ATE mode either ated is killed or Windows GUI is closed. + +4.2 Environment setup +1. Connect the platform you want to test directly with a Windows host by ether network line. +2. In the Windows host, run WinPcap_4_0.exe for the QA GUI or ./RT2880_ATE/RaUI.exe(please unrar "RT2880_ATE.rar" to get it). + +4.3 How to use ated for ATE purpose +0. First you should set both "HAS_ATE=y" and "HAS_QA_SUPPORT=y" in the file ~/Module/os/linux/config.mk and compile the driver. +1. Modify the Makefile according to our target "PLATFORM". +2. Change the path of "CROSS_COMPILE" if needed. +3. Then type 'make' command to compile the source code of the daemon. +4. After the driver interface has started up, attach both of the wireless interface and the ethernet interface to the bridge interface. +5. If you have no bridge interface, please give an IP address to the ethernet interface. + (for example : '$ated -beth0') +6. After the interfaces have entered forwarding states, manually start ated, type '$ated -bbrX -iraX'. +7. If your WLAN interface and Bridge interface is "ra0" and "br0" respectively, just type $ated. + (For further usage of options, type $ated -h) +8. In the Windows host, run RT28xxQA_ATE.exe or ./RT2880_ATE/RaUI.exe. +9. Select the wired network adapter, then press OK and wait for a moment. +10.If the Windows host cannot tolerate such a broadcast storm from ated, + please run ated with option -u.(for example : '$ated -ira1 -u') +11.If your target platform concerns its network security, please run RT28xxQA_unicast.exe instead of RT28xxQA_ATE.exe. + +Note : +a. The names of WLAN interface(default is "ra0") and Bridge interface(default is "br0") must be specified manually(for example : '$ated -bbr1 -ira2') if your WLAN interface or Bridge interface is not "ra0" or "br0" respectively ! +b. Please make sure no other RaUI is running before you excute ./RT2880_ATE/RaUI.exe. + + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/Makefile b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/Makefile new file mode 100644 index 000000000..ce4a422f8 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/Makefile @@ -0,0 +1,6 @@ +all: + gcc -g bin2h.c -o bin2h +clean: + rm -f *.o bin2h + + diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/bin2h b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/bin2h new file mode 100755 index 0000000000000000000000000000000000000000..7b0c33536954b3d1360c636a61e08e5e762f9c3f GIT binary patch literal 14741 zcmb<-^>JflWMqH=CI)5(5U-()g~J3Ss0|_*7)%%x7&sU-7}Ob57}yv<d<F)S1{Mww z25VqsU|?lnU|?ZjU|<HxGcqukG_r7jurLDy0|<lUKxTt5*wh9V4u%F6jx|yY3?K~B z&mh16HjYQ0fq`c|3kL{0FfuTBFfxGc1<5lpFfb^{GcYKuXW;<h3k(blAPjOB$PN$& zsrP7P;Q(P51_lNY28n}k;M0;6u>EKROn=bRk`!e7zc4T`fG|ie$nE+$nMwLNDY`kC zd8HM4#rb+h5Pu6WK-})`7Ya5R<W7*8{LpX_frbr8{&c?UYCArG6J6aWa#ti-xN-_c z1`0yM39K1Pa4;}{yvzVH10=)+H4DV%0TB!g47>~s3?RKAE-36lG%*<FK28P(25zVZ zb_NCpKBzy07$9*9QU_v#{0@#I1qKC>a*)_s@5cu~Y-Ajd!~v<%L*s+YfeC>ODu!_w z7#Kk6gV6Y0X#7SrekvN@42|!L#@9#VSE2E3(D;#P{2VlX0vcZvjW5N(z;I>)3kN9u z2!diWK0ZA+KQF$xB(bO@KAs^bGbtIAjLaC~J^ka0OHwlP;!BHDQy5Y!GD{eW3yL!H zO41n8@(WV)7~(;?lC$HJGqU5;5;Joc(o*x&7;;l{i&IM&(h5pTlEGv#Lt1i9esL;8 zaY<2fVhKZfYDsEd8ADomQD#Xh*qZdzl4OSXc#z#7Ba2Gna}zW37~Fk4ot)#1^i1F^ zLpaNTfq{XE0hAg*BnUGzFoQ*y7+9b*69XdyBLg$YmtYJE3X#lAUQiC115L|<U_LX$ zGALgF%x7ZQ08-4r!0=%`3kMr0A#Y&eU}t1tU;)ug3=A9~nwf!t2Sl?lFbIHXRt5$U z5Y5KGAOWJ;85m?hGzSBN0*K~hU{C?kTnr2vAex(jK?g+hFfbT^XkG>e6A;bEz+eHQ z`572&K(qh@g9C^bWMByGd>Y*RhUEpwdC`rBk7zM4bWi^C|NsBiOC_u?>=+mrUL0j) zV0dA`&A<>5ee&>s(;w?uIR2~tS<eE>z6}3W88)zRWPr54eDMGO|Np8WA7y~#US0t6 zK|ad>6(27TfcYRFW=JqFFudFV=7W5i0m>>b7l8R7A7^NQ<R^gnAfIP|qUU7;m=6kp z3=5Ea0hkX8i3|r2KLN}Kg-C`6h#vsvgF+@F0K|6y^Fbk$5dq>Gfcc=1$^a$vmkMA$ zD8w>A9(pMN=7T~mqX49y0n7)5U`7Rq|KT6Vzo3xJXaMma{QLhO6c8|M_%^QdVe^v@ z0U<#d0uxv`G887Ta0G^Bn6$HSyb%8X|NoZ>C;%E44YocTSU4C;?H2}YVBy#;v7Uva z@wLc$7LJ3znVMfSTHYv@>)i&jqxk^iVvv&mBCQ~4uyV^AMK6xAf(&46KEe_md$_km zjiGmsI!JwJ=hNml5({P4vv9N?C=uEL5^FtB!g-uU1tj+W!pXxEKx&?RXnf<q!NAb% z%G2qhB9pohRJeDxsMv5YFc=;<?xLas(s|rPg#%P29(PdzWqyX<78M&728K=+l^5#& z{{P32c2Thb$#H|^SX3@dVBvW2{_p?)oh~Xm$5~WvgZTF$e2wNB6&;3BvEwW%Pe8&Q z|Nj5q0Sfz<;v5VN%{3|-5J`cFEF3Sg;gY}D85p`<RCGFBR9KK4V+B%RF_DD>O<d{U z|Nn61P{;9s)Oy3zLIr>R{r`Vg{6rQGn4uvmEFhmWLR@RoT%%&bP^z>e5u{`aBoLrV z>i)u99?Q<au&WHD0%R&w+8$zpL353Y0Yj<$jtY=`h>A@ol03xYa_kHYJ0?$L;ph%g zG3X3Y;Q<9Ns2Bl-KB&$CIY<Fy+YB^CpoR{zqThf1|KD*IO%W(NA}hKEQuG2%krM+0 z1G1uxAVoTpP~GH-rl<#`s0>XJsB}O!DIKJ!0ZoxRnn_L|MJLb{fto(ZCdq;n2~0+H zlQNn~KYsuJzrzGgkq?@p%OFK9Xo|eh6s-d(x`3w098FOtND;>rR5zhpmjY50ilzwE zU_kbrJxEaonj%mO09la~NYM^7MWFH!S<%;D|Nrk`nTqNrH#CP|04ef8Q-mJkt3isU zpeX_s$H>;TffU_9Q-mJDi6BJ^(@@<6YOf%hWCK!^fTjpN(TRf;twB?SZr!J!|Nrm! zf~H6oEeOtn6p2hnbrX6xtpF*CK~se8re=_$6=;gk12Yb!=mVM}bdxMWifm@!casQ6 zQ45+P^dNZu<NyC1XV4U(CzVqmMG`YntwVRyQjnq)G)3qpHGmXtKvRTnQZz`>A2dbI zXwhN@QsgiT)lH!819DOk1S#@HQv|B2kQKf8{{R1u05nCQ)(5hp<HRUh^c`HE7=Wso z<18v5*SuJVMQj$xuu3!=Wzakr3eji+D%O8~`~SbgMa8<?MFq^4{Qm!c>wyx_9n;VZ zLHC;gk|9UFL0!k9@?yug|NoD(fGhDAHs2vtHK^qa@-nDq?{!hJ1X-N$?f?Jg8Wk1( zI+<=46%>zM1sMTt2<(`R<_?%yuzIQE+yDRk+d@>Vcg&l`!qFL`0;!6jww(I<|3An^ zXw3$$T9<wO|9{6~0>&DGoadsV!uawMs4AZVZl9zYi-KA!C9E%$zWx7y@-T7(E41?| zdV455Eck^#0|P_j;gj+V49#z3UcCPD|9|gpiU0rq_cnt_&Ep6EGqwINQ8E11?JCge zqQU`b7O`}@a&)q&{GYNJq^kKCqvgM%d(B5=qT}LY4|mI`9G(DbOM%+f3qk$-<{$q{ zgm;5jX%m`Xv;4o%&D{Lsf9V%UBMq(=)(*FkXJB~o=Ij6ek<lj)gX(!k1}27}5F?9< zig*{#AO>d-&wyap5C#U<yt2%q{Jh-Myb^`7#GKMp1to+sC562F5{1-?g8ZTq1*~eJ z=AbInPtMQH&Ck;>DlxJ!Gtf)Q%wy2c%uCKGO-a>H%Ph(*Pb^B+%U~#Ca8ArqFHtB; zO-xZp%gjktP%T#AVkn0SgSvDI;653Wq`npx1A~HdenDkXW_m`6f=05Yf{}rNxsF0m zVoqjWwn9j1az<W$PJVi&f^&XRL4HwUNoIbY0vCgVV@{3&SW~e=QEG8&QCVt=o&pyr zn<)gPreqeE6lErrf)wj1pb01>=A|f<7N;s?<|!m)<|P(YDx~EX<?1MuXO?8-mzF4i z+?1Q2l9`s747N^3A+ab`p&+#=H?yQ9HASJID8DQ-B{fB%BqOmzp(G<!AuT^AC%-&1 zFI^!yKQAQ{WNk566BmO*Zfc1Y*kKBsT4*jQR>&<a28CEbQGQBkaw^!Y#H9SPRE1=C znB?V`WG1JA9SyRIi$Q@CVO>gQadJ*#W^QT`$TuMQl>FpUQ1pXc4$`HcU!;&<l95`Z zkegVNT9lcX1Bw>VxDqGaBOsrHEk_MFkX>2|eyN#Y?I6?h5_3}(^3w=JPhNfz*ffyp zVvzF861bhkr3D2!nW;s^3b~1u3Q4J;m`G75$yZ3tOUW-PPF2V+0tIkxen~2bPAN?; zDON~HEy^rQO;JcI%Fk6O$;bqorodU8pH>1&eejqoE=WxVMVmrFQD%M-IJuRi=0T#a zxHvOEPY;xIIJFe~@)e3w%Thu1rRJq)=B1_<W#*;pD5Rt&=jRq==72*_2jrHN%;Lo2 z;?&%voJx>Sz?Q@91qD!MF~odO(g3GG1)t2^OmI3$ECJ=ioXq6Zyy8?n0)duZl$cji ztdOWso?n!cqFbJslBxqriVO-x`IU(|C6&5qMX9Me3VHc?x~Ub(Ii<y!WvL2K!xc*N zQc{Z)3cxlND`b`^<mH!xoS%_el$w}Ul3D~dia{a2Jg*oeo}8aoQk0)l3<~+&#OzcZ zg^a|qRE69`kgcV~sX7Xoxu9}FM<G8gEwu=wtT;6%2b7>dCMke98cLxhnK_wNsY;rV zSb+tMjzUsti9&IHPHIjiNGmAmq*j1K1Dt0P^D056Ffb?-mnLUGovn~rtdN(QoLXEA z%917d3Q)trNeO1MLSjySUMe_dGC}14C><x~=YsMvDA$2gf<j`RLViIisI16KS17J5 zE=kRW1yl+&q!RNK5(_}-KQ%?czaSN4ltOTRX;CsFNE3?{ax#lS5t&p8b^}-)RFP+1 zW=UpZ2`CB@!6gO*gF;40Nr9EVKB%NC1{<Z9UzDy7jiF*a1%;4|RG43(q6)<si8(po zayhY}01{Z>G7J<#kX(!8yJCg%jLhT=1!(Du8s>Tmpj4faSd;?J5(VHWR{#}rAb)_9 zV2T1LIe?Q2IHfW$D7bhAJNr0#`nm>z+~?sLtPt$)7833l<f`BqtPl|7ALi-e>Z0Hj zsSx7fs^IJ&5E<m@?h&Hk;qT+(8WgPH=;s28Nd;$rzmOnLr_d1ppkM_h$6y7|U?s4m zqhF+gYeYbhYjCiFe~^NwZ-9@dtBXRoV^ENzUx=q`u#SSKpR-S>i>IGEG`%~8hA8;? zhbZ`X`g(@Ax+sMB>ws;?)T`j{rr_%u<m}<-7vkvT>Ejs^3APjzgbWI9o*{l9Yu)^V z6dV--9D_nUokM*bgA@Wng97}6T@^sSga?3&o`R>Jf}g*FYnZEFh(fT3qmK{RT99E# zKKBpza}5G{1;xuwt_nV$j!r(V3Sis(A{AUbgIt|MK)!>qK=q2JpR=cnt6zwtkB&lc zfUC17h~XOH>KowW7!;`kH8<EbFx1sA#M9A7!Nt+n(cLvzK?5a}6tIO+K#;$4XppNf z$oc+m3c;aH!6BX@p&_mc?*9HR;NTB-4GQygb`7>x@bM202E`l$11JzfgI#qLTpU9j z!7d00@^|wL3AP5g#wj$|6C8@3ej%<wL7@R5p8kHC3LgI9u3@f03eJw9!LBawKv(eh zQvk(yh=;3xP$bA?P^f?-Mn@ss!!^XiH3$^U;IMN91y68Dkf$>!uA%V<b^s{I85BbN zgF=w}t>EYC?&In1>gVhVa+p8JtZ>g@S4{=SAkSb=KX;J9Aj`uYBNhBZLqN8J5-rFu zh0tJE2p=hh>wu$L!P8B_(Iw0i<PCo}aEu4|2M2pXlM^@~ojpMH1|%v#Rfv|p0vCh6 zmV#qwh`)lntDi!EkE>&_tAdL^IN|#GyLh@qDtLw{fE9*1dpHIuxIvprp1FzXsS44t z3bqQ>3S11e3f5c<1{Dmd21XSOI-r41P@8)ckA}c#2#kgRtwI1ad=4@jMuXU({yAu3 z1~k{I(#paCnrmGHoy+TKWa0Sw?|;5Z6AK4uUbLi{g#$F->(a!+0V-d2LFZLL`b9y8 zLFa$JtY_f>_5V8<7#KhuanRhYI0FO2oE8=i5PM1s3kPUe6Ep-2nl}g0|Nj5a4{2fH z`2YWZKFCcU{{PR{Yk|x!L5(Jw0?nDj6lb-va8$LjaCEh@aLj6D;aJtm!m+EBh2vB! z3&*Wi7LHe~EF8aDSva`bSU9BGSU9xWSU9ZOSU9}eSU95ESU9rU5N>dHcD7Q`2u&)@ zD=Ael(KFFA)-@>w^Gr1%d<M`M4#?}E=|GSZK+`-IK>h=97#J8p!2ppz!OXz$go%Lx zJSz#3J;Dr{eFU*s7z05w)aFbK4A!7!2JI{yEE6EkU;<lk88j8f%)$;DI%H<#n9Rt) zz|6${1Qh%%?Dimvk!>nikaZzwevySWGp~e!nS(VJB*(#S1)Atw31V9$f|wvnnR{D7 z0xYaaAd!n8-F^9>333*8HWqf4MIcE=wmFOp3`}MqGYz*eFfec!F)}brVbLvNVqo9| z&3~~9Fh+s&D>HC{e9bD#2$~dSQfA=<O@gzELAe~9w?XSE#GzasPERHV2383uSAY|= z+JRLP$`#?11Syt+awRx*LC%tfa%DK%L0lOqSAp|8h${!>s&J}<OqPdoH8@{_j8cGd zbvUa)TqVX$ObiT6$_AXERLrWvxC6{J;migZr3Uqp1t&L1u@;nT!?_70tHTJIU1w5u z;G7KN8Zd&UOPQ2iI5&e78#02%_?eX5I6?CdtVWFcz$UwMvVvsI7|(&Z9-N@5JXU+g z9&ph4aDD^HdN9rcb3-`)g1DYgZUiR_$VXmKZVV?ki0cjICU6RYxIT=kV7)1v!XUkV zP&a3AN`hnq7_Wfs&0*kD2T5<?ILg4lz{9!=6b#&_K|;GhOeSRp?t36#?STXc3wJ3< z?f@i)IT+Yks+kxV*jYd+fd`a8K;Ge<4oXc7>@1)(0Tu<Na<Hg610SOc69WUI0@yvE zya7ws^OzYJ`0c@RVACfu@GF6NAPJ@t8G(JE9HF!Xlt)TT1ezHc7#N{E1A)~bp7JVY z1_tJmJsbjuKwK3Nm#M@?U_MBrDmWFE=m>O!<kTQM4Z%zXMs=`tB`Si+42&9}SsSJj zYf#z5AefxYz*x5%Y@sE{mmp2-ETCKi_7zA*806Rg%nTwR&x5@PGG35Tl~0(PnNONe zkWq+HfQ^BHNsNJ+&x+fc+f$f<fmwxto7;|?nU8^i1<K@LU|@wX85r338MwI_7}!A+ zNI8cvBQqa2H%K?5FarZ8FT^NTPhkr#1_mye$qWqKP#JEB3=botr!YtduOfq|us$~f z1D_tFJrBek>O7vpAjdhdfmHCbLd@j$6lUULU=T1t;R>2CFmr&chsX+XGlsG;FbIQ9 z1uaeh*~7rVkPa#t7^Z+ioAEavF9RcF)fFf}^h=A2z-x-qlauu`O)ShHD~oi~^Gfx> z#VBlKkpZj{+R@cd$}A~H5n*6R%FHv$&`SoTu;P-Gl+-l64A5$-lFEYAV!aH|(hbn+ zl6<`k&>F3r%%n^xlYxPi36$KJ6&N}6UbS*u=UDgobJ^|%WxE$}q;r&U*mC%AtS#dx zUBJ;&#^Jq?NmUq(M8KpllPa765r>nw#32gs%R<y34Ck=ruw_ye|H3TziAhy>_ipC= zT^#GmIBZ*(RE0TCg5-oF<Cw%57#TtJ?f?J(|1&Z$)^PB!uyim&>RC{*fP4w6a2)wK zoLZT9S>xmL)6(Kgz)NC4gS7DlB}EMJ$r+%vFvXcwsUWH1jQpaKq|!97qNLKa_@u<* zREC`VymSRHQJPnrnVy%Lq5!Hz-2FlooT0THSQboxWa2^Nzj^s!Q@~cG=A|&ir{yH3 z7lXw>CWD2NON-)@^K(jb^B6$G%M}$VnMDlo@r9*{DIn+M=cIrf4O;M%nFlfxtUEWc zC_A+X%mfc8Lp)LpayHog3Mj4wFEmOlONDqPJ|{mp8|oAzhWOn46v!GOh(TaCdHRDD zf$aD6k9YI*ab?gi%Fi#+H!?6Zh&M2dH?oKa4XT?N#QT7j#l;7QIL4P5=^5)8=o!R2 z<`iTk#+MoCm*nT?6f?vZ<QFr<LtI?UkY8E?_C<0=W&y}kaEB&mBo;A191jY=%)B(v z*eOGNSxI72PAV)6K-wYVd8rj84B!YgGl4o39M0hAg8LZko%n*p6hnr15M>0Rj3JZ> zgfeA_FU<q3!7^e<EJ`l}2WwJda&~C}B*b7DEwLy)8PY@nnGXpsuyvrc25P4<F_f@? zXwduw6GI6Hhz6xUCWcZ_0|2Cqp_`q7VKqAg!xwf2hAnVW1_lPb;>z5T#3Tm2;*uf= zodIKI=9Q!t6)@=K<(H)DIXZdjmL#S_dFgqjdP$|3IVrlCDGYibUPfYZ27_KoWnOV* zE`%;Ag2;eIdo%O%P&n~L40=VWIUw~AMnO&qgI;D{W(k8{2`Gs5(lYZh8T5+sQxZ!O z8T3*!;?s%}b5j}gl1uW7iW&4$AXHXz5!kZC+{|PKz4ZJNFrf!F4WcutxR^l?G?9{; zSHhr|lA2VS9-mm0n3tXkG6l>nC`|%IE}Wm4mzED#nv_(OS_b3gWag#9*iiRCOe_X@ z7Q)QQPlhRhS_6&%A_!?v!3}CNfY!Ex*0nN1*0jR3g5ns&2DM{AYbZgDSkT&2&^lD) z@e9!WBS@Vg0|Nt0T}C4dM+PGU19-L(B#E@f6Er^z>RW)!1NAq07#SF5FhJMBLe+uH z1T}TP{r{g2QU~gfs4y{r7iog}BOoI|YCzZz+9v_21NBot?F|D)h+9B@0I30$pJAZ( zEY!cCeoYB80|Tf(12PMQL25yC90LPr$rspOP=7>^g@Hj0$$cPuKp50i1odG+Y*0TY zgoS|tv;qPY1|YLQ_JYg<wH86^Q9<fJ{h%o<3=E(wf$R?uznOu70j3VrZ<@oxzyRt` zfz*NeXdv@I>Of6Kkoh2SQ2$MZm4N}&I{?`Q!XR}Z8q`RJsS9ak;Rs=6U{C-FfFzN^ zc@i`ofXoA}k#1mPV9)_|_MqxOVFzM@;s~T2qz=?yTqD2$?)-q{Kp1B4Jg9jf|DKq@ z!f`@?f#Dv=V<1IPdqGUlT1k+3AayHdv2d)Af_0%lvIsV44JAk&sGI@Kq=MElgTeu# z3ZZU0)LxJ}(84$oc}O^;s{^+yp=klM08U08VFpMo%pZrLaSk#M)V~C+&j$5UK=BJx z2Xe<5Bzr;YJU?JD4`k*=Bz2(v@)vmq2G9aUkXaxMQUk)bkkq+sVBv64!0wL+pxzkN zAE1?gJ~-4pg_;LTBOrC4JPooFgh62o!tbE!Kw==AuK>w!AT|ht)PU%}XzKbE7#Kih z2}llvVd{864MC6q6t7ZXU;uT2p<GZa4$K5~^<a8H0!1ne44@tzhz-IpIZ($1#s-OJ zsxmNSBMHEm#%T6lQDb1x0cn6@P#A-lpf&g)J+N?LP-kF>03}9{B-D=}d2clHA~aFW z1E~RN2}4uYqRGGjT44v017Vmt(0B+aO@YKfc#b9mLkdh1YA;9}B!uJ~1_?t3h6Ywh zSp-@S4)O;mZ-TNGvUxMi7#RK{X#|-AG7lRD?PUOoLv~0oFo4Q;2p?hqs2qpzAvS=@ zYX~1?I|Bo#T!!#LB{~BGsQiWSL8Sx(1E`#Z@FBSdRGvckpq#_N04g^je2^~~7(nGC zgbyizK;<BW4_VC*D(@hC(C8Hd1E^es@IfUc0|Ti1g785r{uvlR<rIVu*=+zSk05+d z$T2X0${h$F6f2PZ84y0WN5}vwM<9IAs1*YPsJwviL8Dxd{TdKHXdD5u&KtrP15pg1 zd=6qTgNK0_7(n?M!iS^`P`-umB|#J%Gc$lz*u%LD%qTewv>ydDDugT#TEd3RmqT#C zWrRE$AGrnxnWu;*uY|@|hUZt11PjB*|DYHEmB%1HBZCmw#jx;VWDsTmEvJHo7bAlR zgDC?8!v^Ts8WRH_gEs>M1IYiN^vTE|$pGq>gVr^JQWl7x0a{Dn4jlwz;KQ)L1SAh# zj}EdQw1)x~pNtHG4E+p<_yXBKn}LC$0XC?{z{ju=<Zvhk`DZ6+PYldFCUJ)Ipb-)% zpMgn;0aV_?{0riL2F*!B<r$eo8U8RJ;#Yw|f&sM7A8I^!4~PWFqfh}*>e6OpU;wQT z2jv_g20rk>A1wWX_)bXbL9rEx#!qErU;w3OP<Vm%VB{dlgUqjEM5KQq27ZPXH2G<0 ze9-U})Old{9%n?|<8h4<;XeTe35LgL`oE&_*_ap@JU~m@L3??aBp8GtMGDvoko%OG z7#KjS+(80@Ou`HXp!VGa77kE40QuhmO??m=KZOaBen9#K7(V_lK$Gu5<IhFouV-Rl z2!Xl}q<;&V{1G(sPov4-W@2Edf~F@SCO(EwObiULzBtJJ-<cQ~VC9t%0}lg3a#2Zf zNoiV|9%z?}bBKRXypLyaNPIj)e7p+^&&wG}DkVQYJtsdYF()3}35icEtzZBxUdc%< zNlno+H!w0}07=AWrc{7<#th(|LVQYTZf+$*d_345S3ei9HEuzUzOL~w9>^LP8(|B$ z#{;$n)+3B}_wjdf^ojR(a|?D2i4Orye}fzi>OaLN78NB{#zT6bNCM!EKn(FNk$#T8 zp3V%Q&Jko!4rDKng9B_=jsa{p5V8<-6Hjt+X*{@N2GxqT$td2dEIueT9kh0%$T<hJ zdZ(BnKCK`=qa3<92*pUSL6BWVDB|e*g-|3t{o_HqiqOSCLr%~QP4V%_egp4NLZ~)` zY;i&sh>uSx&X3PX%uC5h1@Cl1NE*Nr0xVL%JDEU%018+J$fhY|<&eEk$RhFaNyWwR z&?+uTMA}z{P-g;;gk*$(0d!LpvIsa%3rb6hQ3XN11@GcQ5suF^voO<3Pc4ZrNRBVb QD9y{(OR9j5B7hwa033bkEC2ui literal 0 HcmV?d00001 diff --git a/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/bin2h.c b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/bin2h.c new file mode 100644 index 000000000..4a921ed65 --- /dev/null +++ b/le-pregao-712010/pacote/usr/src/lepregao712010-2.3.0.0-Alpha-v2/tools/bin2h.c @@ -0,0 +1,151 @@ +/* + ************************************************************************* + * Ralink Tech Inc. + * 5F., No.36, Taiyuan St., Jhubei City, + * Hsinchu County 302, + * Taiwan, R.O.C. + * + * (c) Copyright 2002-2010, Ralink Technology, Inc. + * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * * + ************************************************************************* + */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +int main(int argc ,char *argv[]) +{ + FILE *infile, *outfile; + char infname[1024]; + char outfname[1024]; + char *rt28xxdir; + char *chipset; + int i=0;//,n=0; + unsigned char c; + + memset(infname,0,1024); + memset(outfname,0,1024); + + rt28xxdir = (char *)getenv("RT28xx_DIR"); + chipset = (char *)getenv("CHIPSET"); + if(!rt28xxdir) + { + printf("Environment value \"RT28xx_DIR\" not export \n"); + return -1; + } + if(!chipset) + { + printf("Environment value \"CHIPSET\" not export \n"); + return -1; + } + strcat(infname,rt28xxdir); + strcat(infname,"/common/rt2860.bin"); + + strcat(outfname,rt28xxdir); + strcat(outfname,"/include/firmware.h"); + + infile = fopen(infname,"r"); + if (infile == (FILE *) NULL) + { + printf("Can't read file %s \n",infname); + return -1; + } + outfile = fopen(outfname,"w"); + + if (outfile == (FILE *) NULL) + { + printf("Can't open write file %s \n",outfname); + return -1; + } + + fputs("/*\n",outfile); + fputs(" Copyright (c) 2007, Ralink Technology Corporation \n",outfile); + fputs(" All rights reserved. \n\n",outfile); + + fputs(" Redistribution. Redistribution and use in binary form, without \n",outfile); + fputs(" modification, are permitted provided that the following conditions are \n",outfile); + fputs(" met: \n\n",outfile); + + fputs(" \t* Redistributions must reproduce the above copyright notice and the \n",outfile); + fputs(" \tfollowing disclaimer in the documentation and/or other materials \n",outfile); + fputs(" \tprovided with the distribution. \n",outfile); + fputs(" \t* Neither the name of Ralink Technology Corporation nor the names of its \n",outfile); + fputs(" \tsuppliers may be used to endorse or promote products derived from this \n",outfile); + fputs(" \tsoftware without specific prior written permission. \n",outfile); + fputs(" \t* No reverse engineering, decompilation, or disassembly of this software \n",outfile); + fputs(" \tis permitted. \n\n",outfile); + + fputs(" Limited patent license. Ralink Technology Corporation grants a world-wide, \n",outfile); + fputs(" royalty-free, non-exclusive license under patents it now or hereafter \n",outfile); + fputs(" owns or controls to make, have made, use, import, offer to sell and \n",outfile); + fputs(" sell (\"Utilize\") this software, but solely to the extent that any \n",outfile); + fputs(" such patent is necessary to Utilize the software alone, or in \n",outfile); + fputs(" combination with an operating system licensed under an approved Open \n",outfile); + fputs(" Source license as listed by the Open Source Initiative at \n",outfile); + fputs(" http://opensource.org/licenses. The patent license shall not apply to \n",outfile); + fputs(" any other combinations which include this software. No hardware per \n",outfile); + fputs(" se is licensed hereunder. \n\n",outfile); + + fputs(" DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND \n",outfile); + fputs(" CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, \n",outfile); + fputs(" BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND \n",outfile); + fputs(" FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE \n",outfile); + fputs(" COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, \n",outfile); + fputs(" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n",outfile); + fputs(" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS \n",outfile); + fputs(" OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND \n",outfile); + fputs(" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR \n",outfile); + fputs(" TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE \n",outfile); + fputs(" USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH \n",outfile); + fputs(" DAMAGE. \n",outfile); + fputs("*/ \n",outfile); + + fputs("/* AUTO GEN PLEASE DO NOT MODIFY IT */ \n",outfile); + fputs("/* AUTO GEN PLEASE DO NOT MODIFY IT */ \n",outfile); + fputs("\n",outfile); + fputs("\n",outfile); + fputs("UCHAR FirmwareImage [] = { \n",outfile); + while(1) + { + char cc[2]; + + c = getc(infile); + + if (feof(infile)) + break; + + memset(cc,0,2); + + if (i>=16) + { + fputs("\n", outfile); + i = 0; + } + fputs("0x", outfile); + sprintf(cc,"%02x",c); + fputs(cc, outfile); + fputs(", ", outfile); + i++; + } + + fputs("} ;\n", outfile); + fclose(infile); + fclose(outfile); + exit(0); +} -- GitLab